Thanks Mark. I don't quite understand everything you said though.
"Because of your 'allocate max shared memory' and 'dynamic allocation on demand' settings I wouldn't be surprised if you have a lot of entries in the 'ipcs -a' output, ie, shared memory is fragmented."
I have 'allocate max shared memory' as 0, which as I understand it means that it'll allocate my entire 'total logical memory' (which is and has always been 13GB) at startup. This seemed to be confirmed by ipcs, which showed a big fragment of 13GB and then 1-2 additional small fragments. (Unfortunately I have rebooted the server since yesterday and I didn't record the exact details.)
"If possible you may want to consider setting 'allocate max shared memory = 1' and then bouncing the dataserver; this should reduce the number of fragments"
My 'max memory' was set to 15GB. So as I understand it, your suggestion would cause it to
allocate 15GB at startup. This seems like it's going the wrong direction. That would cause me to alloocate MORE memory than I would otherwise. And furthermore, since that's 2GB more than my 'total logical memory', I will be wasting 2GB. I don't understand how any of that would be a good thing.
"If you continue to have memory problems you may want to dial back 'max memory' some (eg, reduce by 1GB) and bounce the dataserver again."
That's what I did. I dialed it back by 2GB. So now my 'max memory' and 'total logical memory' are nearly the same, namely 13GB. At this point, now 'top' shows the dataserver using 13GB, which seems logical. What I still don't understand is how, prior to the reboot, 'top' showed usage of 15GB when my 'total logical memory' was only 13GB.