TGViewer
sdnv's funk-hole sdnv's funk-hole @sdnv_funkhole · 933 subscribers
Post #1723 500

Forwarded from Технологический Болт Генона

Загадка ядра Linux: почему на 36 vCPU Cilium падает, а на 32 — нет
https://habr.com/ru/companies/flant/articles/1043512/

Следуя нашему правилу вносить изменения в инфраструктуру максимально осторожно, мы сперва выкатили всё на стейдж. Развёртывание прошло успешно. Но спустя несколько недель начались спорадические сбои: примерно раз в неделю один из агентов Cilium падал так, что приходилось полностью перезагружать весь узел. Никаких явных паттернов или очевидных причин. Баг случался редко, но бил слишком больно, чтобы пускать такое в production.

Первая мысль — скорее всего, намудрили с конфигурацией, ведь Cilium — серьёзный, проверенный в бою проект, который используют тысячи компаний по всему миру. Наверняка мы допустили ошибку в конфигурации или столкнулись с пограничным случаем. Забегая вперед — догадка оказалась и верной, и неверной одновременно, причём весьма неожиданным образом.
. . .
Заметил кое-что интересное: упавшие агенты Cilium потребляли аномально много памяти во время запуска узлов, на которых они размещались. Причём потребление памяти не росло постепенно — на графиках были видны резкие всплески прямо при инициализации узла.
. . .
Я начал экспериментировать с различными параметрами Cilium: лимитами памяти, размерами eBPF-карт, различными настройками производительности. Затем попробовал отключить одну специфическую опцию, связанную с производительностью (bpf-distributed-lru: false), и перезапустил тест. Сбои прекратились. Включил её обратно — сбои вернулись. Снова отключил — всё стабильно. Многочисленные перезапуски теста показали: закономерность сохраняется.
Это была первая реальная зацепка: баг был напрямую связан с некой оптимизацией, которую мы включили, руководствуясь официальными гайдами Cilium.
. . .
При включённом distributed LRU ядро округляет вверх количество записей в карте до значения, кратного num_possible_cpus().
Вот где скрывалась проблема! Ядро автоматически корректировало размер любой карты так, чтобы он был кратен количеству ядер процессора. В конфиге Cilium мы жёстко прописали статический размер карты, как рекомендует официальная документация: bpf-ct-global-tcp-max: 131072

Это степень двойки (131 072 = 217), как и рекомендуют гайды. И оно отлично работало… пока количество ядер тоже было степенью двойки. Но вот в случае 36, 48 или 72 ядер значение округлялось вверх, создавая несоответствие.

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

- Cilium настраивает карту на 131 072 записи.

- Ядро округляет это значение до 131 076 (на узле с 36 ядрами).

- Цикл согласования (reconciliation) Cilium проверяет размер карты.

- Обнаружено расхождение: в карте 131 076 записей, а должно быть 131 072.

- Cilium удаляет карту и пересоздаёт её с размером 131 072 записи.

- Ядро округляет значение до 131 076… и так до бесконечности!


Оригинал
Kernel Archaeology: Why 36 CPUs Crash Cilium But 32 Don’t
https://medium.com/qonto-way/kernel-archaeology-why-36-cpus-crash-cilium-but-32-dont-2007f6f6772a
  • 🐳 5
  • 👍 1
  • 🦄 1
More from @sdnv_funkhole
  1. Aug 27, 2026Пятница только началась, а нетфликс уже отмечает #пьятница
  2. Jul 21, 2026 Вышел релиз 0.33.1 SRE Learning Platform - крупнейшее обновление по Istio за всю историю…
  3. Jun 25, 2026🔄 Всё, что вы забыли обновить, будет использовано против стабильности Когда сервисов мног…
  4. Jun 6, 2026Зацените корейский spot-model 2007 года Ibanez S620EX1 #девайсы
  5. May 27, 2026Ставь лайк, если узнал в этой новости свою ИТ-инфраструктуру Упала самописная приложенька…
  6. May 8, 2026Вертикальный корпус оказался чудовищно неудобным (казалось бы) Переезд в аквариум ✅ #девай…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →