如何避免接近 OOM 的高延迟情况?

如何避免接近 OOM 的高延迟情况?

Linux 系统没有交换(或sudo swapoff -a在测试之前运行)时的最小测试用例。以普通用户身份运行以下 bash 一行:

while true; do date; nice -20 stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 + 4000;}' < /proc/meminfo)k --vm-keep -m 1 --timeout 10s; sleep 5s; done

并使用高优先级 root shell 运行以下 bash 单行代码(例如sudo nice -n -19 bash):

while true; do NS=$(date '+%N' | sed 's/^0*//'); let "S=998000000 - $NS"; S=$(( S > 0 ? S : 0)); LC_ALL=C sleep "0.$S"; date --iso=ns; done

高优先级进程应该date尽可能准确地每秒运行。但是,即使该进程以优先级运行-19,以优先级运行的后台进程20也可能会导致严重延迟。低优先级后台进程引起的延迟似乎没有限制,因为可以通过增加值来激活更高的延迟stress --timeout

有没有办法限制最大延迟并自动终止stress(如果需要)来实现这一目标?增加/proc/sys/vm/user_reserve_kbytes/proc/sys/vm/admin_reserve_kbytes/proc/sys/vm/min_free_kbytes似乎没有帮助。

答案1

请考虑尝试*内核补丁问题,因为到目前为止,它似乎为我完成了这项工作(避免 oom 附近的高延迟)(甚至使用问题中的代码来测试它),而且我还避免了大量的磁盘抖动(例如,当我编译 firefox 时)这通常会导致操作系统因内存不足而冻结)。
该补丁避免了逐出Active(file)页面,从而将(至少)可执行代码页保留在 RAM 中,这样上下文切换就不会导致kswapd0(?)重新读取它们(这会导致大量磁盘读取和冻结操作系统)。

* 或者甚至提出更好的方法?

答案2

有一些工具旨在避免此特定问题,这些工具的复杂性/可配置性不断增加:

  • 早间,对于台式机/笔记本电脑来说可能足够好了
  • 诺杭,一个更可配置的解决方案
  • 脸书的解决方案奥姆德用于他们自己的服务器。

相关内容