我运行了一项超出内存的作业,并开始写入交换区。交换空间为 25 GB,RAM 为 1TB。
当交换区已满直到 11GB 时,我已经停止了工作,所以其中 50% 仍然是空的。
它没有触发任何 OOM 终止作业,因此一切都像发生之前一样正常。
我现在只使用了 8GB 交换空间(在我停止工作后清理了 3GB),并且它正在慢慢减少。但是当我检查时vmstat
, 和si
都是so
,0
所以没有任何东西进出交换?这怎么可能?
free -lm
total used free shared buff/cache available
Mem: 1031757 475637 49100 63 507019 553720
Low: 1031757 982657 49100
High: 0 0 0
Swap: 25767 8272 17495
我有一个可用空间40GB
in ,那么我是否应该期望我正在运行的作业不会现在而是稍后RAM
被杀死?使用的空间比可用空间小,所以看起来不错,但我不确定是否仍然告诉它不会被触发。OOM
8GB
swap
40GB
RAM
OOM
几个月前,当OOM
触发时,它杀死了我所有的工作,并且使用的交换空间25GB
(全部已满),然后 10 分钟后0GB
。然而,在这种情况下,需要一天的时间来清理2-3 GB
,swap.
这对我正在运行的作业来说是坏消息吗?
您是否认为我正在运行的作业有被杀死的危险,不是现在,而是稍后,当可用交换空间达到时,0 GB
它会触发OOM
杀死?如果是这样的话,我该如何防止这种情况发生呢?
我将不胜感激任何帮助。
答案1
vmstat
不带参数显示重启后的平均值。由于换入/换出显示为块/秒,如果您有合理的正常运行时间,那么这些显示 0 并不奇怪。
现在交换中的内存都是正在使用的内存,但由于进程的内存过载而被换出后就不再使用了。这实际上是一件好事,因为许多进程具有仅在启动期间使用的内存。将其换出意味着您有更多可用 RAM 可用于进程和缓冲区/缓存。
原因是在前面的情况下,当你做过发生 OOM,之后所有交换空间在事件发生后不久再次释放,可能是因为导致 OOM 的进程已使用所有空间,并且在停止后所有交换空间再次释放。
唯一发生 OOM 的情况是没有可用的交换空间,并且没有可用的 RAM(考虑到缓冲区/缓存,即命令的“可用”列free
)。
对于其余的事情,您通常可以相信 Linux 的内存管理会做正确的事情。仅当您由于正在运行的负载/应用程序的类型而确实有特殊要求时,才有必要开始调整内存管理。