复制大文件会导致过多的交换

复制大文件会导致过多的交换

在一台具有 32 GB RAM、3 TB 可用磁盘空间、作为 KVM 虚拟机管理程序运行的中端 CentOS 6.4/64 服务器上,我开始将 200 GB 文件复制到同一本地文件系统中的目标位置。事实上,这个文件是一个KVM虚拟磁盘镜像(对应一个关闭的VM)。其他 12 个虚拟机在同一台机器上正常运行。

我从有足够的空间开始:

[root@myserver]$ free
             total       used       free     shared    buffers     cached
Mem:      32847956   16722708   16125248          0      63756     407740
-/+ buffers/cache:   16251212   16596744
Swap:     16383992          0   16383992

但随着复制的进行,内存使用量开始稳定增长,直到到达交换区。当然,这会减慢一切……副本最终在大约 30 分钟后结束。最后,我的记忆是这样的:

[root@myserver]$ free
             total       used       free     shared    buffers     cached
Mem:      32847956   32643564     204392          0      24392   23213400
-/+ buffers/cache:    9405772   23442184
Swap:     16383992   12057880    4326112

查看哪些进程正在使用交换,我观察到了几个 qemu-kvm 实例。因此,现在服务器的性能正在受到影响,因为许多(如果不是全部)虚拟机现在都在交换。我找不到一种方法可以使交换回到零(否则正常情况),而不必重新启动该生产服务器。

什么会导致这种情况?一个简单的 cp 进程如何消耗这么多内存以及如何避免这种情况?任何意见 ?

谢谢

答案1

将交换空间恢复到 0 并不是一个有用的目标。

没有什么本身交换东西是错误的。程序很有可能加载它实际上并不使用的资源,并且内核会注意到这一点并将它们交换出来,释放内存以供现在实际可以使用它的程序使用。这种情况在当今的现代臃肿软件世界中经常出现,其中的程序非常依赖于其他人提供的庞大库,即使它们只需要库全部功能的一小部分。

您提供的唯一硬性数字(30 分钟内 200 GB)对我来说也看起来相当不错。这是 114 MB/秒,考虑到您是在单个物理卷中复制文件,这是一个令人印象深刻的复制速率。就在不久之前,纯顺序读取速度达到 100 MB/秒还是相当令人印象深刻的。与交错读写相比,您的管理效果更好!

最重要的是,我认为你找错了对象。

答案2

降低 /proc/sys/vm/swappiness 中的值以牺牲文件系统缓存而不是交换程序。

相关内容