Btrfs'de bol yer olmasına rağmen “cihazda boşluk kalmadı” hatası


17

Neredeyse her yerde şikayetçi günlükleri hataları alıyorum No space left on device

Gitlab günlükleri:

==> /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 e-posta günlükleri:

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

Çıktı 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

Görünüşe göre bol miktarda inode alanı var. Çıktı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

Çıktı 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

Çıktı 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

Bunun nedeni ne olabilir? Temel linux AMI ec2 çekirdek sürümünü 4.4.5-15.26 kullanıyorum. Amzn1.x86_64

Güncelleme

Aşağıda önerilen komutu çalıştırmak btrfs fi balance start -dusage=5 /mnt/durablebana aşağıdakilerden oluşan bir hata verdi:

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

~ 1GB'a kadar olan daha büyük dosyaları elle sildikten sonra, makineyi yeniden başlattım ve sudo kullandığımdan ve komutun çalıştığından emin olarak tekrar denedim. Daha sonra iyi bir ölçüm için makinemi yeniden başlattım ve sorunu çözmüş gibi görünüyor


Herhangi bir kota kurulumunuz var mı?
Zoredache

Genel araçlar BTRFS'yi düzgün bir şekilde anlayamaz, BTRFS'ye özgü araçlara ihtiyacınız vardır. Lütfen "btrfs fi show" ve "btrfs fi df / mnt / dayanıklı" çıktısını ekleyin
Peter Green

@PeterGreen btrfs çıktısını ekledi ... sanki suçlu buldunuz.
Austin

Önerdiğim ikinci komutun çıktısını da ekleyebilir misiniz?
Peter Green

2
Çekirdek sürümü burada oldukça önemlidir, çünkü btrfs geçmişte boş alanla ilgili birçok sorun yaşadı ve bu, gelecekteki okuyucuların bu bilgilerden yararlanabileceği başka bir örnekse.
PlazmaHH

Yanıtlar:


19

BTRFS dünyasına hoş geldiniz. Bazı cezbedici özellikleri vardır, aynı zamanda bazı sinir bozucu sorunları vardır.

Öncelikle, kurulumunuzla ilgili bazı bilgiler, bir BTRFS "raid 10" biriminde dört sürücünüz var gibi görünüyor (böylece tüm veriler farklı disklerde iki kez saklanır). Bu BTRFS hacmi daha sonra farklı montaj noktalarında alt hacimlere oyulur. Alt hacimler bir disk alanı havuzunu paylaşır ancak ayrı inode numaralarına sahiptir ve farklı yerlere monte edilebilir.

BTRFS "parçalar" içinde yer ayırır, belirli bir veri veya meta veri sınıfına bir yığın tahsis edilir. Ne olabilir (ve davanızda olduğu gibi), tüm boş alanların veri yığınlarına ayrılması ve meta verilere yer bırakmamasıdır

Ayrıca, (tam olarak anlamadığım nedenlerle), BTRF'lerin kullanılan meta veri alanı oranının göstergesi% 100'e ulaşmadan önce meta veri alanını "tükettiği" görülmektedir.

Durumunuzda olan bu gibi görünüyor, çok fazla boş veri alanı var, ancak parçalara tahsis edilmemiş boş alan ve mevcut meta veri yığınlarında yetersiz boş alan yok.

Düzeltme bir "yeniden dengeleme" çalıştırmaktır. Bu, bazı parçalar meta veri parçaları olarak yeniden tahsis edilebilecekleri "global" ücretsiz havuza geri gönderilebilecek şekilde verileri hareket ettirir

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

Sonraki sayı -dusage, yeniden dengenin ne kadar agresif olduğunu, yani blokların ne kadar boş bırakılacağını yeniden yazılması gerektiğini belirler. Denge 0 blok yeniden yazdı diyorsa daha yüksek bir değeri ile tekrar deneyin -dusage.

Denge başarısız olursa, dosyaları yeniden kaldırarak yeniden başlatmayı ve / veya biraz yer açmayı deneyeceğim.


9
yeniden dengeleme yeni birleştirme.
Nathan Osman

1
Başlarken ERROR: error during balancing '/mnt/durable' - No space left on devicebile sürücüden neredeyse 1 GB sildikten sonra
Austin

