Niska wydajność przesyłania małych plików przez NFS

12

Używam Openfiler 2.3 na HP ML370 G5, Smart Array P400, dyski SAS połączone za pomocą RAID 1 + 0.

Skonfigurowałem udział NFS z partycji ext3 przy użyciu internetowej konfiguracji Openfiler i udało mi się zainstalować udział z innego hosta. Oba hosty są połączone za pomocą dedykowanego łącza gigabit.

Prosty test porównawczy za pomocą dd:

 $ dd if=/dev/zero of=outfile bs=1000 count=2000000
 2000000+0 records in
 2000000+0 records out
 2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s

Widzę, że może osiągnąć umiarkowaną prędkość transferu (58,0 MB / s).

Ale jeśli skopiuję katalog zawierający wiele małych plików ( .phpi .jpgokoło 1–4 kB na plik) o łącznej wielkości ~ 300 MB, cpproces zakończy się za około 10 minut.

Czy NFS nie nadaje się do przesyłania małych plików, jak powyżej? Czy są jakieś parametry, które należy dostosować?

Arie K.
źródło
Czy to odpowiada na twoje pytanie? NFS słaba wydajność zapisu
Aleksandr Dubinsky

Odpowiedzi:

7

Istnieje wiele powodów, dla których przesyłanie wielu małych plików zawsze będzie wolniejsze niż przesyłanie jednego dużego pliku. W celu odczytania pliki są bardziej prawdopodobne, że zostaną rozproszone po całym dysku, co wymaga wyszukiwania w dowolnym miejscu, aby je zdobyć. Jak wspomniał Evan, w przypadku NFS (lub dowolnego innego systemu plików!) Są także zaangażowane metadane, co również komplikuje sytuację.

Możesz spróbować zwiększyć parametry rsizei wsizedo montowania NFS i sprawdzić, czy to nieco poprawi wydajność. Sprawdź także to pytanie dotyczące dostrajania NFS pod kątem minimalnych opóźnień, ponieważ zawiera wiele pomocnych porad, które pomogą w przypadku wielu małych transferów plików.

Kamil Kisiel
źródło
8

Nie mam dużego doświadczenia z NFS, ale moje doświadczenia z innymi protokołami sieciowego udostępniania plików mówią, że wydajność spada w scenariuszu „wielu małych plików” niemal uniwersalnie. Występuje opóźnienie w obie strony i opóźnienie w dużej grupie plików sumuje się.

Evan Anderson
źródło
4

Czy próbowałeś już z innym systemem plików, takim jak XFS? Rozwiązało to wszystkie moje problemy podczas wykonywania ekstremalnych ilości małych transferów bloków iSCSI. Nie mam pojęcia dlaczego.

Ponadto, iSCSI / NFS jest zwykle skonfigurowany dla dość dużych ramek danych (duże ramki itp.), Może zaszkodzić, jeśli kopiujesz małe pliki pojedynczo. Może tar'ing, a następnie transfer pomógłby ci.

Pauska
źródło
1
Tak, mój test wykazał pewną poprawę przy użyciu XFS niż ext3 (~ 8 minut vs ~ 14 minut).
Arie K
1
Trochę? Powiedziałbym, że to całkiem duża poprawa :)
pauska
1

Sprawdź, czy korzystasz z połączenia TCP ( mount -t nfs -o tcp host: / mount / target ). Nie wpłynie to na wydajność nowoczesnych systemów, ale małe operacje we / wy mogą znacznie się poprawić, jeśli sieć jest załadowana.

Powinieneś także wypróbować inny system plików; ext3 jest w zasadzie najwolniejszym ze wszystkich. Jest solidny, dobrze znany, ale nie nadaje się do serwera plików. XFS jest znacznie lepszy, a reiserfs jest także znacznie lepszy w małych IO.

wazoox
źródło
1

Jeśli chcesz przesłać duże drzewo katalogów małych plików przez NFS i możesz zalogować się na serwerze, najlepszym sposobem na to jest utworzenie pliku tar, który jest automatycznie wyodrębniany na kliencie w następujący sposób:

tar c mydirectory | ssh użytkownik @ host tar -xf - -C destdir

W ten sposób tylko jeden „plik” jest przesyłany przez sieć i natychmiast masz wszystkie pliki na hoście.


źródło
0

Aby dodać do odpowiedzi Evana, masz również cały narzut związany z tworzeniem metadanych (wpisów w katalogu itp.) Dla każdego kopiowanego pliku.

TCampbell
źródło
0

Podobnym rozwiązaniem jak odpowiedź Chrisa byłoby okresowe synchronizowanie plików z klientami. Jeśli chcesz wprowadzić dwukierunkowe zmiany, możesz także użyć unison.

Ztyx
źródło
0

Problem polega na tym, że Twój udział jest eksportowany z syncopcją (domyślnie). Użyj, asyncaby znacznie przyspieszyć zapisy. Zobacz nfs.sourceforge.net/nfs-howto/ar01s05.html

Aleksandr Dubinsky
źródło