Какие проблемы могут возникнуть при использовании команды df в Linux
Что проверяют
Умеете ли вы разбираться с алертом «диск кончается», когда цифры разных утилит не сходятся. Классический уточняющий вопрос: df показывает 100%, а du по разделу находит половину, куда делось место.
Как отвечать
Разберите основные расхождения и способы проверки:
- удалённые, но открытые файлы: лог удалили, а процесс держит дескриптор. Место не освобождается,
duфайла не видит,dfего учитывает. Находится черезlsof +L1, освобождается перезапуском процесса или обнулением через/proc/<pid>/fd/<n>. В logrotate для таких приложений нуженcopytruncateили сигнал на переоткрытие; - закончились inode:
df -hпоказывает свободные гигабайты, а запись падает сNo space left on device. Проверка черезdf -i, виновник обычно миллионы мелких файлов: сессии, кеш; - зарезервированные блоки: на ext4 по умолчанию 5% отдано root, поэтому Used плюс Avail меньше Size. Меняется через
tune2fs -m; - файлы под точкой монтирования: данные записали в
/dataдо монтирования диска. Их не видно, но место на корне занято. Смотрят черезmount --bind / /mnt/root; - зависший NFS:
dfвисит в состоянии D и подвешивает скрипт мониторинга. Выручаютdf -lиtimeout; - CoW-файловые системы: на Btrfs и ZFS снапшоты и сжатие делают вывод
dfприблизительным, нужныbtrfs filesystem usageиzfs list; - LVM thin и контейнеры: thin pool может переполниться, пока
dfвнутри тома спокоен; в Docker место считают черезdocker system df.
Для скриптов берите df -P или --output=pcent,target, чтобы длинное имя устройства не ломало разбор. В алертах смотрите на доступное место, а не на свободное: в node_exporter это node_filesystem_avail_bytes.
Где спотыкаются
На расхождение df и du отвечают «кеш» или «фрагментация». Правильный первый шаг это lsof +L1.
Удаляют большой лог через rm при работающем приложении и удивляются, что место не вернулось. Безопаснее truncate -s 0.
Мониторят только процент занятого места и пропускают исчерпание inode, из-за которого сервис падает при «свободном» диске.