We run a web server / database server with Dual PIII 750s and 512 Megs ram. This machine also acts as the LDAP server. All use is internal only, not on the internet, and we average only a few thousand reads a day on the company phonebook. We run lots of other databases, but they are way more bursty in terms of how they get used. I.e. no access for hours, then we deliver 35,000 rows at once to an excel spread sheet five or ten times.
Under load testing, we can handle about 10,000 to 30,000 hits an hour with no real slow down in delivery, so we're way overpowered for what we need. but the Dual PIII was coming back from a customer and we still had a year or two on the lease, so we upgraded from our old box (an AMD K6-300 with 256 Megs ram) which was handling the load just fine. That machine could have handled probably 1,000 to 5,000 hits an hour with good response time.
My testing on the box leads me to believe we are pretty much I/O bound, since I have to use apache bench (ab) at something like 200 simos to generate more than 50% CPU load on both CPUs. We use a pair of 10K RPM 18 Gig Ultra SCSI drives in a RAID1.
I've tried using RAID0, which was no faster, but offers no redundancy, and RAID5 with 4 USCSI drives, but it was no faster than the RAID1. All RAID provided by the Linux Kernel, not hardware. It's a common misnomer that hardware RAID is faster than software, but many hardware RAID cards are actually slower than software RAID under linux. I can read data off our RAID1 SCSI at ~50 Megs a second with bonnie, and at ~28Megs a second off a UDMA-66 RAID1 set.
All our response times are sub second (usually <1/10th of a second).
The most important step is to configure your linux kernel to give postgresql LOTS of memory to play with, and to reconfigure the kernel to have lots more file handles than a stock install.
look up sysctl and sysctl.conf, they are a darned near idiot proof way of tweaking your kernel without editing /etc/rc.d/rc.local.