如何防止大量 apt-check 运行实例?

ger*_*ijk 18 apt memory-usage

我有一个 Ubuntu 12.04 服务器,由于一个非常明显的原因而崩溃:30 多个apt-check进程消耗了所有内存,OOM 杀手启动,杀死了重要服务。我不确定apt-check进程来自哪里,但我猜我的 Nagios/Icinga 插件check_apt可能会使用它,并且byobu状态行可能想要显示其输出。我猜有什么东西被锁住了,所有的进程都在等待,但保留着内存。

我怎样才能防止系统上有这么多实例apt-check?这对我来说没有意义,它应该在无法获得 dpkg 数据库的读取锁定时立即退出。

似乎我不是唯一在这里遇到麻烦的人。的所有建议apt-check都非常消极:

在此处输入图片说明

(干净的浏览器,未登录,无个性化搜索)

ger*_*ijk 8

一些深入研究apt-check给了我这些线索,因为它是一个需要修复的非常生硬的脚本。恕我直言,它的作者在我的服务器上失败了。以下是我的想法:

  • apt-check == /usr/lib/update-notifier/apt_check.py
  • 为自己强制使用 nicelevel 19
  • 没有对动作设置超时

后两者的结合使其能够以螺旋式向下无休止地堆积。如果系统用于其他具有更高优先级的目的,进程数量只会增加并且没有止境,因为apt-check永远不会获得任何优先级。一旦 OOM 杀手决定杀死您的重要系统进程,麻烦只会变得更糟。

如果这两个方面的行为中的任何一个不同,那么我的假设是不会让系统最终处于如此破碎的状态。

虽然字符串对于父进程也负责,但我相信以下几点是缺陷,apt-check必须报告为错误才能得到正确解决:

  • 它应该暗示 OOM 杀手先杀死自己
  • 它不应该设置 nicelevel 硬编码
  • 如果获取信息的时间过长,它应该退出

实际上,Linux OOM 杀手似乎正在对此进行一些启发。Niced 流程将获得更高的分数,而长时间运行的流程将减少。(来源-由于乌尔里希Dangel它指向了

我可能提出的可能解决方案:

  • 处理后缓存结果
  • 输出缓存,如果少于 N 秒,而不为每个简单(偶数--help)调用加载所有 Python-APT 库。
  • 使 nicelevel 可配置 - 请允许我更改/禁用它!我相信将其设置为 0 实际上会有所帮助
  • 让它增加OOM杀手分数