Как освободить использование Inode?
У меня есть диск, на котором индексные дескрипторы используются на 100% (с помощью команды df -i ). Однако после значительного удаления файлов использование остается 100%.
Как правильно это сделать?
Как это возможно, что диск с меньшим использованием дискового пространства может иметь более высокое использование Inode, чем диск с более высоким использованием дискового пространства?
Возможно ли, если я заархивирую много файлов, это уменьшит количество используемых inode?
17 ответов
Для диска довольно легко использовать большое количество inodes, даже если он не очень заполнен.
Файлу выделяется индексный дескриптор, поэтому, если у вас есть миллионы файлов, каждый по 1 байту, у вас кончатся индексы задолго до того, как закончится диск.
Также возможно, что удаление файлов не уменьшит количество inode, если файлы имеют несколько жестких ссылок. Как я уже сказал, inodes принадлежат файлу, а не записи каталога. Если с файлом связаны две записи каталога, удаление одной не освободит индексный дескриптор.
Кроме того, вы можете удалить запись в каталоге, но, если у запущенного процесса все еще открыт файл, индексный дескриптор не будет освобожден.
Мой первоначальный совет — удалить все файлы, которые вы можете, а затем перезагрузить компьютер, чтобы убедиться, что не осталось процессов, удерживающих файлы открытыми.
Если вы это сделаете, но проблема не исчезнет, сообщите нам.
Кстати, если вы ищете каталоги, содержащие много файлов, этот сценарий может помочь:
Если вам очень не повезло, вы использовали около 100% всех inode и не можете создать скрипт. Вы можете проверить это с помощью df -ih .
Тогда эта команда bash может вам помочь:
И да, это займет время, но вы можете найти каталог с наибольшим количеством файлов.
Моя ситуация заключалась в том, что у меня закончились inodes, и я уже удалил все, что мог.
Я использую ubuntu 12.04LTS и не могу удалить старые ядра Linux, которые занимали около 400000 inodes, потому что apt был сломан из-за отсутствия пакета. И я не мог установить новый пакет, потому что у меня закончились inodes, поэтому я застрял.
В итоге я удалил несколько старых ядер Linux вручную, чтобы освободить около 10 000 inodes.
Этого было достаточно, чтобы я смог установить недостающий пакет и исправить мой apt
А затем удалите оставшиеся старые ядра Linux с помощью apt
Сейчас все намного лучше
Попытайтесь выяснить, не является ли это проблемой inodes:
Попробуйте найти корневые папки с большим количеством inodes:
Попробуйте найти определенные папки:
Если это заголовки linux, попробуйте удалить самые старые с помощью:
Лично я переместил их в смонтированную папку (потому что для меня последняя команда не удалась) и установил последнюю с помощью:
Это решило мою проблему.
У меня была такая же проблема, исправил ее, удалив сеансы каталога php
Это может быть под /var/lib/php5 , если вы используете старую версию php.
Восстановите его со следующим разрешением
Разрешение по умолчанию для каталога в Debian было drwx-wx-wt (1733)
Мы испытали это на учетной записи HostGator (которая накладывает ограничения на индексные дескрипторы на весь свой хостинг) после спам-атаки. Он оставил огромное количество записей очереди в /root/.cpanel/comet. Если это произойдет и вы обнаружите, что у вас нет свободных индексных дескрипторов, вы можете запустить эту утилиту cpanel через оболочку:
Вы можете использовать RSYNC для УДАЛЕНИЯ большого количества файлов.
Создайте пустую тестовую папку с 0 файлами в ней, и команда синхронизирует ваши тестовые папки с большим количеством файлов (я удалил почти 5 миллионов файлов с помощью этого метода).
Поздний ответ: в моем случае это были файлы сеанса в
Которые использовали Inodes.
Мне даже не удалось открыть crontab или создать новый каталог, не говоря уже о запуске операции удаления. Поскольку я использую PHP, у нас есть это руководство, из которого я скопировал код из примера 1 и настроить cronjob для выполнения этой части кода.
Если вам интересно, как мне удалось открыть свой crontab, то я удалил некоторые сеансы вручную через CLI.
Надеюсь это поможет!
Eaccelerator может быть причиной проблемы, поскольку он компилирует PHP в блоки . У меня была эта проблема с сервером Amazon AWS на сайте с большой нагрузкой. Освободите Inodes, удалив кеш eaccelerator в / var / cache / eaccelerator, если у вас по-прежнему возникают проблемы.
(или любой другой каталог вашего кеша)
Недавно мы столкнулись с подобной проблемой. В случае, если процесс ссылается на удаленный файл, индексный дескриптор не будет выпущен, поэтому вам нужно проверить lsof /, и убить / перезапустить процесс освободит индексы.
Поправьте меня, если я здесь не прав.
Как было сказано ранее, в файловой системе могут закончиться inodes, если есть много маленьких файлов. Я предоставил средства для поиска каталогов, содержащих большинство файлов, здесь.
В одном из приведенных выше ответов предполагалось, что сеансы были причиной исчерпания inodes, и в нашем случае это именно то, что было. Чтобы добавить к этому ответу, я бы посоветовал проверить файл php.ini и убедиться, что session.gc_probability = 1 также session.gc_divisor = 1000 и session.gc_maxlifetime = 1440 . В нашем случае session.gc_probability было равно 0 и вызвало эту проблему.
На Raspberry Pi у меня была проблема с каталогом /var/cache/fontconfig с большим количеством файлов. Удаление заняло больше часа. И, конечно, rm -rf *.cache* вызвал ошибку Argument list too long . Я использовал ниже один
Вы могли видеть эту информацию
Многие ответы на этот вопрос пока и все вышеперечисленное кажутся конкретными. Я думаю, вы будете в безопасности, используя stat по ходу дела, но, в зависимости от ОС, вы можете столкнуться с некоторыми ошибками inode. Таким образом, реализация вашей собственной функции вызова stat с использованием 64bit во избежание проблем с переполнением кажется вполне совместимой.
Если вы используете докер, удалите все изображения. Они использовали много места .
Остановите все контейнеры
Источник
Что делать, когда на сервере кончаются файловые дескрипторы (inode)
Нередки случаи, когда причиной проблем на сервере становится переполнение файловых дескрипторов ( inode ). Симптомы точно такие же, как при переполнившемся диске, только вот диск при этом может оказаться свободным.
Количество inode каждой файловой системы определяется при разворачивании ОС. И для большинства серверов этого хватает с головой. Чаще всего во время установки ОС создаётся 1 inode на каждые 2 Кбайт пространства по умолчанию. Это много, но для некоторых — все равно недостаточно.
Если у вас закончились inode , вы не сможете создать новый файл. Ваша система или любая её служба также не сможет это сделать.
Первый шаг, который требуется в этом случае, проверить наличие свободных inode командой:
Отметим, что эта команда обычно применяется в паре с df -h , которую используют для проверки места на диске. Иначе говоря, проверяя место на диске, не забудьте проверить и файловые дескрипторы.
Вывод команды будет примерно таким:
Как и в случае с дисковым пространством, нас интересует строчка с dev -устройством, в которое файловая система помещает наши файлы. В примере это /dev/vda5 и процент использования inode 100%. Хотя мы видим, что 159 дескрипторов еще свободно, для корректной работы системы этого может быть мало уже сейчас или хватит совсем ненадолго.
Как возникла эта проблема? В какой-то директории создано большое количество файлов, т.е. условно говоря, у системы есть ограничение на создаваемые файлы, и это ограничение было превышено. Задача — найти эту директорию или директории. Нам поможет следующая команда:
Вывод будет примерно таким:
Здесь указывается директория и ниже — количество файлов в ней.
Наиболее распространенный случай, когда множество файлов создается в папке хранения сессий. В нашем примере это директория /var/www/user1/data/mod-tmp. Очистить ее можно командой:
Учтите, что процесс может быть долгим, так как удаление большого количества мелких файлов требует времени.
Для удаления этих файлов у PHP есть встроенный механизм сборщика мусора, который так и называется — garbage collector . И для сессий он отрабатывает по довольно простой схеме, работа которой задается переменными в настройках PHP.
Для всех файлов сессий, которые были созданы больше, чем « session.gc_maxlifetime » секунд назад (обычно это — 1440 секунд, 24 минуты) есть вероятность, что файл будет удален. Вероятность равна « session.gc_probability », разделенная на « session.gc_divisor ».
Делитель обычно задается стандартный, равный 1000, а вот параметр session.gc_probability — и есть ключевая переменная в вероятности срабатывания. И у вас она может быть выставлена в 0 , что будет означать, что PHP никогда не очищает старые сессии. Из-за чего у вас и может накопиться их несколько миллионов. Выставите параметр в 1 , сессии будут очищаться.
Далее видим, что и в почтовой очереди скопилось много файлов. Если проблему с переполнившимися айнодами уже решили, то лучше не очищать почтовую очередь и проанализировать ее с помощью нашей статьи. Если вопрос срочный, очищаем ее также как сессии PHP:
По тому же принципу поступаем и с кэшем /var/www/user2/data/www/site2.ru/bitrix/cache (хотя там файлов не так много, можно и не удалять, если есть более «объёмные» кандидаты).
Мы рассмотрели наиболее встречаемые случаи и пути их решения. В отличие от дискового пространства, с айнодами частных случаев гораздо больше, но в одной статье обо всех рассказать невозможно. Если ваш случай не попал в статью, вы всегда можете обратиться в поддержку за помощью.
Источник
Что такое Inode
Inode — это структура данных в которой хранится информация о файле или директории в файловой системе. В файловой системе Linux, например Ext4, у файла есть не только само его содержимое, например, тот текст, но и метаданные, такие как имя, дата создания, доступа, модификации и права. Вот эти метаданные и хранятся в Inode. У каждого файла есть своя уникальная Inode и именно здесь указано в каких блоках находятся данные файла.
Это довольно низкоуровневое понятие, но обычным пользователям приходится взаимодействовать с ним когда эти самые Inode заканчиваются. Возможно вы уже встречались с ошибкой когда место на диске ещё есть, но программа не может создать файл, потому что Inode закончились. В этой статье мы подробно разберемся что такое Inode, а также попытаемся выяснить как избежать связанных с ними проблем.
Что такое Inode в Linux?
Как я уже сказал выше, Inode или I-node или индексный дескриптор — это структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Но начать надо с файловой системы. Файловые системы Ext используют блоки для хранения данных. По умолчанию размер одного блока равен 4092 байта. В начале раздела расположен суперблок, в котором находятся метаданные всей файловой системы, а ним идут несколько зарезервированных блоков, а затем размещена таблица Inode и только после неё блоки с данными. Таким образом, все Inode размещены в начале раздела диска.
Директории — это тоже Inode типа директория, в которых вместо содержимого файла содержится список имён файлов и номера их Inode. Корневая папка в Ext4 имеет номер Inode — 2. Вы можете посмотреть информацию о ней с помощью утилиты debugfs. Утилите в параметрах надо передать диск, на котором расположена файловая система:
sudo debugfs /dev/nvme0n1p5
Затем выполните такую команду:
Здесь указано, что эта Inode имеет тип Directory, права 755. Её владелец и группа root, потому что идентификатор пользователя 0. Чуть ниже расположена информация про время создания, модификации и доступа. А в самом низу находятся блоки с данными этой Inode. Именно там хранится список файлов и папок директории. Вы можете посмотреть содержимое блока командой dump_block:
debugfs: block_dump 9238
Утилита выведет данные в HEX и ASCII формате, и в них будет видно имена папок. Но увидеть номера Inode здесь не получится без дополнительных программ. Проще всего их можно посмотреть с помощью команды ls:
Здесь в первом же столбике находится номер Inode для файла или папки. Для примера можно посмотреть ещё информацию про testfile с номером Inode 1128:
В разделе EXTENTS есть номер блока, в котором находятся данные файла. В данном случае это 6596316. В нём можно посмотреть содержимое файла:
debugfs: block_dump 6596316
Вот так это всё работает на уровне файловой системы. Посмотреть Inode идентификаторы файлов можно также с помощью команды ls. Для этого надо передать ей опцию -i:
Здесь они будут тоже в первой колонке. Обратите внимание, что у каждого файла, папки или символической ссылки уникальный номер Inode. Исключение составляют только жесткие ссылки. Количество Inode в файловой системе ограничено, оно определяется при инициализации файловой системы. Посмотреть текущее количество Inode можно командой tune2fs:
sudo tune2fs -l /dev/nvme0n1p5
Нужная информация находится в поле Inode count. Посмотреть Inode можно с помощью утилиты df передав ей опцию -i:
Как видите, на моём корневом разделе использовано 29% Inode, а блоков у меня уже использовано 95%. Но если бы у меня было очень много мелких файлов, то место бы ещё осталось, а доступные Inode закончились. Тогда бы возникла ошибка создания файла, даже несмотря на то, что место ещё есть. Чтобы избежать такой ситуации надо тщательно планировать как вы будете использовать файловую систему.
Вы не можете изменить количество Inode для существующей файловой системы, зато можете указать для новой с помощью опции -N. Например:
mkfs -t ext4 -N 3000000 /dev/nvme0n1p5
В данном случае будет создана файловая система с тремя миллионами индексов Inode. Ещё можно не указывать точное количество Inode, а указать количество байт в одной Inode, это может быть удобно, если вы знаете средний размер ваших файлов, которые будут хранится в файловой системе. Например:
mkfs -t ext4 -i 2K /dev/nvme0n1p5
В качестве альтернативы, можно использовать файловую систему Btrfs, в которой Inode не могут закончиться потому что они генерируются динамически по мере необходимости.
Выводы
В этой статье мы рассмотрели что такое Inode в Linux, а также что произойдёт если доступное количество Inodes закончатся. Будьте осторожны при создании файловой системы и думайте какие файлы в ней будут размещены и сколько их там будет чтобы избежать проблем с Inode.
Источник