我正在管理一个 Debian Linux x86_64 服务器,它有 125GB RAM、10GB 交换分区和 60 的交换值。
输出free -gw
打印:
total used free shared buffers cache available
Mem: 125 20 1 25 0 103 78
Swap: 9 1 7
每天晚上,都会运行一个 cron 作业,该作业对磁盘 R/W 要求非常高,并且在执行期间会使使用的内存增加 2GB,然后再返回到 ~20GB。
在同一时间范围内,某些长时间运行的容器化 Python 进程(尤其是 gunicorn)被分页。
随着时间的推移,这些进程将逐渐填满交换 - 几周后,它将达到 99% 满。
我可以通过重新启动进程或使用 和 禁用并重新启用来清除交换swapoff
。swapon
但 Python 进程的交换使用量将再次缓慢上升。
我猜部分原因可能是,由于夜间 cron 作业,内核将文件系统缓存的优先级设定得比 Python 进程高。但我还猜想,这些 Python 进程的内存处理中存在一些软件错误,这可能是罪魁祸首。
一位朋友建议我购买更多 RAM,以便为文件系统缓存留出更多空间。这对我来说似乎有点过分。我想更准确地诊断交换的原因并找到一些软件解决方案。
所以现在我将问题转交给 Serverfault——您如何看待这种现象,我应该怎么做?
答案1
不,您不需要更多 RAM,也不需要执行swapoff
/ swapon
。这是正常行为,系统会检测一些很少使用的内存页面并将它们移动到交换区,以便可以使用 RAM 执行更有用的事情,例如文件缓存。