StaticGitlabRunnerDiskAlmostFull
Что означает алерт
Корневая файловая система / на статическом раннере gitlab-runner-build занята больше чем на 98% дольше 1 минуты. Severity: critical. В заголовке алерта указан остаток свободного места.
Автоочистка запускается каждые 5 минут и срабатывает с 95%. Алерт означает, что очистка не освободила место или не запускалась. Дальше нужно ручное вмешательство. При 100% джобы падают на записи: checkout, кеш, docker build.
Лейблы алерта: instance (84.201.181.3:9100), mountpoint, device.
Общие сведения о хосте и доступ к нему: Статический GitLab Runner.
Как устроена автоочистка
| Компонент | Расписание | Действие |
|---|---|---|
gitlab-runner-disk-guard.timer → /usr/local/sbin/gitlab-runner-disk-guard |
каждые 5 минут | ниже 95% ничего не делает. С 95%, этап 1: неиспользуемые образы и builder-cache старше 24h. Если занято 85% и больше, этап 2: все неиспользуемые образы, весь неиспользуемый builder-cache, все неподключённые тома (кеш-тома раннера runner-*-cache-*). Если после этапа 2 занято 95% и больше, unit завершается с кодом 1 |
gitlab-runner-cleanup.timer → /usr/local/sbin/gitlab-runner-cleanup |
ежедневно 04:00 UTC | остановленные контейнеры старше 24h, неиспользуемые образы старше 72h, builder-cache старше 72h, затем builder-cache до 150GB |
Оба скрипта используют общий lock /run/gitlab-runner-disk-cleanup.lock. Скрипты и юниты лежат только на хосте, в репозиториях их нет.
Слои BuildKit-кеша общие с образами, поэтому docker builder prune не освобождает место, пока существуют образы с этими слоями. Образы удаляются первыми.
Диагностика (по шагам)
- Подключиться и проверить занятость:
ssh -l sarex 84.201.181.3
df -h /
- Проверить, что guard запускается и чем закончился последний запуск:
systemctl list-timers --all --no-pager | grep gitlab-runner
systemctl show -p Result,ExecMainStatus gitlab-runner-disk-guard.service
sudo journalctl -u gitlab-runner-disk-guard --since "2 hours ago" -o cat | grep -E "^disk|^stage|exhausted"
- Определить, что занимает место:
sudo docker system df
sudo docker ps --size
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head
sudo du -xh --max-depth=1 /var/lib/docker 2>/dev/null | sort -rh | head
- Выбрать действие по результату:
| Результат | Значение | Действие |
|---|---|---|
таймера нет в list-timers или он inactive |
guard не запускается | sudo systemctl enable --now gitlab-runner-disk-guard.timer, затем шаг 1 раздела «Как починить» |
в журнале cleanup exhausted, в docker system df большой RECLAIMABLE у Images |
образы удерживаются контейнерами | sudo docker ps -a; зависшие джобы отменить в GitLab, остановленные контейнеры удалить |
в журнале cleanup exhausted, RECLAIMABLE мал |
место занято тем, что используется сейчас: бегущие сборки, их кеш, тома | sudo docker ps --size, найти джобу с большим объёмом записи, отменить её в GitLab |
/var/lib/docker занимает мало, место занято в другом каталоге |
рост вне docker | /var/log и журнал: sudo journalctl --vacuum-size=1G; остальное разбирать по du |
Result=failed без строк disk в журнале |
скрипт падает до очистки | sudo journalctl -u gitlab-runner-disk-guard -n 50 -o cat, проверить systemctl status docker |
Как починить
- Запустить guard вручную и проверить результат:
sudo systemctl start gitlab-runner-disk-guard.service
sudo journalctl -u gitlab-runner-disk-guard -n 20 -o cat | grep -E "^disk|^stage|exhausted"
df -h /
- Если guard не освободил место, удалить всё неиспользуемое вручную. Кеш сборок и кеш-тома раннера будут потеряны, первые сборки после этого идут дольше:
sudo docker container prune -f
sudo docker image prune -a -f
sudo docker builder prune -a -f
sudo docker volume prune -a -f
df -h /
-
Если место занимают бегущие джобы, отменить их в GitLab. Контейнер джобы удаляется раннером после отмены.
-
Если алерт повторяется при штатно отработавшей очистке, объёма диска не хватает на текущую нагрузку. Варианты: увеличить диск VM (
fv4d9jn4bkj3cbb7vvkg, folderstage) или сократить срок хранения в/usr/local/sbin/gitlab-runner-cleanup(72h, 150GB).
Критерий закрытия
df -h /показывает меньше 95%.- Последний запуск
gitlab-runner-disk-guard.serviceзавершён сResult=success. - Алерт перешёл в
inactive.