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


24

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

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

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

Ответы:


44

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

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

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

Одним из решений является повторное монтирование файловой системы с опцией монтирования 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 имеет группы выделения (также известные как AG ), начиная с 0. Вы можете проверить размер блока и количество блоков каждого AG, чтобы выяснить, какие группы находятся на первом терабайте, используя xfs_info /path/to/mountpoint. Или вы можете просто проверить первые несколько AG, чтобы увидеть, какие из них заполнены, а затем очистить их.

  1. Проверка свободного места в первых четырех AG:
для ag в `seq 0 1 5`; сделать эхо свободного пространства в AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "совершенно бесплатно"; сделанный

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

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

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

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

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

результат

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.