Dlaczego moje systemy plików XFS nagle zużywają więcej miejsca i są pełne rzadkich plików?

62

Od prawie 10 lat prowadzę systemy plików XFS jako partycje danych / wzrostu na różnych serwerach Linux.

Zauważyłem dziwne zjawisko na ostatnich serwerach CentOS / RHEL z wersją 6.2+.

Stabilne użycie systemu plików stało się bardzo zmienne po przejściu na nowszą wersję systemu operacyjnego z wersji EL6.0 i EL6.1. Systemy początkowo zainstalowane z EL6.2 + wykazują takie samo zachowanie; pokazujące dzikie wahania w wykorzystaniu dysku na partycjach XFS (patrz niebieska linia na wykresie poniżej).

Przed i po. Aktualizacja z 6.1 do 6.2 nastąpiła w sobotę. wykres xfs

Wykres wykorzystania dysku w tym samym systemie w poprzednim kwartale pokazuje fluktuacje w ciągu ostatniego tygodnia. wprowadź opis zdjęcia tutaj

Zacząłem sprawdzać systemy plików pod kątem dużych plików i niekontrolowanych procesów (być może plików dziennika?). Odkryłem, że moje największe pliki zgłaszały różne wartości od dui ls. Praca duz --apparent-sizeprzełącznikiem i bez niego ilustruje różnicę.

# du -skh SOD0005.TXT
29G     SOD0005.TXT

# du -skh --apparent-size SOD0005.TXT
21G     SOD0005.TXT

Szybkie sprawdzenie za pomocą narzędzia ncdu w całym systemie plików przyniosło:

Total disk usage: 436.8GiB  Apparent size: 365.2GiB  Items: 863258

System plików jest pełen rzadkich plików , z prawie 70 GB utraconego miejsca w porównaniu z poprzednią wersją systemu operacyjnego / jądra!

Przeglądałem Bugzillę Red Hat i zmieniłem dzienniki, aby zobaczyć, czy były jakieś raporty o tym samym zachowaniu lub nowe ogłoszenia dotyczące XFS.

Nada.

Podczas aktualizacji przeszedłem z wersji jądra 2.6.32-131.17.1.el6 na 2.6.32-220.23.1.el6 ; brak zmiany w mniejszym numerze wersji.

Sprawdziłem fragmentację pliku za pomocą filefragnarzędzia. Niektóre z największych plików na partycji XFS miały tysiące rozmiarów. Uruchamianie z defragmentacją online przy xfs_fsr -vwolnym okresie aktywności pomogło tymczasowo zmniejszyć zużycie dysku (patrz środa na pierwszym wykresie powyżej). Jednak użycie gwałtownie wzrosło, gdy tylko wznowiono ciężką aktywność systemu.

Co tu się dzieje?

ewwhite
źródło
2
Mmm ... Piazza ....
Tom O'Connor,

Odpowiedzi:

76

Prześledziłem ten problem z powrotem do dyskusji o zatwierdzeniu do drzewa źródłowego XFS z grudnia 2010 r. Łatka została wprowadzona w jądrze 2.6.38 (i oczywiście później przeniesiona do niektórych popularnych jąder dystrybucji Linuksa).

Obserwowane wahania użycia dysku są wynikiem nowej funkcji; XFS Dynamiczna spekulacyjna wstępna alokacja EOF .

Jest to krok w kierunku zmniejszenia fragmentacji plików podczas zapisywania strumieniowego poprzez spekulacyjne przydzielanie miejsca wraz ze wzrostem rozmiarów plików. Ilość wstępnie przydzielonego miejsca na plik jest dynamiczna i jest przede wszystkim funkcją wolnego miejsca dostępnego w systemie plików (aby całkowicie wykluczyć brak miejsca).

Zgodnie z tym harmonogramem:

freespace       max prealloc size
  >5%             full extent (8GB)
  4-5%             2GB (8GB >> 2)
  3-4%             1GB (8GB >> 3)
  2-3%           512MB (8GB >> 4)
  1-2%           256MB (8GB >> 5)
  <1%            128MB (8GB >> 6)

Jest to interesujący dodatek do systemu plików, ponieważ może pomóc w przypadku niektórych fragmentów plików, z którymi mam do czynienia.

Dodatkową przestrzeń można odzyskać tymczasowo, zwalniając pamięć podręczną, dentries i i-węzły za pomocą:

sync; echo 3 > /proc/sys/vm/drop_caches

Tę funkcję można całkowicie wyłączyć, definiując allocsizewartość podczas montowania systemu plików. Domyślna wartość dla XFS to allocsize=64k.

Wpływ tej zmiany będzie prawdopodobnie odczuwalny przez systemy monitorowania / progowania (w taki sposób ją złapałem), ale wpłynął również na systemy baz danych i może powodować nieprzewidywalne lub niepożądane wyniki dla maszyn wirtualnych z ograniczoną alokacją zasobów i macierzy pamięci masowej (będą używać więcej miejsca niż się spodziewasz).

Podsumowując, zaskoczyło mnie to, ponieważ nie było wyraźnego ogłoszenia zmiany systemu plików na poziomie dystrybucji ani nawet w monitorowaniu listy mailingowej XFS .


Edycja :
Wydajność na woluminach XFS dzięki tej funkcji została znacznie poprawiona. Widzę spójne fragmentowanie <1% w tomach, które wcześniej wykazywały fragmentację do 50%. Wydajność zapisu rośnie na całym świecie!

Statystyki z tego samego zestawu danych, porównujące starszą wersję XFS z wersją w EL6.3.

Stary:

# xfs_db -r -c frag /dev/cciss/c0d0p9
actual 1874760, ideal 1256876, fragmentation factor 32.96%

Nowy:

# xfs_db -r -c frag /dev/sdb1
actual 1201423, ideal 1190967, fragmentation factor 0.87%
ewwhite
źródło
4
Milion zwolenników i moje królestwo
Joel E. Salas,
1
Dziękuję Ci! Właśnie zaktualizowaliśmy system z Debian Squeeze do Ubuntu i zastanawialiśmy się, dlaczego du i ls pokazali tak bardzo różne wartości dla dużych plików (np. 50Mb vs 64Mb)
Giles Thomas
1
@ewwhite Czy wyłączyłeś tę funkcję, aby odzyskać miejsce? A może ten artykuł mówi tylko: hej, ta funkcja jest przyczyną rozbieżności w zgłaszanych rozmiarach? To brzmi jak „w systemach baz danych lub maszynach wirtualnych z ograniczoną alokacją, rozważ to wyłączenie”, ale ostatecznie nie jestem pewien, co postanowiłeś zrobić.
JDS
2
@ jds Zostawiam to włączone. Eliminuje fragmentację i zwiększył wydajność moich aplikacji.
ewwhite
3
Och, wspaniałe znalezisko. To wykorzystało 750 GB na 35 GB plików. Po xfs_fsrprzywróceniu do około 35 GB. Muszę na to