On a mid-class CentOS 6.4/64 server with 32 GB RAM, 3 TB free disk space, operating as KVM hypervisor, I start copying a 200 GB file to a destination in the same local filesystem. In fact, this file is a KVM virtual disk image (corresponding to a shut down VM). Other 12 VMs are up & working normally on this same machine.
I start with plenty of headroom to go:
[root@myserver]$ free
total used free shared buffers cached
Mem: 32847956 16722708 16125248 0 63756 407740
-/+ buffers/cache: 16251212 16596744
Swap: 16383992 0 16383992
But as the copy progresses, memory usage starts to grow steadily until it hits swap. Of course, this slows down everything now… the copy finally ends after ~30 minutes.
At the end, my memory looks like:
[root@myserver]$ free
total used free shared buffers cached
Mem: 32847956 32643564 204392 0 24392 23213400
-/+ buffers/cache: 9405772 23442184
Swap: 16383992 12057880 4326112
Looking what processes are now using swap, I observe it several of the qemu-kvm instances. So now the performance of the server is suffering, as many if not all the VMs are now swapping.
I don't find a way to get swap back to zero (its otherwise normal condition) without having to bring this production server to a reboot.
What can cause this ?
How can a simple cp process eat that much memory and how can this be avoided ?
Any comments ?
Thanks
Best Answer
Getting swap back to 0 is not a useful goal.
There is nothing ipso facto wrong about having things in swap. It is quite possible for a program to load resources it doesn't actually use, and for the kernel to notice this and swap them out, freeing the memory for use by programs that can actually make use of it right now. This situation comes up a lot in today's modern bloatware world, where programs depend so much on huge libraries others provide, even though they need only a tiny fraction of the library's full capability.
The only hard numbers you have provided — 200 GB in 30 minutes — also looks quite good to me. That's 114 MByte/sec, which is an impressive copy rate, considering that you're copying a file within a single physical volume. It wasn't that long ago that 100 MByte/sec on purely sequential reads was pretty impressive. You're managing better than that with interleaved reads and writes!
Bottom line, I think you're barking up the wrong tree.