.. _earlyoom: ================= earlyoom OOM服务 ================= oom-killer对于Linux用户来说是"臭名昭著"的最坏情况,当Linux内存耗尽被迫调用oom-killer,将会导致系统存在潜在的不稳定。在调用oom-killer之前,Linux会尝试清理内存页缓存会清空所有buffer,但是这种危急情况下系统会进入呆滞状态,响应非常缓慢。 .. note:: 有关oom-killer的讨论: - `Why are low memory conditions handled so badly? `_ - `Is it possible to make the OOM killer intervent earlier? `_ .. note:: 在 Fedora 32 版本中,开始默认激活 EarlyOOM 功能,这代表着主流社区尝试解决OOM的努力,也表明EarlyOOM稳定可靠性得到认可。 earlyoom工作原理 ================== `earlyoom - The Early OOM Daemon `_ 是帮助我们管理Linux OOM的服务。 当系统内存不足时,earlyoom会检查可用内存并清理swap,最高频度可以达到每秒10次。默认设置当内存和swap同时低于10%时候,earlyoom将杀掉占用内存最大当进程( ``oom_score`` 最大的 )。这个百分比值可以通过命令行参数调整。 安装 ========= - CentOS 8环境需要先 :ref:`init_centos` ,并且 :ref:`install_golang` (make test使用go) .. note:: 如果要生成man,则还需要安装 pandoc - 编译:: git clone https://github.com/rfjakob/earlyoom.git cd earlyoom make - 集成测试:: make test - 安装:: sudo make install .. note:: 对于Debian 10+ 和 Ubuntu 18.04+ ,则可以通过发行版仓库直接安装,更为简便:: sudo apt install earlyoom sudo systemctl enable earlyoom sudo systemctl start earlyoom - 也可以通过EPEL安装:: sudo dnf install epel-release sudo dnf install earlyoom sudo systemctl enable --now earlyoom 使用 ========= 如果是通过源代码编译安装,则直接启动就可以:: ./earlyoom 会提示使用的内存和swap状态。 如果是通过systemd服务安装,则使用:: systemctl status earlyoom 可以看到当前输出的信息:: Mar 13 17:27:44 centos8 systemd[1]: Started Early OOM Daemon. Mar 13 17:27:44 centos8 earlyoom[73837]: earlyoom 1.3 Mar 13 17:27:44 centos8 earlyoom[73837]: mem total: 1806 MiB, swap total: 2047 MiB Mar 13 17:27:44 centos8 earlyoom[73837]: sending SIGTERM when mem <= 10 % and swap <= 10 %, Mar 13 17:27:44 centos8 earlyoom[73837]: SIGKILL when mem <= 5 % and swap <= 5 % Mar 13 17:27:44 centos8 earlyoom[73837]: mem avail: 1237 of 1806 MiB (68 %), swap free: 2039 of 2047 MiB (99 %) Mar 13 17:28:44 centos8 earlyoom[73837]: mem avail: 1239 of 1806 MiB (68 %), swap free: 2039 of 2047 MiB (99 %) Mar 13 17:29:44 centos8 earlyoom[73837]: mem avail: 1239 of 1806 MiB (68 %), swap free: 2039 of 2047 MiB (99 %) Mar 13 17:30:44 centos8 earlyoom[73837]: mem avail: 1238 of 1806 MiB (68 %), swap free: 2039 of 2047 MiB (99 %) 最后10行信息是每分钟的系统当前内存使用情况。 通知 ======== 命令行参数 ``-n`` 可以通过 ``notify-send`` 发送 待实践... 优先进程 ========= 命令行参数 ``--prefer`` 可以设置优先 ``杀掉`` 的进程;相反, ``--avoid`` 则指定避免杀掉的进程。而且,可以使用正则表达式:: earlyoom --avoid '^(foo|bar)$' 配置文件 =========== 对于通过系统服务运行的earlyoom,则可以通过修改 ``/etc/default/earlyoom`` 来配置,例如:: EARLYOOM_ARGS="-m 5 -r 60 --avoid '(^|/)(init|Xorg|ssh)$' --prefer '(^|/)(java|chromium)$'" 修改配置之后,通过重启服务来修正:: systemctl restart earlyoom .. note:: 命令行参数可以通过 ``earlyoom -h`` 查看 参考 ====== - `earlyoom - The Early OOM Daemon `_