Почему сборка внезапно стала медленной

В девяти случаях из десяти виноват кэш. В десятом — число ядер, которое видит контейнер.

· 1 мин

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

Что проверить по порядку

  1. Попал ли кэш вообще: в логе CI обычно есть строка про cache hit или miss.
  2. Не изменился ли ключ: хеш от lock-файла меняется при любом обновлении зависимостей.
  3. Не сменился ли базовый образ: новый тег — новые слои, и кэш Docker начинается заново.
  4. Сколько ядер реально доступно сборке.

Последний пункт коварный: nproc внутри контейнера часто возвращает число ядер хоста, а не лимит cgroup. Сборка запускает 32 потока на двух доступных ядрах и тонет в переключениях контекста.

cat /sys/fs/cgroup/cpu.max
# 200000 100000  → лимит в 2 ядра

Явно заданное -j по этому значению иногда ускоряет сборку сильнее, чем любой тюнинг компилятора.

logbookdev — записки инженера эксплуатации. Нашли неточность или знаете способ лучше — значит, будет следующая запись.

Ещё по теме

Архив →