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 ( .php
i .jpg
około 1–4 kB na plik) o łącznej wielkości ~ 300 MB, cp
proces 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ć?
performance
nfs
Arie K.
źródło
źródło
Odpowiedzi:
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
rsize
iwsize
do 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.źródło
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ę.
źródło
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.
źródło
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.
źródło
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
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.
źródło
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.
źródło
Problem polega na tym, że Twój udział jest eksportowany z
sync
opcją (domyślnie). Użyj,async
aby znacznie przyspieszyć zapisy. Zobacz nfs.sourceforge.net/nfs-howto/ar01s05.htmlźródło