Nie można utworzyć plików w dużym systemie plików XFS


24

Mamy serwer Linux z systemem plików 4 TB, który służy do przechowywania repozytoriów subversion. Istnieje wiele repozytoriów, z których kilka jest używanych od kilku lat.

Dysk początkowo miał około 1 TB, ale zaczęło nam brakować miejsca i zwiększyliśmy go do 4 TB około rok temu. Teraz ludzie zgłaszają, że nie mogą rejestrować plików w swoich repozytoriach. Komunikat o błędzie to No space left on device.

Dysk ma około 1,5 TB wolnego, a także raporty o wolnych i-węzłach - a jednak nie można utworzyć na nim nowego pliku. Nadal można aktualizować stare pliki i sporadycznie niektóre repozytoria będą aktualizowane, ale to samo repozytorium może zawieść przy następnej próbie.

Odpowiedzi:


44

Przyczyna problemu

Problemem okazuje się sposób, w jaki XFS przydziela i-węzły. W przeciwieństwie do większości systemów plików, alokacja następuje dynamicznie w miarę tworzenia nowych plików. O ile nie określono inaczej, i-węzły są ograniczone do wartości 32-bitowych, co oznacza, że ​​muszą mieścić się w pierwszym terabajcie pamięci w systemie plików. Więc jeśli całkowicie wypełnisz pierwszy terabajt, a następnie powiększysz dysk, nadal nie będziesz w stanie tworzyć nowych plików, ponieważ i-węzłów nie można utworzyć na nowej przestrzeni.

Rozwiązanie 1 - zmień opcje montowania

Jednym z rozwiązań jest ponowne zamontowanie systemu plików za pomocą opcji montowania inode64. Jednak niektóre aplikacje będą się w tym dziwnie zachowywać (np. MySQL), a NFS będzie bardzo zdezorientowany. Jeśli więc nie masz pewności, czy Twój system będzie działał z tą opcją, możesz przejść do następnej opcji.

Rozwiązanie 2 - przenieś pliki

Drugim rozwiązaniem jest znalezienie niektórych plików, które są obecnie przechowywane w pierwszym terabajcie, i przeniesienie ich do innego obszaru systemu plików.

Przeprowadzka według wieku

W naszym przypadku było to łatwe - system plików był używany od lat, więc mogliśmy po prostu znaleźć najstarsze pliki i przenieść je z systemu plików, a następnie przenieść z powrotem. Można to łatwo zrobić za pomocą funkcji find:

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

podał nam listę zawierającą rozmiar i nazwę katalogu dla wszystkich katalogów dokładnie 3 poziomy poniżej punktu montowania, które były starsze niż 2 lata. Następnie możemy posortować listę w celu znalezienia największych katalogów i użyć ich mvdo przeniesienia ich do innego systemu plików iz powrotem.

Przeprowadzka według grupy alokacji

Jeśli nie możesz po prostu przejść ze względu na wiek, np. Gdy wiele plików zostało utworzonych jednocześnie, nadal możesz znaleźć odpowiednie pliki do przeniesienia, ale zajmuje to trochę więcej czasu.

XFS ma grupy alokacji (inaczej AG ), zaczynając od 0. Możesz sprawdzić rozmiar bloku i liczbę bloków każdej AG, aby dowiedzieć się, które grupy znajdują się na pierwszym terabajcie xfs_info /path/to/mountpoint. Lub możesz po prostu sprawdzić kilka pierwszych AG, aby zobaczyć, które z nich są pełne, a następnie je wyczyścić.

  1. Sprawdzanie wolnego miejsca w pierwszych czterech AG:
dla ag w `seq 0 1 5`; wykonaj echo w spacji AG AG; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep „total free”; gotowy

Jeśli łączna ilość wolnego miejsca w dowolnej grupie jest mniejsza niż 40, nie będzie można tworzyć w niej nowych plików.

  1. Znajdź pliki w tym AG

Wymaga to sprawdzenia metadanych dla każdego pliku w systemie plików. Zajmie to dużo czasu ... Oto sugestia:

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

Następnie możesz grep dla " 0 "(to spacja, zero i inna spacja), aby znaleźć wszystkie pliki w AG 0, grep, " 1 "aby znaleźć te w AG 1, itp ... Zacznij od AG 0, przenieś największe pliki (używając mv, nie cp!), a następnie z powrotem. Powtarzaj tę czynność, aż będziesz mieć dość wolnego miejsca.

Wynik

Po przeniesieniu wystarczającej liczby plików z / extra, a następnie z powrotem, w AG 0 było dużo miejsca i znów można było tworzyć nowe pliki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.