Kesalahan “Tidak ada ruang yang tersisa di perangkat” meskipun memiliki banyak ruang, pada btrfs

17

Hampir di mana-mana saya mendapatkan kegagalan dalam log mengeluh tentang No space left on device

Log 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)

Log email Dovecot:

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

Output dari 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

Sepertinya ada juga banyak ruang inode. Output daridf -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

Output dari 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

Output dari 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

Apa yang bisa menjadi penyebab hal ini? Saya menggunakan basis linux AMI ec2 kernal versi 4.4.5-15.26.amzn1.x86_64

Memperbarui

Menjalankan perintah yang disarankan di bawah ini btrfs fi balance start -dusage=5 /mnt/durablememberi saya kesalahan berikut:

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

Setelah secara manual menghapus banyak file yang lebih besar hingga ~ 1GB saya reboot mesin dan mencoba lagi, memastikan saya menggunakan sudo, dan perintah dieksekusi. Saya kemudian me-reboot mesin saya sekali lagi untuk ukuran yang baik dan tampaknya telah menyelesaikan masalah

Austin
sumber
Apakah Anda memiliki pengaturan kuota?
Zoredache
Alat generik tidak dapat memahami BTRFS dengan benar, Anda memerlukan alat khusus BTRFS. Silakan tambahkan output dari "btrfs fi show" dan "btrfs fi df / mnt / tahan lama"
Peter Green
@PeterGreen menambahkan output btrfs ... sepertinya Anda menemukan pelakunya.
Austin
Bisakah Anda juga menambahkan output dari perintah kedua yang saya sarankan.
Peter Green
2
Versi kernel sangat penting di sini, karena btrfs memiliki cukup banyak masalah dengan ruang kosong di masa lalu, dan dalam kasus ini adalah contoh lain pembaca di masa depan dapat mengambil manfaat dari informasi itu.
PlasmaHH

Jawaban:

19

Selamat datang di dunia BTRFS. Ini memiliki beberapa fitur yang menggoda tetapi juga beberapa masalah yang menyebalkan.

Pertama, beberapa info pada pengaturan Anda, sepertinya Anda memiliki empat drive dalam volume "raid 10" BTRFS (sehingga semua data disimpan dua kali pada disk yang berbeda). Volume BTRFS ini kemudian diukir menjadi subvolume pada berbagai titik pemasangan. Subvolume berbagi kumpulan ruang disk tetapi memiliki nomor inode yang terpisah dan dapat dipasang di tempat yang berbeda.

BTRFS mengalokasikan ruang dalam "chunk", sebuah chunk dialokasikan untuk kelas tertentu baik data atau metadata. Apa yang dapat terjadi (dan sepertinya telah terjadi dalam kasus Anda) adalah bahwa semua ruang kosong dialokasikan untuk potongan data tanpa meninggalkan ruang untuk metadata

Tampaknya (karena alasan saya tidak sepenuhnya mengerti) bahwa BTRF "kehabisan" ruang metadata sebelum indikator proporsi ruang metadata yang digunakan mencapai 100%.

Ini tampaknya adalah apa yang terjadi dalam kasus Anda, ada banyak ruang data gratis tetapi tidak ada ruang bebas yang belum dialokasikan ke bongkahan dan ruang kosong tidak mencukupi di bongkahan metadata yang ada.

Cara mengatasinya adalah menjalankan "penyeimbangan". Ini akan memindahkan data sehingga beberapa potongan dapat dikembalikan ke kumpulan gratis "global" tempat mereka dapat dialokasikan kembali sebagai potongan metadata

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

Angka setelah -dusagemenetapkan seberapa agresif penyeimbangan kembali, yaitu seberapa dekat dengan mengosongkan blok harus ditulis ulang. Jika saldo mengatakan itu menulis ulang 0 blok coba lagi dengan nilai yang lebih tinggi -dusage.

Jika keseimbangan gagal maka saya akan mencoba me-reboot dan / atau membebaskan beberapa ruang dengan menghapus file.

Peter Green
sumber
9
penyeimbangan kembali adalah defragment baru.
Nathan Osman
1
Mendapatkan ERROR: error during balancing '/mnt/durable' - No space left on devicebahkan setelah menghapus hampir 1 GB dari drive
Austin
Sudahkah Anda mencoba mem-boot ulang (mem-boot ulang setelah pembersihan berfungsi untuk saya ketika saya mengalami masalah serupa).
Peter Green
@PeterGreen Menambahkan konten dmesg | taildalam posting saya setelah mendapatkan kesalahan baru setelah reboot.
Austin
4

