Невозможно создать файлы на большой файловой системе XFS

У нас есть сервер Linux с файловой системой 4 ТБ, который используется для хранения репозиториев subversion. Есть много репозиториев, некоторые из которых используются уже несколько лет.

Диск изначально составлял около 1 ТБ, но мы начали бежать из космоса и увеличили его до 4 ТБ примерно год назад. Теперь люди сообщают, что не могут проверить файлы в своих репозиториях. Сообщение об ошибке: No space left on device.

Диск имеет около 1,5 ТБ бесплатно, а также сообщает о наличии бесплатных inodes - и тем не менее, на нем невозможно создать новый файл. По-прежнему можно обновлять старые файлы, и периодически некоторые репозитории будут обновляться, но один и тот же репозиторий может выйти из строя при следующей попытке.

22 голоса | спросил Jenny D 2 J0000006Europe/Moscow 2015, 13:19:11

1 ответ


43

Причина проблемы

Проблема заключается в том, как XFS выделяет inodes. В отличие от большинства файловых систем, распределение происходит динамически по мере создания новых файлов. Однако, если вы не указали иначе, inodes ограничены 32-битными значениями, что означает, что они должны входить в первый терабайт хранилища в файловой системе. Поэтому, если вы полностью заполняете этот первый терабайт, а затем увеличиваете диск, вы все равно не сможете создавать новые файлы, так как inodes не могут быть созданы в новом пространстве.

Решение 1 - изменить параметры монтирования

Одним из решений является повторная установка файловой системы с опцией mount inode64. Однако некоторые приложения будут странно относиться к этому (например, MySQL), а NFS будет очень запутанным. Поэтому, если вы не уверены, что ваша система будет работать с этой опцией, вы можете перейти к следующей опции.

Решение 2 - перемещение файлов

Второе решение - найти некоторые файлы, которые в настоящее время хранятся в первом терабайте, и переместить их в другую область файловой системы.

Перемещение по возрасту

В нашем случае это было просто: файловая система использовалась годами, поэтому мы могли просто найти самые старые файлы и отодвинуть их от файловой системы, а затем переместить их обратно. Это было легко сделано с помощью find:

find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt

предоставил нам список, содержащий размер и имя каталога для всех каталогов на ровно 3 уровнях ниже точки монтирования, которые были старше 2 лет. Затем мы могли отсортировать список, чтобы найти самые большие каталоги, и использовать mv, чтобы переместить их в другую файловую систему и обратно.

Перемещение по группе размещения

Если вы не можете просто пойти по возрасту, например. когда много файлов было создано одновременно, вы все равно можете найти нужные файлы для перемещения, но требуется немного больше времени.

XFS имеет группы распределения (aka AG s), начиная с 0. Вы можете проверить размер блока и количество блоков каждого AG, чтобы выяснить, какие группы находятся на первом терабайте, используя ---- +: = 3 = + ----. Или вы можете просто проверить первые несколько AG, чтобы узнать, какие из них заполнены, и затем очистить их.

  1. Проверка свободного пространства в первых четырех AG:
для ag в `seq 0 1 5`; do echo freespace в AG $ ag; xfs_db -r -c "freesp -s -a $ ag" /dev /CACHE /CACHE; grep "total free"; Готово

Если общее свободное пространство в любой группе меньше 40, вы не сможете создавать в нем новые файлы.

  1. Найти файлы в этом AG

Это требует проверки метаданных для каждого файла в файловой системе. Это займет время long ... Вот предложение:

   find /extra -mindepth 3-type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt

Затем вы можете grep для xfs_info /path/to/mountpoint (это пробел, нуль и другое пространство), чтобы найти все файлы на AG 0, grep для " 0 ", чтобы найти те, что указаны в AG 1 и т. д. Начните с AG 0, переместите самые большие файлы (используя " 1 ", а не mv!), А затем снова. Повторяйте, пока у вас недостаточно свободного места.

Результат

Как только мы переместили достаточное количество файлов в /дополнение, а затем снова, в AG 0 было много места, и снова можно было создать новые файлы.

ответил Jenny D 2 J0000006Europe/Moscow 2015, 13:19:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132