Büyük XFS dosya sisteminde dosyalar oluşturulamıyor


24

Subversion depolarını depolamak için kullanılan 4 TB dosya sistemine sahip bir Linux sunucumuz var. Birçoğu birkaç yıldır kullanımda olan birçok depo vardır.

Disk başlangıçta yaklaşık 1 TB'dı ancak alanımız tükenmeye başladı ve yaklaşık bir yıl önce 4 TB'a yükseldik. Şimdi, insanlar dosyaları depolarına teslim edemediklerini bildiriyorlar. Hata mesajı No space left on device.

Diskin yaklaşık 1,5 TB boş alanı vardır ve ayrıca boş düğümleri olduğunu da bildirmektedir - ve henüz üzerinde yeni bir dosya oluşturmak mümkün değildir. Eski dosyaları güncellemek hala mümkündür ve zaman zaman bazı depolar güncellenir, ancak aynı depo bir sonraki denemede başarısız olabilir.

Yanıtlar:


44

Sorunun nedeni

Sorun, XFS'nin inodeları nasıl paylaştığıyla ilgili. Çoğu dosya sisteminden farklı olarak, yeni dosyalar oluşturuldukça dağıtım dinamik olarak gerçekleşir. Ancak, aksi belirtilmedikçe, inode'lar 32 bitlik değerlerle sınırlıdır; bu, dosya sistemindeki ilk terabaytlık depoya sığmaları gerektiği anlamına gelir. Bu yüzden, ilk terabayt'ı tamamen doldurduysanız ve sonra diski büyütüyorsanız, inode'lar yeni alanda oluşturulamadığından, hala yeni dosyalar oluşturamazsınız.

1. Çözüm - montaj seçeneklerini değiştirin

Çözümlerden biri, dosya sistemini mount seçeneğiyle yeniden monte etmektir inode64. Bununla birlikte, bazı uygulamalar bu konuda tuhaf davranacaktır (örneğin, MySQL) ve NFS'nin kafası karışacaktır. Dolayısıyla, sisteminizin bu seçenekle çalışacağından emin değilseniz, bir sonraki seçeneğe geçebilirsiniz.

2. Çözüm - dosyaları taşıyın

İkinci çözüm, şu anda ilk terabaytta depolanan dosyaların bazılarını bulmak ve bunları dosya sisteminin başka bir alanına taşımaktır.

Yaşa göre taşıma

Bizim durumumuzda, bu kolaydı - dosya sistemi yıllardır kullanılıyordu, bu yüzden en eski dosyaları bulabildik ve onları dosya sisteminden uzağa taşıyabildik ve sonra geri taşıyabildik. Bu kolayca bulmak kullanarak yapıldı:

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

2 yıldan daha eski olan bağlama noktasının tam 3 seviyesindeki tüm dizinler için boyut ve dizin adını içeren bir liste verdi. Daha sonra en büyük dizinleri bulmak için listeyi sıralayabilir ve mvbunları başka bir dosya sistemine taşımak ve tekrar kullanmak için kullanabiliriz .

Tahsisat grubuna göre taşıma

Yaşınıza göre kolayca gidemiyorsanız, örneğin aynı anda birçok dosya oluşturulduğunda, taşınacak doğru dosyaları hala bulabilirsiniz, ancak bu işlem biraz zaman alır.

XFS (aka ayırma gruplarına sahip AG kullanarak, ilk terabaytın üzerinde edilebilen gruplar olan anlamaya bloğu ve her AG'nin bloklarının sayısını kontrol edebilir 0 ile başlayarak, s) xfs_info /path/to/mountpoint. Veya hangilerinin dolu olduğunu görmek için ilk birkaç AG'yi kontrol edebilir ve sonra bunları temizleyebilirsiniz.

  1. İlk dört AG'de boş alanı kontrol etme:
seq 0 1 5'teki ag için; AG $ ag’da boş alan yok mu; xfs_db -r -c "serbest -s-a-$ ag" / dev / CACHE / CACHE; grep "toplamı serbest"; tamam

Herhangi bir gruptaki toplam boş alan 40'tan küçükse, içinde yeni dosyalar oluşturamazsınız.

  1. Bu AG’deki dosyaları bulun

Bu, dosya sistemindeki her bir dosyanın meta verilerinin kontrol edilmesini gerektirir. Uzun zaman alacak ... İşte bir öneri:

   find / extra -mindepth 3 tipi f türü -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt

" 0 "AG 0'daki tüm dosyaları bulmak için grep (bu bir boşluk, sıfır ve başka bir alan), AG 1 üzerindeki dosyaları " 1 "bulmak için grep yapabilirsiniz. AG 0 ile başlayın, en büyük dosyaları uzaklaştırın (kullanarak mv, değil cp!) ve sonra tekrar geri. Boş alan yeterli miktarda alana kadar tekrarlayın.

Sonuç

Bir kez / extra'dan yeterince uzak bir yere taşıdık ve sonra tekrar geri döndük, AG 0'da çok fazla alan vardı ve bir kez daha yeni dosyalar oluşturmak mümkün oldu.

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.