Tidak dapat membuat file di sistem file XFS besar


24

Kami memiliki server Linux dengan sistem file 4 TB, yang digunakan untuk menyimpan repositori subversi. Ada banyak repositori, beberapa di antaranya telah digunakan selama beberapa tahun.

Disk awalnya sekitar 1 TB, tetapi kami mulai kehabisan ruang dan meningkatkannya menjadi 4 TB sekitar setahun yang lalu. Sekarang, orang melaporkan tidak dapat memeriksa file ke dalam repo mereka. Pesan kesalahannya adalah No space left on device.

Disk memiliki sekitar 1,5 TB gratis, dan juga melaporkan memiliki inode gratis - namun, tidak mungkin untuk membuat file baru di dalamnya. Masih mungkin untuk memperbarui file lama, dan sebentar-sebentar beberapa repositori akan diperbarui, tetapi repositori yang sama mungkin gagal pada upaya berikutnya.

Jawaban:


44

Alasan untuk masalahnya

Masalahnya ternyata bagaimana XFS mengalokasikan inode. Tidak seperti kebanyakan sistem file, alokasi terjadi secara dinamis ketika file baru dibuat. Namun, kecuali Anda menentukan sebaliknya, inode terbatas pada nilai 32-bit, yang berarti bahwa mereka harus masuk dalam terabyte penyimpanan pertama pada sistem file. Jadi jika Anda benar-benar mengisi terabyte pertama itu, dan kemudian Anda memperbesar disk, Anda masih tidak dapat membuat file baru, karena inode tidak dapat dibuat di ruang baru.

Solusi 1 - ubah opsi pemasangan

Salah satu solusinya adalah memasang kembali sistem file dengan opsi mount inode64. Namun beberapa aplikasi akan berperilaku aneh pada ini (misalnya MySQL), dan NFS akan sangat bingung. Jadi, jika Anda tidak yakin sistem Anda akan bekerja dengan opsi ini, Anda dapat beralih ke opsi berikutnya.

Solusi 2 - pindahkan file

Solusi kedua adalah menemukan beberapa file yang saat ini disimpan dalam terabyte pertama, dan memindahkannya ke area lain dari sistem file.

Bergerak berdasarkan usia

Dalam kasus kami, ini mudah - sistem file telah digunakan selama bertahun-tahun, jadi kami dapat dengan mudah menemukan file tertua dan memindahkannya dari sistem file, dan kemudian memindahkannya kembali. Ini mudah dilakukan menggunakan find:

find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt

memberi kami daftar yang berisi ukuran dan nama direktori untuk semua direktori tepat 3 tingkat di bawah mountpoint, yang lebih tua dari 2 tahun. Kami kemudian dapat mengurutkan daftar untuk menemukan direktori terbesar, dan menggunakannya mvuntuk memindahkan mereka ke sistem file lain dan kembali lagi.

Bergerak berdasarkan grup alokasi

Jika Anda tidak bisa hanya berdasarkan usia, misalnya ketika banyak file dibuat pada saat yang sama, Anda masih dapat menemukan file yang tepat untuk dipindahkan, tetapi itu membutuhkan waktu lebih lama.

XFS memiliki grup alokasi (alias AG ), dimulai dengan 0. Anda bisa memeriksa ukuran blok dan jumlah blok dari masing-masing AG untuk mengetahui grup mana yang berada pada terabyte pertama, menggunakan xfs_info /path/to/mountpoint. Atau Anda bisa memeriksa beberapa AG pertama untuk melihat mana yang penuh, dan kemudian menghapusnya.

  1. Memeriksa ruang kosong dalam empat AG pertama:
untuk ag di `seq 0 1 5`; lakukan echo freespace dalam AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total gratis"; selesai

Jika total ruang kosong di grup mana pun kurang dari 40, Anda tidak akan dapat membuat file baru di dalamnya.

  1. Temukan file di AG itu

Ini perlu memeriksa metadata untuk setiap file pada sistem file. Ini akan memakan waktu lama ... Berikut sarannya:

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

Anda kemudian dapat grep untuk " 0 "(itu spasi, nol dan spasi lain) untuk menemukan semua file pada AG 0, grep untuk " 1 "menemukan yang ada di AG 1, dll ... Mulai dengan AG 0, pindahkan file terbesar (menggunakan file 0 mv, tidak cp!) lalu kembali lagi. Ulangi sampai Anda memiliki ruang kosong yang cukup banyak.

Hasil

Setelah kami memindahkan cukup file dari / ekstra dan kembali lagi, ada banyak ruang di AG 0 dan sekali lagi memungkinkan untuk membuat file baru.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.