Как мониторить заполнение диска
Что проверяют
Знаете ли вы, что диск заполняется не только байтами, и умеете ли алертить так, чтобы успеть до падения. Следом обычно спрашивают, что делать, когда df показывает 100%, а du находит вдвое меньше.
Как отвечать
Базовая схема: node_exporter отдаёт метрики файловых систем, Prometheus считает правила, Alertmanager доставляет алерты. Что назвать:
- свободное место:
node_filesystem_avail_bytes, а неfree. На ext4 часть блоков зарезервирована под root, и обычному процессу доступно меньше; - иноды:
node_filesystem_files_free. Миллион мелких файлов забивает таблицу инодов при свободных гигабайтах,df -iпокажет это сразу; - прогноз:
predict_linear(node_filesystem_avail_bytes[6h], 24*3600) < 0предупреждает, что при текущем темпе диск кончится за сутки. Это полезнее фиксированного порога; - фильтр: исключите
tmpfs,overlayи служебные точки монтирования поfstype, иначе алерты превратятся в шум; - Zabbix: ключи
vfs.fs.size[/,pfree]иvfs.fs.inode[/,pfree], файловые системы находятся через low-level discovery.
В Kubernetes kubelet сам выселяет поды при нехватке места на узле, по умолчанию при nodefs.available<10% и imagefs.available<15%. Для томов есть kubelet_volume_stats_available_bytes.
По алерту: du -xh --max-depth=1 или ncdu для поиска, lsof +L1 для удалённых, но открытых файлов, чистка образов Docker и старых логов. Если разбор повторяется, настройте ротацию или увеличьте том.
Где спотыкаются
Ставят один порог «80% занято» на все диски. На томе в 10 ТБ это ложная тревога, а на маленьком разделе с быстрой записью алерт приходит слишком поздно.
Забывают про иноды и удалённые файлы. Место кончилось, du ничего не находит, и человек часами ищет несуществующий большой файл.
Мониторят корневой раздел хоста и забывают про тома подов и /var/lib/docker, где место чаще всего и кончается.