在 2.6.31-302 x86-64 内核上运行 Ubuntu。总体问题是我在“缓存”类别中的内存不断增加,即使我们的应用程序需要它也不会被释放或使用。
所以这就是我从“免费”命令中得到的。乍一看,这些都没有异常。
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
有人会说的第一件事是“别担心,Linux 会自动管理该内存。” 是的,我知道内存管理器应该如何工作;问题是它没有做正确的事情。此处“缓存”的 1.4 GB 似乎已保留且无法使用。
我对 Linux 的了解告诉我 3 GB 是“免费的”;但系统的行为则不然。当 1.6 GB 的实际空闲内存在使用高峰期用完时,一旦需要更多内存(并且第一列中的“空闲”接近 0),就会调用 OOM 杀手,进程被杀死,并且问题开始出现即使-/+ 缓冲区/缓存行中的“空闲”仍然有大约 1.4 GB 的“空闲”。
我已经调整了关键进程的 oom_adj 值,所以它不会使系统陷入困境,但即使如此,重要的进程也会被杀死,我们永远不想达到那个点。特别是当理论上 1.4GB 仍然是“免费的”时,如果它只会驱逐磁盘缓存。
有谁知道这里发生了什么?互联网上充斥着关于 Linux 'free' 命令和“为什么我没有任何可用内存”的愚蠢问题,因此我找不到关于这个问题的任何信息。
我脑海中浮现的第一件事是交换已关闭。我们有一个坚定不移的系统管理员;如果他们得到支持,我愿意接受解释。这会导致问题吗?
运行后这里是免费的echo 3 > /proc/sys/vm/drop_caches:
# free
total used free shared buffers cached
Mem: 7358492 5731688 …Run Code Online (Sandbox Code Playgroud)