完全删除交换或将交换设置为 0?

完全删除交换或将交换设置为 0?

在管理具有 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 的值,您可能会注意到,即使主机内存可用,节点上也只使用了交换内存。

相关内容