На сервере в Linux свободное место есть, а записать ничего нельзя

На VPS при создании бэкапов в консоли появилась ошибка errno: 28 «No space left on device» — закончилось свободное место корневого раздела сервера.

При тестовом копировании новых файлов на сервер вручную через sftp, выводятся похожие ошибки о недостаточности места на диске.


Почему так происходит?

Проблема заключается в том, что на файловой системе раздела сервера закончились файловые дескрипторы (inode). Любая файловая система vfat, ext3, ext4 и т.д. имеет ограниченное количество файлов на определенный размер. У файловой системы XFS нет статического количества inode. В ней количество inode динамическое. При выборе файловой системы для проекта нужно тщательно взвешивать все плюсы и минусы.

Inode – это часть раздела ФС, хранящая данные о файле или директории: имя, дата создания, дата доступа, дата модификации, права доступа и т.д. Количество inode на 1Гб практически у всех файловый систем – это постоянная величина.

Чтобы посмотреть сколько inode есть у определенного раздела:

sudo tune2fs -l /dev/sda2 | grep "Inode count"
Inode count:              1294896

В примере это чуть меньше 1.3M.

Как увидеть проблему?

Чтобы увидеть общую картину:

df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             244K   319  244K    1% /dev
tmpfs            248K   398  248K    1% /run
/dev/sda2        1.3M  1.3M     0    0% /
tmpfs            248K     1  248K    1% /dev/shm
tmpfs            248K     2  248K    1% /run/lock
tmpfs            248K    17  248K    1% /sys/fs/cgroup
/dev/sda1           0     0     0     - /boot/efi
tmpfs            248K    10  248K    1% /run/user/1000

Отсюда видно, что всего у раздела 1.3M inode. Из них все заняты.

Как освободить inode в Linux?

inode — это не кэш. Его нельзя просто взять и очистить. Можно только удалить файлы, которые не нужны и больше не используются. Можно вывести список директорий, использующих максимальное количество inode раздела. Для этого в корневой директории раздела выполняем команду:

find / -type d -size +4096 -exec sh -c " ls -d {} && ls  {} | wc -l" \;
/var/www/site.ru/sessions
600000
/var/www/site2.ru/sessions
500000

Получается, что 1.1М inode — это файлы php-сессий, которые просто так «захламляют» наш диск. Почему-то сборщик мусора php-сессий их не убрал.

Чтобы очистить директории вручную, выполняем последовательно команды:

find /var/www/site.ru/sessions -type f -delete
find /var/www/site2.ru/sessions -type f -delete

Многие хостеры специально уменьшают количество inode на диске, чтобы заставить клиента перейти на более дорогой тариф. Хорошие хостеры так не делают. Для файловой системы ext4 считается нормой на каждый 1Гб емкости раздела использовать >60K inode. Если у Вашего хостинга меньше, то делайте выводы.

Теги:

Комментарии




В качестве аватарки используется сервис - gravatar.com



IT-событие
Создание AMD
Создание AMD
Оглавление
  1. Почему так происходит?
  2. Как увидеть проблему?
  3. Как освободить inode в Linux?
  4. Комментарии