Ошибка «на устройстве не осталось места», несмотря на то, что на btrfs достаточно места

17

Почти везде я получаю сбои в журналах с жалобами на No space left on device

Журналы Gitlab:

==> /var/log/gitlab/nginx/current <==
2016-11-29_20:26:51.61394 2016/11/29 20:26:51 [emerg] 4871#0: open() "/var/opt/gitlab/nginx/nginx.pid" failed (28: No space left on device)

Журналы электронной почты Dovecot:

Nov 29 20:28:32 aws-management dovecot: imap(email@www.sitename.com): Error: open(/home/vmail/emailuser/Maildir/dovecot-uidlist.lock) failed: No space left on device

Выход из df -Th

Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/xvda1     ext4      7.8G  3.9G  3.8G  51% /
devtmpfs       devtmpfs  1.9G   28K  1.9G   1% /dev
tmpfs          tmpfs     1.9G   12K  1.9G   1% /dev/shm
/dev/xvdh      btrfs      20G   13G  7.9G  61% /mnt/durable
/dev/xvdh      btrfs      20G   13G  7.9G  61% /home
/dev/xvdh      btrfs      20G   13G  7.9G  61% /opt/gitlab
/dev/xvdh      btrfs      20G   13G  7.9G  61% /var/opt/gitlab
/dev/xvdh      btrfs      20G   13G  7.9G  61% /var/cache/salt

Похоже, там также много места для инода. Выход изdf -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 105031 419257   21% /
devtmpfs       475308    439 474869    1% /dev
tmpfs          480258      4 480254    1% /dev/shm
/dev/xvdh           0      0      0     - /mnt/durable
/dev/xvdh           0      0      0     - /home
/dev/xvdh           0      0      0     - /opt/gitlab
/dev/xvdh           0      0      0     - /var/opt/gitlab
/dev/xvdh           0      0      0     - /var/cache/salt

Выход из btrfs fi show

Label: none  uuid: 6546c241-e57e-4a3f-bf43-fa933a3b29f9
        Total devices 4 FS bytes used 11.86GiB
        devid    1 size 10.00GiB used 10.00GiB path /dev/xvdh
        devid    2 size 10.00GiB used 9.98GiB path /dev/xvdi
        devid    3 size 10.00GiB used 9.98GiB path /dev/xvdj
        devid    4 size 10.00GiB used 9.98GiB path /dev/xvdk

Выход из btrfs fi df /mnt/durable

Data, RAID10: total=17.95GiB, used=10.12GiB
Data, single: total=8.00MiB, used=0.00
System, RAID10: total=16.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, RAID10: total=2.00GiB, used=1.74GiB
Metadata, single: total=8.00MiB, used=0.00
unknown, single: total=272.00MiB, used=8.39MiB

Что может быть причиной этого? Я использую базовый linux AMI ec2 kernal версия 4.4.5-15.26.amzn1.x86_64

Обновить

Выполнение команды, предложенной ниже btrfs fi balance start -dusage=5 /mnt/durable, вернуло мне ошибку следующего:

ERROR: error during balancing '/mnt/durable' - No space left on device There may be more info in syslog - try dmesg | tail

После того, как я вручную удалил кучу более крупных файлов общим объемом ~ 1 ГБ, я перезагрузил компьютер и повторил попытку, убедившись, что использую sudo, и команда выполнена. Затем я перезагрузил свою машину еще раз для хорошей меры, и это, похоже, решило проблему

Остин
источник
Есть ли у вас какие-либо настройки квот?
Zoredache
Универсальные инструменты не могут правильно понимать BTRFS, вам нужны специальные инструменты BTRFS. Пожалуйста, добавьте вывод "btrfs fi show" и "btrfs fi df / mnt / durable"
Питер Грин
@PeterGreen добавил вывод btrfs ... похоже, вы нашли виновника.
Остин
Можете ли вы также добавить вывод второй предложенной мной команды.
Питер Грин
2
Версия ядра здесь очень важна, так как в прошлом у btrfs было довольно много проблем со свободным пространством, и в случае, если это будет другой случай, будущие читатели могут извлечь выгоду из этой информации.
PlasmaHH

Ответы:

19

Добро пожаловать в мир BTRFS. У этого есть некоторые дразнящие особенности, но также и некоторые приводящие в бешенство проблемы.

Прежде всего, некоторая информация о вашей настройке, похоже, у вас есть четыре диска в томе «raid 10» BTRFS (поэтому все данные хранятся дважды на разных дисках). Этот том BTRFS затем разделяется на подобъемы в разных точках монтирования. Подобъемы разделяют пул дискового пространства, но имеют отдельные номера инодов и могут быть смонтированы в разных местах.

BTRFS выделяет пространство в «чанках», чанк выделяется для определенного класса данных или метаданных. Что может произойти (и похоже, что это произошло в вашем случае), так это то, что все свободное пространство выделяется для блоков данных, не оставляя места для метаданных

