Перейти к содержанию

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 не освобождает место, пока существуют образы с этими слоями. Образы удаляются первыми.

Диагностика (по шагам)

  1. Подключиться и проверить занятость:
ssh -l sarex 84.201.181.3
df -h /
  1. Проверить, что 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"
  1. Определить, что занимает место:
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
  1. Выбрать действие по результату:
Результат Значение Действие
таймера нет в 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

Как починить

  1. Запустить 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 /
  1. Если 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 /
  1. Если место занимают бегущие джобы, отменить их в GitLab. Контейнер джобы удаляется раннером после отмены.

  2. Если алерт повторяется при штатно отработавшей очистке, объёма диска не хватает на текущую нагрузку. Варианты: увеличить диск VM (fv4d9jn4bkj3cbb7vvkg, folder stage) или сократить срок хранения в /usr/local/sbin/gitlab-runner-cleanup (72h, 150GB).

Критерий закрытия

  1. df -h / показывает меньше 95%.
  2. Последний запуск gitlab-runner-disk-guard.service завершён с Result=success.
  3. Алерт перешёл в inactive.