Как предотвратить так много случаев запуска apt-check?

18

У меня есть сервер Ubuntu 12.04, который только что вышел из строя по очень очевидной причине: более 30 apt-checkпроцессов, занимающих всю память, включается убийца OOM, убивая жизненно важные службы. Я не уверен, откуда apt-checkберутся процессы, но я предполагаю, что мои плагины Nagios / Icinga check_aptмогли бы использовать его, а также byobuстрока состояния может захотеть отобразить его вывод. Я предполагаю, что что-то заблокировано, и все процессы просто ждали, но держали память.

Как я могу предотвратить создание такого количества экземпляров apt-checkв системе? Это не имеет смысла для меня, и он должен просто выйти, как только он не может получить блокировку чтения в базе данных dpkg.

Кажется, я не единственный, у кого здесь проблемы. Все предложения apt-checkдовольно негативны:

введите описание изображения здесь

(чистый браузер, не авторизован, нет персонального поиска)

gertvdijk
источник

Ответы:

8

Некоторые из них apt-checkдали мне понять, что это очень тупой сценарий, который нужно исправить. При всем моем уважении к авторам, он не работает на моих серверах. Вот мои мысли:

  • apt-check == /usr/lib/update-notifier/apt_check.py
  • заставляет nicelevel 19 для себя
  • таймауты для действий не установлены

Сочетание последних двух позволяет ему бесконечно накапливаться по спирали вниз. Если система используется для каких-то других целей с более высоким приоритетом, количество процессов просто возрастет, и этому нет конца, так как apt-checkон никогда не получит никакого приоритета над ней. Проблемы только усугубятся, когда убийца OOM решит убить ваши жизненно важные системные процессы.

Если бы любой из этих двух аспектов в поведении отличался, это не позволило бы системе оказаться в таком нарушенном состоянии, как я полагаю.

Хотя строки верны в том, что родительские процессы также несут за это ответственность, я полагаю, что нижеуказанные пункты являются недостатками apt-checkи должны быть указаны как ошибка для правильного решения:

  • это должно быть намек на убийцу ООМ, чтобы убить себя первым
  • он не должен устанавливать красивый уровень
  • он должен выйти, если для получения фрагментов информации требуется неоправданно много времени

На самом деле, похоже, что Linux OOM Killer делает некоторую эвристику по этому поводу. Замкнутые процессы получат повышенную оценку, а длительные процессы уменьшатся. ( источник - спасибо Ульриху Дангелю за указание на это )

Возможное решение, которое я могу предложить:

  • кешировать результаты после обработки
  • выходной кеш, если количество секунд меньше N без загрузки всех библиотек Python-APT для каждого простого (четного --help) вызова.
  • сделать настраиваемый красивый уровень - позвольте мне изменить / отключить это, пожалуйста! Я считаю, что установка его на 0 на самом деле поможет
  • это увеличить счет убийцы ООМ
gertvdijk
источник
Я думаю, что вы пропустили самое важное, что нужно сделать: использовать файл блокировки и не позволять запускать более одного экземпляра одновременно.
Дероберт
@derobert Это скрипт, который может запускать любой пользователь без особых привилегий в Ubuntu, а не демон. Или я могу безопасно использовать /var/run/ /tmpдля этого доступного для записи / записи файла блокировки? Большая дыра: добавьте файл блокировки, и администратор не будет уведомлен об обновлениях системы!
gertvdijk
Все, что запускается автоматически (в результате запускается более 30 копий), должно блокировать. Или он может сделать это сам, для каждого пользователя. В любом случае, это ошибка, которую нужно устранить.
Дероберт
Кажется, Нагиос / Исинга избегает ловушки. По крайней мере, у него был тайм-аут около 10 секунд, и он предупреждал, если он превышен. (Хотя я не могу найти, как настроить время ожидания - я бы предпочел больше). Byobu на Debian - это то, что вызвало проблему для меня; в Ubuntu это должно быть исправлено .
sourcejedi
4

Вам необходимо выяснить, какой процесс порождает apt-check. Вы можете использовать что-то вроде ps, чтобы получить дерево процессов.

ps -A --forest

Если у apt-check нет родителей, то это может быть проблема с apt-check как таковой, а не одной конкретной программой. если это так, я бы попытался отладить apt-check.

строки
источник
Благодарю. Дали мне несколько идей, чтобы заглянуть дальше. Тем не менее, это заставило меня поверить, что это apt-checkдействительно проблема - см. Мой собственный ответ .
gertvdijk
Если он потребляет память и процессорное время, это не зомби.
Жиль "ТАК - перестань быть злым"
@ Жиль хороший момент.
струнные
0

Письменная база по Ubuntu 12.04

У меня та же проблема, и я обнаружил, что из-за того byobu, что если я просто запустил apt-get updateбез использования byobu, не будет никакого check-aptпроцесса. Кроме того , оно относится к update-notifierпакету, когда я удалил эти пакеты (обновление-notifer-Коммон, обновление-уведомитель), используя byobuи бежать apt-get update, он побежал другую команду , но совершенно та же память с помощью: apt-get -s -o Debug::NoLocking=true upgrade.

Некоторые другие вещи могут работать apt-get update(но, вероятно, не работают check-apt)

  • передача аргумента для check_aptобновления / обновления pkg.
  • если настроено, /etc/cron.daily/aptможет также обновить список пакетов (см. https://help.ubuntu.com/lts/serverguide/automatic-updates.html ), но он запускается один раз в день и не должен вызывать проблем.

На рабочем столе может быть больше вещей.

Заключение: byobuловит событие, когда вы запускаете apt-get updateи запускаете эти check-aptпроцессы, переконфигурируйте строку состояния byobuили исправьте это.

HVNSweeting
источник