Также кажется, что (по причинам, которые я не до конца понимаю), что BTRF "исчерпывают" пространство метаданных до того, как показатель доли используемого пространства метаданных достигнет 100%.

Похоже, это то, что произошло в вашем случае, есть много свободного места для данных, но нет свободного места, которое не было выделено для чанков, и недостаточно свободного места в существующих чанках метаданных.

Исправление заключается в том, чтобы запустить «ребаланс». Это переместит данные так, что некоторые чанки могут быть возвращены в «глобальный» свободный пул, где они могут быть перераспределены как чанки метаданных.

btrfs fi balance start -dusage=5 /mnt/durable

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

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

Питер Грин
источник
9
ребаланс - новый дефрагмент
Натан Осман
1
Получение ERROR: error during balancing '/mnt/durable' - No space left on deviceдаже после удаления почти 1 ГБ с диска
Остин
Вы пробовали перезагрузку (перезагрузка после очистки работала для меня, когда у меня была похожая проблема).
Питер Грин
@PeterGreen Добавил содержимое dmesg | tailв мой пост после получения новой ошибки после перезагрузки.
Остин
4

Поскольку вы запускаете btrfs с настройкой RAID, попробуйте выполнить операцию балансировки.

btrfs balance start /var/opt/gitlab

Если это приводит к ошибке о нехватке места, попробуйте еще раз с этим синтаксисом:

btrfs balance start -musage=0 -dusage=0 -susage=0 /var/opt/gitlab 

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

Virtex
источник
Я получил ошибку о космосе. При попытке использовать другой синтаксис он показывает, что выглядит как предупреждение: Refusing to explicitly operate on system chunks. Pass --force if you really want to do that.это нормально делать?
Остин
попробуйте без -susage=0варианта.
virtex
2

В моей системе я добавил следующую работу в cron.monthly.

clear_cacheПеремонтировании связаны с некоторыми проблемами коррупции Btrfs была , имеющей с бесплатными картами. (Я думаю, что они наконец нашли проблему, но проблема настолько раздражает, я готов заплатить, чтобы восстановить карты один раз в месяц.)

Я usageпостепенно расширяю возможности, чтобы освободить место для большего и большего баланса.

#!/bin/sh

for mountpoint in `mount -t btrfs | awk '{print $3}' | sort -u`
do
    echo --------------------------
    echo Balancing $mountpoint :
    echo --------------------------
    echo remount with clear_cache...
    mount -oremount,clear_cache $mountpoint
    echo Before:
    /usr/sbin/btrfs fi show $mountpoint
    /usr/sbin/btrfs fi df $mountpoint
    for size in 0 1 5 10 20 30 40 50 60 70 80 90
    do
        time /usr/sbin/btrfs balance start -v -musage=$size $mountpoint 2>&1
        time /usr/sbin/btrfs balance start -v -dusage=$size $mountpoint 2>&1
    done
    echo After:
    /usr/sbin/btrfs fi show $mountpoint
    /usr/sbin/btrfs fi df $mountpoint
done

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

rrauenza
источник
Большое спасибо @rrauenza! Твой сценарий действительно спас мой день. В моем случае команде balance удалось переместить куски чуть выше 60.
Михал Фапсо
1

Это не столько проблема с btrfs, сколько то, что было сделано с этой системой. Это выглядит как результат неполного перебалансирования из «единой» политики распределения в политику «рейда 10», о чем свидетельствует большое количество отдельных выделенных блоков. Вероятно, он начинался как одиночный, а затем преобразование было прервано. У пула с таким непоследовательным распределением неизбежно будут проблемы с распределением.

Учтите, что у вас есть 61% вашего пула. Ваша политика распределения - RAID10, поэтому до достижения полного заполнения должно быть использовано до 50% потребления пула, поскольку все реплицируется 2. Именно поэтому ваше преобразование из одного в RAID 10 завершилось неудачно (и продолжает это). Я могу только догадываться, но это, вероятно, было выделено в середине перебалансировки. На вашем устройстве не осталось места, чтобы перенастроить RAID 10 на диски, которые у вас есть. Единственная причина, по которой вы получили 61%, заключается в том, что ваши диски распределены несогласованно, некоторые линейно с одним распределением, а большинство - в RAID 10.

Вы можете перебалансировать единую политику распределения, если хотите получить свободное место, ничего не меняя. Вы также можете добавить больше дисков или увеличить размер дисков. ИЛИ вы можете, как вы это сделали в этом случае, просто удалить кучу файлов, чтобы ваш пул мог фактически сбалансироваться с RAID 10 (так как в целом он потреблял бы менее 50%). Убедитесь, что вы восстановили баланс после удаления файлов, или у вас все еще будет эта политика размещения.

В частности, применять RAID 10 при балансировке после удаления этих файлов, чтобы убедиться, что вы избавляетесь от этих выделенных блоков, например:

btrfs fi balance start -dconvert=raid10 -mconvert=raid10 /home

шпульницы
источник