snapd, 100% загрузка cpu и баг ядра. *nix.. *nix. cpu.. *nix. cpu. cpu usage.. *nix. cpu. cpu usage. linux.. *nix. cpu. cpu usage. linux. linux kernel.. *nix. cpu. cpu usage. linux. linux kernel. snap.. *nix. cpu. cpu usage. linux. linux kernel. snap. баги.. *nix. cpu. cpu usage. linux. linux kernel. snap. баги. Системное администрирование.. *nix. cpu. cpu usage. linux. linux kernel. snap. баги. Системное администрирование. Системное программирование.

Еще одна поучительная история из жизни с Linux, специально чтобы вы потеряли сон и покой, узнав что такое вообще возможно.

Тот самый баг, смотрит на вас с экрана.
Тот самый баг, смотрит на вас с экрана.

Вводная

Эмм с чего бы такого начать, чтобы вы не испугались раньше времени от прочитанного и не побежали устанавливать *BSD.

Есть на свете одна компания, которой мы помогаем с ИТ и есть у нее несколько виртуальных серверов на Ubuntu Linux, используемых для половых утех разработки и тестования.

Ubuntu там использовалась нормальной (для сервера) LTS‑версии, но в какой‑то момент — в погоне за патчами безопасности ее обновили до текущей.

Не совсем «текущей‑текущей», которую используют сами разработчики Ubuntu для обкатки новых версий дистрибутива, а просто без долгой поддержки — примерно то, что ставят себе обычные пользователи Ubuntu Linux на домашние компьютеры.

Все происходило летом 2025 года, поэтому речь про версию 25.04 Ubuntu Linux, которая использует ядро 6.14 (запомните этот важный момент):

snapd, 100% загрузка cpu и баг ядра - 2

Баг

Однажды сисадмин компании-заказчика заметил слишком частую и сильную нагрузку на CPU, создаваемую процессом snapd, который является частью пакетного менеджера Snap.

Скриншот не мой, поэтому шакальего качества ;)
Скриншот не мой, поэтому шакальего качества ;)

Эта проблема с перегрузкой CPU для snapd мягко говоря не нова — «проклятый snapd» гадил линуксоидам с момента своего появления на свет и вообще видимо был не придуман а ниспослан свыше, в качестве кары за грехи молодости.

Но в этот раз 100% загрузка CPU происходила.. строго по расписанию:

Нет, это не осеннее обострение, дело происходило летом.

Нет, это не осеннее обострение, дело происходило летом.

Разумеется первым делом были опробованы стандартные решения, вроде снижения частоты проверок обновлений или полного отключения сервиса snapd:

snapd, 100% загрузка cpu и баг ядра - 5

Отдельно порадовал ответ ИИ:

snapd, 100% загрузка cpu и баг ядра - 6

Т.е. дословно «снести и использовать что-то другое» — можно сказать первый разумный совет от машины за всю историю развития искусственного интеллекта.

Дальнейшие изыскания привели в багтрекер snapd к упомянутому багу, где уже третий комментарий от разработчика snapd, с приложенной трассировкой вызовов показал что проблема именно в ядре:

snapd, 100% загрузка cpu и баг ядра - 7

Тут стоит добавить, что встал вопрос проверки бага на локальной машине, поскольку на момент изучения вопроса все успело неоднократно обновиться, а отлаживать ядро Linux на сервере заказчика все же не очень хорошая затея.

Чуть ниже по переписке видно что баг особо ярко проявляется на ноутбуке, работающем от батареи:

snapd, 100% загрузка cpu и баг ядра - 8

Так что решено было пробовать отловить именно в таких условиях.

На счастье, на машине осталась сборка 6.14 версии ядра с патчами от Xanmod, которая использовалась для статьи про l9ec.

В последние годы в проекте ядра Linux выпускается сильно много промежуточных релизов, поэтому на какой именно версии внутри 6.14 ветки что-то пошло не так еще пришлось выяснять:

snapd, 100% загрузка cpu и баг ядра - 9

Наконец источник проблем был найден:

snapd, 100% загрузка cpu и баг ядра - 10

Чуть ниже по переписке обнаружился и тестовый код на Cи, демонстрирующий проблему, вот такой:

#include <sys/epoll.h>
#include <sys/time.h>
#include <sys/wait.h>