Karena Anda menjalankan btrf dengan pengaturan RAID, coba jalankan operasi keseimbangan.

btrfs balance start /var/opt/gitlab

Jika ini memberikan kesalahan karena tidak memiliki cukup ruang, coba lagi dengan sintaks ini:

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

Ulangi operasi ini untuk setiap sistem file btrfs di mana Anda melihat kesalahan tentang ruang. Jika masalah ruang Anda disebabkan oleh metadata yang tidak didistribusikan di seluruh disk yang dicerminkan ini mungkin membebaskan ruang untuk Anda.

virtex
sumber
Saya memang mendapatkan kesalahan tentang ruang. Saat mencoba sintaks lain, itu menunjukkan kepada saya apa yang tampak seperti peringatan: Refusing to explicitly operate on system chunks. Pass --force if you really want to do that.Apakah boleh melakukan?
Austin
coba tanpa -susage=0opsi.
Virtex
2

Pada sistem saya, saya menambahkan pekerjaan berikut di cron.monthly.

The clear_cacheremount ini disebabkan beberapa masalah korupsi btrfs mengalami dengan peta gratis. (Saya pikir mereka akhirnya menemukan masalah, tetapi masalah ini sangat menjengkelkan, saya bersedia membayar untuk membangun kembali peta sebulan sekali.)

Saya meningkatkan usageopsi untuk membebaskan ruang secara bertahap untuk keseimbangan yang lebih besar dan lebih besar.

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

Jika Anda sampai pada titik di mana Anda tidak dapat menyeimbangkan kembali karena Anda memiliki ruang yang tidak cukup, rekomendasinya adalah untuk sementara menambahkan perangkat blok (atau perangkat loopback pada disk lain) dari beberapa jenis volume Anda selama durasi penyeimbangan kembali, dan kemudian Singkirkan.

rrauenza
sumber
Terima kasih banyak @rrauenza! Naskahmu benar-benar menyelamatkan hariku. Dalam kasus saya, perintah keseimbangan berhasil memindahkan potongan hanya dari 60.
Michal Fapso
1

Ini bukan masalah dengan btrf, karena ini adalah sesuatu yang telah dilakukan pada sistem ini. Ini terlihat sebagai hasil dari penyeimbangan kembali yang tidak lengkap dari kebijakan alokasi 'tunggal' menjadi kebijakan alokasi 'raid 10', sebagaimana dibuktikan oleh sejumlah besar blok yang dialokasikan tunggal. Mungkin dimulai sebagai lajang dan kemudian konversi terputus. Kelompok dengan alokasi yang tidak konsisten seperti itu pasti memiliki ... yah, masalah alokasi.

Pertimbangkan bahwa Anda mengonsumsi 61% dari kolam Anda. Kebijakan alokasi Anda adalah RAID10, sehingga akan menghasilkan konsumsi kolam maksimum 50% sebelum mencapai penuh, karena semuanya mereplikasi 2. Inilah sebabnya mengapa konversi Anda dari tunggal ke RAID 10 gagal (dan terus berlanjut). Saya hanya bisa menebak, tapi itu mungkin dialokasikan di tengah penyeimbangan kembali. Tidak ada ruang yang tersisa di perangkat Anda untuk menyeimbangkan kembali ke RAID 10 dengan disk yang Anda miliki. Satu-satunya alasan Anda mencapai 61% adalah karena disk Anda dialokasikan secara tidak konsisten, beberapa linier dengan alokasi tunggal, dan sebagian besar dalam RAID 10.

Anda dapat menyeimbangkan kembali ke kebijakan alokasi tunggal jika Anda ingin mendapatkan ruang tanpa mengubah banyak hal. Anda juga bisa menambahkan lebih banyak disk atau menambah ukuran disk. ATAU Anda bisa, seperti yang telah Anda lakukan dalam kasus ini, hanya menghapus banyak file sehingga kumpulan Anda benar-benar dapat menyeimbangkan ke RAID 10 (karena akan kurang dari 50% dikonsumsi secara keseluruhan). Pastikan Anda menyeimbangkan kembali setelah menghapus file, atau Anda akan tetap memiliki kebijakan alokasi janky ini.

Secara khusus, jalankan RAID 10 ketika menyeimbangkan kembali setelah menghapus file-file itu untuk memastikan Anda menyingkirkan blok-blok yang dialokasikan tunggal itu, seperti:

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

Pengumpul informasi
sumber