A couple of points, one is that the linux kernel (if memory serves) is
limited to 2 gig swap partitions, but can have more than one swap. In
fact, it is quite advantageous on a server that winds up swapping, to have
several partitions spread about on all the platters you can, as the kernel
will then interleave swap access across all the drives for maximum
performance.
What are your settings for sort_mem in postgresql?
Note that large values for sortmem can starve your machine for memory very
quickly, but only under load, and only when things need to be sorted.
I assume nothing like file-max or shmmax are the issue either?