复制大文件导致过度交换

Dav*_*rez 5 kvm memory swap cp

在具有 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
Run Code Online (Sandbox Code Playgroud)

但是随着复制的进行,内存使用量开始稳定增长,直到达到交换。当然,现在这会减慢一切……副本最终在大约 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
Run Code Online (Sandbox Code Playgroud)

查看现在正在使用交换的进程,我观察了几个 qemu-kvm 实例。因此,现在服务器的性能受到了影响,因为现在许多虚拟机(如果不是全部)都在进行交换。我没有找到无需重新启动此生产服务器即可将交换恢复为零(否则为正常状态)的方法。

什么会导致这种情况?一个简单的 cp 进程怎么会吃掉那么多内存,又该如何避免呢?任何意见 ?

谢谢

War*_*ung 5

让交换回到 0 不是一个有用的目标。

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

你提供的唯一硬性数字——30 分钟内 200 GB——对我来说也很好。这是 114 兆字节/秒,这是一个令人印象深刻的复制速率,考虑到您正在单个物理卷中复制文件。不久前,纯顺序读取的 100 MByte/sec 令人印象深刻。您的管理比交错读取和写入要好!

最重要的是,我认为你在吠错树。


psu*_*usi 1

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