Bug dalam implementasi fitur ext4 dir_index
yang Anda gunakan pada sistem file tujuan Anda.
Solusi:buat ulang sistem file tanpa dir_index. Atau nonaktifkan fitur menggunakan tune2fs (beberapa kehati-hatian diperlukan, lihat tautan terkait Novell SuSE 10/11:Nonaktifkan Pengindeksan H-Tree pada Sistem File ext3 yang meskipun terkait dengan ext3 mungkin membutuhkan kehati-hatian serupa.
(get a really good backup made of the filesystem)
(unmount the filesystem)
tune2fs -O ^dir_index /dev/foo
e2fsck -fDvy /dev/foo
(mount the filesystem)
- ext4:Kesalahan "Tidak ada ruang tersisa di perangkat" yang misterius
ext4 memiliki fitur bernama dir_index yang diaktifkan secara default, yang cukup rentan terhadap hash-collision.
......
ext4 memiliki kemungkinan untuk hash nama file isinya. Ini meningkatkan kinerja, tetapi memiliki masalah "kecil":ext4 tidak mengembangkan hashtable-nya, saat mulai terisi. Sebaliknya, ia mengembalikan -ENOSPC atau “tidak ada ruang tersisa di perangkat”.
Saran untuk pilihan yang lebih baik daripada ext4 untuk menyimpan banyak file kecil:
Jika Anda menggunakan sistem file sebagai penyimpanan objek, Anda mungkin ingin melihat menggunakan sistem file yang berspesialisasi dalam hal itu, mungkin merugikan karakteristik lainnya. Pencarian cepat Google menemukan Ceph , yang tampaknya open source, dan dapat dipasang sebagai sistem file POSIX, tetapi juga diakses dengan API lain. Saya tidak tahu apakah itu layak digunakan pada satu host, tanpa memanfaatkan replikasi.
Sistem penyimpanan objek lainnya adalah Swift OpenStack . Dokumen desainnya mengatakan menyimpan setiap objek sebagai file terpisah, dengan metadata di xattrs. Inilah artikel tentang itu. Panduan penyebaran mereka mengatakan mereka menemukan XFS memberikan kinerja terbaik untuk penyimpanan objek. Jadi meskipun beban kerja bukan yang terbaik dari XFS, itu tampaknya lebih baik daripada pesaing ketika RackSpace sedang menguji berbagai hal. Mungkin Swift menyukai XFS karena XFS memiliki dukungan yang baik/cepat untuk atribut yang diperluas. Mungkin ext3/ext4 akan bekerja dengan baik pada disk tunggal sebagai backend penyimpanan objek jika metadata tambahan tidak diperlukan (atau jika disimpan di dalam file biner).
Swift melakukan replikasi / load-balancing untuk Anda, dan menyarankan agar Anda memberikannya sistem file yang dibuat pada disk mentah, bukan RAID . Ini menunjukkan bahwa beban kerjanya pada dasarnya adalah kasus terburuk untuk RAID5 (yang masuk akal jika kita berbicara tentang beban kerja dengan penulisan file kecil. XFS biasanya tidak mengemasnya secara langsung, jadi Anda tidak dapatkan penulisan full-stripe, dan RAID5 harus melakukan beberapa pembacaan untuk memperbarui parity stripe.Swift docs juga berbicara tentang penggunaan 100 partisi per drive.Saya menganggap itu adalah istilah Swift, dan tidak berbicara tentang membuat 100 sistem file XFS yang berbeda pada masing-masing diska SATA.
Menjalankan XFS terpisah untuk setiap disk sebenarnya merupakan perbedaan besar . Alih-alih satu raksasa peta inode gratis, setiap disk akan memiliki XFS terpisah dengan daftar bebas terpisah. Selain itu, ini menghindari penalti RAID5 untuk penulisan kecil.
Jika Anda sudah memiliki perangkat lunak yang dibangun untuk menggunakan sistem file secara langsung sebagai penyimpanan objek, daripada melalui sesuatu seperti Swift untuk menangani replikasi / penyeimbangan beban, maka Anda setidaknya dapat menghindari semua file Anda dalam satu direktori. (Saya tidak melihat dokumen Swift mengatakan bagaimana mereka menata file mereka ke beberapa direktori, tapi saya yakin mereka melakukannya.)
Dengan hampir semua sistem file normal, akan membantu jika menggunakan struktur seperti
1234/5678 # nested medium-size directories instead of
./12345678 # one giant directory
Mungkin sekitar 10k entri masuk akal, jadi mengambil 4 karakter yang terdistribusi dengan baik dari nama objek Anda dan menggunakannya sebagai direktori adalah solusi yang mudah. Itu tidak harus sangat seimbang. Direktori 100k yang aneh mungkin tidak akan menjadi masalah yang terlihat, begitu pula beberapa direktori kosong.
XFS tidak ideal untuk massa besar file kecil. Ia melakukan apa yang dapat dilakukannya, tetapi lebih dioptimalkan untuk streaming penulisan file yang lebih besar. Ini sangat bagus secara keseluruhan untuk penggunaan umum. Itu tidak memiliki ENOSPC
pada tabrakan dalam pengindeksan direktori (AFAIK), dan dapat menangani memiliki satu direktori dengan jutaan entri. (Tapi masih lebih baik menggunakan setidaknya pohon satu tingkat.)
Dave Chinner memiliki beberapa komentar tentang kinerja XFS dengan sejumlah besar inode yang dialokasikan, yang mengarah ke touch
yang lambat pertunjukan. Menemukan inode gratis untuk dialokasikan mulai memakan lebih banyak waktu CPU, karena bitmap inode gratis terfragmentasi. Perhatikan bahwa ini bukan masalah satu-direktori-besar vs. banyak direktori, melainkan masalah banyak inode yang digunakan di seluruh sistem file. Memisahkan file Anda menjadi beberapa direktori membantu beberapa masalah, seperti yang ext4 tersendat di OP, tetapi bukan masalah seluruh disk untuk melacak ruang kosong. Sistem file terpisah-per-disk Swift membantu dalam hal ini, dibandingkan dengan XFS raksasa pada RAID5.
Saya tidak tahu apakah btrfs bagus dalam hal ini, tapi saya pikir itu mungkin. Saya pikir Facebook mempekerjakan pengembang utamanya karena suatu alasan. :P Beberapa tolok ukur yang pernah saya lihat, seperti untarring sumber kernel Linux, menunjukkan btrf bekerja dengan baik.
Saya tahu reiserf dioptimalkan untuk kasus ini, tetapi hampir tidak dipertahankan lagi. Saya benar-benar tidak bisa merekomendasikan pergi dengan reiser4. Mungkin menarik untuk bereksperimen. Tapi sejauh ini itu adalah pilihan yang paling tidak tahan masa depan. Saya juga melihat laporan penurunan kinerja pada reiserFS yang sudah tua, dan tidak ada alat defrag yang bagus. (google filesystem millions of small files
, dan lihat beberapa jawaban stackexchange yang ada.)
Saya mungkin melewatkan sesuatu, jadi rekomendasi terakhir:tanyakan tentang ini di serverfault! Jika saya harus memilih sesuatu sekarang, saya akan mengatakan mencoba BTRFS, tetapi pastikan Anda memiliki cadangan. (khususnya jika Anda menggunakan redundansi banyak disk bawaan BTRFS, alih-alih menjalankannya di atas RAID. Keuntungan kinerjanya bisa besar, karena file kecil adalah berita buruk untuk RAID5, kecuali itu adalah beban kerja yang kebanyakan dibaca.)
Untuk masalah ini di bawah ini adalah apa yang saya lakukan untuk memperbaikinya (Anda mungkin memerlukan akses sudo untuk langkah-langkah di bawah):
-
Ruang Inode yang digunakan adalah 100% yang dapat diambil menggunakan perintah di bawah ini
df -i /
Filesystem Inodes IUsed IFree IUse% Dipasang di
/dev/xvda1 524288 524288 o 100% /
- Perlu membebaskan iNoted, maka perlu mencari file yang memiliki jumlah i node di sini menggunakan perintah di bawah ini:
Coba temukan apakah ini masalah inode dengan:
df -ih
Coba temukan folder root dengan jumlah inode yang besar:
for i in /*; do echo $i; find $i |wc -l; done
Coba temukan folder tertentu:
for i in /src/*; do echo $i; find $i |wc -l; done
- sekarang kami telah memusatkan perhatian pada folder dengan sejumlah besar file di dalamnya. Jalankan perintah di bawah ini satu per satu untuk menghindari kesalahan (Dalam kasus saya, folder sebenarnya adalah /var/spool/clientmqueue):
find /var/spool/clientmqueue/ -type f -mtime +1050 -exec rm -f {} + find /var/spool/clientmqueue/ -type f -mtime +350 -exec rm -f {} + find /var/spool/clientmqueue/ -type f -mtime +150 -exec rm -f {} + find /var/spool/clientmqueue/ -type f -mtime +50 -exec rm -f {} +