int main() {
  int e = epoll_create1(0);
  struct epoll_event event = {.events = EPOLLIN};
  epoll_ctl(e, EPOLL_CTL_ADD, 0, &event);
  const struct timespec timeout = {.tv_nsec = 1};
  epoll_pwait2(e, &event, 1, &timeout, 0);
}

А так это выглядит в действии:

Обратите внимание на загрузку CPU и блокировку выхода из приложения

Обратите внимание на загрузку CPU и блокировку выхода из приложения

Вот так в очередной раз проблема прикладного сервиса уперлась в ядро операционной системы.

Патч целиком находится тут, место исправления выглядит как-то так:

snapd, 100% загрузка cpu и баг ядра - 12

Да, как видите ситуацию радикально исправляет буквально пара символов логической конструкции, в который уж раз.

Текущее состояние

Формально проблема была решена еще летом этого года, патч попал в mainline и пакет с обновлением ядра от команды Ubuntu:

snapd, 100% загрузка cpu и баг ядра - 13

На осень 2025 года даже стабильная версия ядра Linux уже имеет версию 6.16 — т. е. паровоз разработки уехал очень далеко вперед от описываемых проблем:

snapd, 100% загрузка cpu и баг ядра - 14

Так что по‑идее, на момент написания данной статьи, вы не должны столкнуться с данной проблемой, а если столкнетесь — все решится банальным обновлением версии ядра из пакетов дистрибутива.

Но если есть подозрение на описанный баг — попробуйте собрать тестовое приложение (см. выше) и запустить в своем окружении.

Если начнется 100% загрузка CPU запущенным процессом — проблема точно есть, поскольку в ядрах с патчем поведение тестового приложения отличается:

В исправленном ядре тестовое приложение немедленно завершится.

В исправленном ядре тестовое приложение немедленно завершится.

Что касается нашей компании‑заказчика, поскольку решение а затем и патч были опубликованы довольно быстро — раньше чем нам вообще сообщили о проблеме, на время разборок с согласованиями попадания в mainline, мы банальным образом перенесли патч вручную в ту версию ядра, которая использовалась на сервере.

Позже обновили уже штатными средствами дистрибутива до текущей актуальной версии.

Эпилог

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

1. Linux – могила, *BSD – сила

Шучу, разумеется неподготовленным пользователям в BSD-системы лучше не лезть совсем, но задуматься (или хотя-бы просто знать) о реалиях функционирования Linux все же стоит. Чтобы факт выноса мозга ядру из прикладного ПО не стал для вас неприятным сюрпризом.

2.Граница между прикладкой и системной разработкой весьма абстрактна

Проще говоря — ее нет совсем и в любой произвольный момент времени у вас есть неиллюзорный шанс наткнуться на баг ядра, даже программируя на JavaScript в браузере.

3.Любой уважающий себя сисадмин и DevOps должны знать Си

Пусть на самом примитивном уровне, но хотя-бы собрать и запустить тестовое приложение, демонстрирующее проблему вы должны уметь.

К сожалению все глубокие изыскания по теме «где оно тормозит» или «почему оно упало» рано или поздно приводят к Си и отладчику ядра.

И поверьте моему печальному опыту: изучать эти вещи лучше днем и в спокойной обстановке, а не в режиме аврала и поздно ночью на работе в выходной день.

4.Считайте деньги, хотя-бы иногда

Описанная в статье проблема случилась в локализованном окружении (на собственных физических серверах компании), но точно такая же Ubuntu используется и облачными провайдерами вроде Amazon, где есть тарификация за использование ресурсов, в первую очередь CPU.

Как нетрудно догадаться, 100% загрузка процессора с интервалом в пять минут в облаке, если ее вовремя не заметить и не исправить — больно отразится на счете, который вам потом выставят.

Так что проверяйте загруженность, поскольку пиковых 100% в современных реалиях быть не должно, если только вы целенаправленно не занимаетесь вычислительными задачами.

P.S.

Более во��ьный оригинал как обычно в нашем блоге, копия статьи — в Яндекс Дзене.

Все контакты в профиле, если вдруг столкнетесь с «нерешаемыми» задачами, связанными с разработкой или отладкой ПО — знаете кому писать;)

Автор: alex0x08

Источник

Rambler's Top100