Yeniden başlatmayı denediniz mi (benzer bir sorun yaşadığımda temizleme işleminden sonra yeniden başlattım).
Peter Green

@PeterGreen Yeniden başlattıktan dmesg | tailsonra yeni bir hata aldıktan sonra yayınımın içeriği eklendi .
Austin

4

RAID kurulumuyla btrfs çalıştırdığınız için bir denge işlemi çalıştırmayı deneyin.

btrfs balance start /var/opt/gitlab

Bu, yeterli alana sahip olmamakla ilgili bir hata verirse, bu sözdizimiyle tekrar deneyin:

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

Alanla ilgili hataları gördüğünüz her btrfs dosya sistemi için bu işlemi tekrarlayın. Alan sorununuz, yansıtılan disklere meta verilerin dağıtılmamasından kaynaklanıyorsa, bu sizin için biraz yer açabilir.


Alanla ilgili bir hata aldım. Diğer sözdizimini denediğimde bana neyin bir uyarıya benzediğini gösteriyor: Refusing to explicitly operate on system chunks. Pass --force if you really want to do that.Bunu yapmak uygun mu?
Austin

-susage=0seçeneği olmadan deneyin .
virtex

2

Sistemime aşağıdaki işi cron.monthly'de ekledim.

clear_cacheYeniden bağlama btrfs ücretsiz haritalar başlamıştı bazı yolsuzluk sorunları nedeniyle. (Sanırım nihayet sorunu buldular, ancak sorun çok sinir bozucu, ayda bir kez haritaları yeniden oluşturmak için ödeme yapmaya hazırım.)

Daha usagebüyük ve daha büyük dengeler için yer açmak için seçenekleri artırıyorum.

#!/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

Yetersiz alanınız olduğu için yeniden dengeleyemeyeceğiniz noktaya gelirseniz, tavsiye, yeniden dengeleme süresi boyunca biriminize geçici olarak başka bir blok cihazı (veya başka bir diskteki geri döngü cihazı) eklemeniz ve ardından onu kaldır.


Çok teşekkürler @rrauenza! Senaryonun gerçekten benim günümü kurtardı. Benim durumumda denge komutu 60'tan yeni parçaları yeniden yerleştirmeyi başardı.
Michal Fapso

1

Bu btrfs ile ilgili bir sorun değil, bu sistem için yapılmış bir şey olduğu kadar. Bu, büyük miktarda tek tahsis edilmiş blok tarafından kanıtlandığı gibi, 'tek' bir tahsis politikasından 'baskın 10' tahsis politikasına eksik bir yeniden dengenin sonucuna benziyor. Muhtemelen tek olarak başladı ve sonra bir dönüşüm kesintiye uğradı. Böyle tutarsız bir tahsisi olan bir havuzda tahsis sorunları ... vardır.

Havuzunuzun% 61'inin tüketildiğini düşünün. Tahsisat politikanız RAID10'dur, bu nedenle her şey kopya 2 olduğu için doluya ulaşmadan önce maksimum% 50 havuz tüketimi ile sonuçlanmalıdır. Sadece tahmin edebilirim, ama muhtemelen bir dengenin ortasında tahsis edildi. Cihazınızda, sahip olduğunuz disklerle bir RAID 10 ile yeniden dengelenecek alan kalmadı. % 61'e ulaşmanızın tek nedeni, disklerinizin tutarsızlığı, bazıları doğrusal olarak tek ayırmayla ve çoğunu RAID 10'da ayırmasıdır.

Hiçbir şeyi değiştirmeden yer kazanmak istiyorsanız tek bir tahsis politikasına yeniden bakabilirsiniz. Ayrıca daha fazla disk ekleyebilir veya disklerin boyutunu artırabilirsiniz. VEYA, bu durumda yaptığınız gibi, havuzunuzun aslında RAID 10 ile dengelenebilmesi için bir grup dosyayı silebilirsiniz (genel olarak% 50'den az olacağı için). Dosyaları sildikten sonra yeniden dengelediğinizden emin olun, aksi halde bu gereksiz ayırma politikasına sahip olursunuz.

Özellikle, bu dosyaları sildikten sonra yeniden dengelenirken RAID 10'u bu ayrı ayrı bloklardan kurtulduğunuzdan emin olmak için uygulayın:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.