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

Вводная
Эмм с чего бы такого начать, чтобы не испугать раньше времени и не заставить устанавливать *BSD.
Есть на свете одна компания, которой мы помогаем с ИТ и есть у нее несколько виртуальных серверов на Ubuntu Linux, используемых для
половых утехразработки и тестирования.
Ubuntu там использовалась нормальной (для сервера) LTS‑версии, но в какой‑то момент — в погоне за патчами безопасности ее обновили до текущей.
Не совсем «текущей-текущей», которую используют разработчики Ubuntu для обкатки новых версий дистрибутива, а просто без долгой поддержки — примерно то, что ставят себе обычные пользователи Ubuntu Linux на домашние компьютеры.
Все происходило летом 2025 года, поэтому речь про версию 25.04 Ubuntu Linux, которая использует ядро 6.14 (запомните этот важный момент):

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

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

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

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

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

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

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

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

Чуть ниже по переписке обнаружился и тестовый код на 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);
}
А так это выглядит в действии:

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

Да, как видите ситуацию радикально исправляет буквально пара символов логической конструкции, в который уж раз.
Текущее состояние
Формально проблема была решена еще летом этого года, патч попал в mainline и пакет с обновлением ядра от команды Ubuntu:

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

Так что «по идее», на момент написания данной статьи вы не должны столкнуться с данной проблемой, а если столкнетесь — все легко решается банальным обновлением версии ядра из пакетов дистрибутива.
При подозрении на описанный баг — попробуйте собрать тестовое приложение (см. выше) и запустить в своем окружении.
Если начнется 100% загрузка CPU запущенным процессом — проблема точно есть, поскольку в ядрах с патчем поведение тестового приложения отличается:

Что касается компании‑заказчика, то поскольку решение а затем и патч были опубликованы довольно оперативно — раньше чем нам сообщили о проблеме, на время разборок с согласованиями и попаданием в mainline ядра, мы банальным образом перенесли патч вручную в ту версию ядра, которая использовалась на сервере.
Позже обновили уже штатными средствами дистрибутива до текущей актуальной версии.
Эпилог
Если вы не являетесь разработчиком ядра и не пишете патчи каждый день, засыпая в обнимку с отладчиком — т. е. далеки от реалий системного программирования, то из этой статьи сможете вынести несколько интересных выводов и внезапных открытий:
1. Linux - могила, *BSD - сила
Шучу, разумеется неподготовленным пользователям в BSD-системы лучше не лезть совсем, но задуматься (или хотя-бы просто знать) о реалиях функционирования Linux все же стоит. Чтобы факт выноса мозга ядру из прикладного ПО не стал для вас неприятным сюрпризом.
2.Граница между прикладкой и системной разработкой весьма абстрактна
Проще говоря — ее нет совсем и в любой произвольный момент времени у вас есть неиллюзорный шанс наткнуться на баг ядра, даже программируя на JavaScript в браузере.
3.Любой уважающий себя сисадмин и DevOps должны знать Си
Пусть на самом примитивном уровне, но хотя-бы собрать и запустить тестовое приложение, демонстрирующее проблему вы должны уметь.
К сожалению все глубокие изыскания по теме «где оно тормозит» или «почему оно упало» рано или поздно приводят к Си и отладчику ядра.
И поверьте моему печальному опыту: изучать эти вещи лучше днем и в спокойной обстановке, а не в режиме аврала и поздно ночью на работе в выходной день.
4.Считайте деньги, хотя-бы иногда
Описанная в статье проблема случилась в локализованном окружении (на собственных физических серверах компании), но точно такая же Ubuntu используется и облачными провайдерами вроде Amazon, где есть тарификация за использование ресурсов, в первую очередь CPU.
Как нетрудно догадаться, 100% загрузка процессора с интервалом в пять минут в облаке, если ее вовремя не заметить и не исправить — больно отразится на счете, который вам потом выставят.
Так что проверяйте загруженность, поскольку пиковых 100% в современных реалиях быть не должно, если только вы целенаправленно не занимаетесь вычислительными задачами.
P.S.
Более вольный оригинал как обычно в нашем блоге, копия статьи — в Яндекс Дзене.
Все контакты в профиле, если вдруг столкнетесь с «нерешаемыми» задачами, связанными с разработкой или отладкой ПО — знаете кому писать;)
Комментарии (0)
checkpoint
22.09.2025 20:22-- А знаешь как у этих BSD-ишников называется epoll() ?
-- Как ?
-- kqueue()
-- Вот негодяи!
VenbergV
22.09.2025 20:22Технически статья интересна, как происходило решение проблемы.
Но организационные вопросы остались.
А у заказчика точно был сисадмин? У меня слова сервер, не LTS и snapd, в таком сочетании вызывают когнитивный диссонанс. Добавляем GNOME и получаем desktop.
Хотя... Пути заказчиков неисповедимы.alex0x08 Автор
22.09.2025 20:22А у заказчика точно был сисадмин?
и был и есть, но статью все же писал я а не он :)
mc2
22.09.2025 20:22Близкая история: отдел безопасности решил активно тестировать сервера, не только снаружи, но из изнутри, запуская различные тесты сканером безопасности. В какой то момент времени сервера начали виснуть. Сисадмины неделю(?) не могли понять что происходит. Когда информация о таком положении вещей попала ко мне, я пошел и поставил kdump, что бы отловить что именно падает. После очередного падения, посмотрев на дамп ядра и увидев что то похожее на nfs драйвер, пошел смотреть на близкие версии ядер, и обнаружил что буквально в следующем ядре, по патчам, эту проблему решили. Предложил обновить ядро сисадминам, и жить счастливо)
Abyss777
22.09.2025 20:22Не хватает нулевого пункта в выводах: apt-get purge snapd
Какая-то проприетарная штука ломится раз в пять минут куда-то к себе... еще и проц нагружает в 100%
Mingun
Теперь кто-бы исследовал, почему после обновления Ubuntu с 22.04 до 24.04 она стала периодически очень сильно тормозить, как будто постоянно ждет диска. Особенно заметно сразу после старта -- в течении 10 минут прям очень сильно. Пока удалось выяснить, что причина вроде в журнале файловой системы, т.к. нагружает процесс [jbd2/sdaX] (но до конца не уверен, т.к. тормоза бывали и без этого процесса в выводе). Причем такие проблемы обсуждались где-то в 2016, но в Ubuntu 22.04 их не было, а в Ubuntu 24.04 вдруг вылезли непонятно почему.
alex0x08 Автор
Ну как же, всем ведь известно что "нейросети скоро вас всех заменят" (цитата одного менеджера), так что спрашивайте ChatGPT сразу :)
Если серьезно то изучать проблемы пользовательских сетапов на Linux — пустое, поскольку проще переустановить.