Почему сборка внезапно стала медленной
В девяти случаях из десяти виноват кэш. В десятом — число ядер, которое видит контейнер.
В девяти случаях из десяти виноват кэш: его сбросил чистый CI-раннер, изменился ключ кэша или кто-то обновил базовый образ. Прежде чем профилировать компилятор, стоит сравнить время шага восстановления кэша в старом и новом прогоне.
Что проверить по порядку
- Попал ли кэш вообще: в логе CI обычно есть строка про cache hit или miss.
- Не изменился ли ключ: хеш от lock-файла меняется при любом обновлении зависимостей.
- Не сменился ли базовый образ: новый тег — новые слои, и кэш Docker начинается заново.
- Сколько ядер реально доступно сборке.
Последний пункт коварный: nproc внутри контейнера часто возвращает число ядер хоста, а не лимит cgroup. Сборка запускает 32 потока на двух доступных ядрах и тонет в переключениях контекста.
cat /sys/fs/cgroup/cpu.max
# 200000 100000 → лимит в 2 ядра
Явно заданное -j по этому значению иногда ускоряет сборку сильнее, чем любой тюнинг компилятора.