在管理具有 512GB RAM 的服务器时,我遇到了一个进程,该进程不断消耗交换,直到达到交换空间的 100%,然后停止消耗更多(6GB 的交换),但仍然正常工作(尽管当请求进入进程时,需要很长时间(20 分钟以上)才能达到所需的性能)。
即使将 swappiness 设置为 也0
不能阻止该进程交换。
交换发生时free
显示以下内容:
# free -h --giga
total used free shared buff/cache available
Mem: 515G 16G 2.3G 30M 497G 496G
Swap: 5.8G 1.0M 5.8G
所讨论的过程:
# smem -s swap -t -n -k
PID User Command Swap USS PSS RSS
(...)
36776 1000 java -XX:+UseG1GC -Xms1G -X 1.6M 13.4G 13.4G 13.4G
-------------------------------------------------------------------------------
148 11 2.0M 15.1G 15.2G 15.9G
它会随着时间的推移不断增长(速度约为每小时 20 MB),直到消耗掉 100% 的交换空间。值得一提的是,它是在 docker 容器中运行的,但我不知道这是否会影响任何事情。
交换性:
# cat /proc/sys/vm/swappiness
0
我现在真的很想完全禁用交换,但是这答案强烈建议不要这样做。我有什么选择可以让这些程序的内存完全保留在 RAM 中?
答案1
由于您的问题是关于 Docker 容器内部的进程,因此值得检查是否没有缺少vm.overcommit_memory=1
如下所述的配置:节点使用交换内存而不是主机内存
默认情况下,Docker 建议在 Docker 环境中使用 vm.swappiness=0 的值,这样可以防止交换,除非出现 OOM(OutOfMemory)情况。所有节点都必须设置 vm.overcommit_memory=1,这告诉内核始终允许内存分配,直到没有真正的内存。本文解释了当 vm.swappiness 使用 0 以外的值时可能发生的情况。如果 vm.swappiness 设置为高于 0 的值,您可能会注意到,即使主机内存可用,节点上也只使用了交换内存。