NFS słaba wydajność zapisu

20

Mam dwie maszyny podłączone do 10Gbit Ethernet. Niech jeden z nich będzie serwerem NFS, a drugi klientem NFs.

Testowanie prędkości sieci przez TCP z iperfpokazuje ~ 9,8 Gbit / s w obu kierunkach, więc sieć jest OK.

Testowanie wydajności dysku serwera NFS:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

Wynik wynosi ~ 150 MB / s, więc dysk działa dobrze do zapisu.

Serwer /etc/exportsto:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

Klient montuje ten udział w swoim lokalnym /mnt/testz następującymi opcjami:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

Jeśli spróbuję pobrać duży plik (~ 5 Gb) na maszynę kliencką z udziału NFS, otrzymam wydajność około 130-140 MB / s, która jest zbliżona do wydajności dysku lokalnego serwera, więc jest zadowalająca.

Ale kiedy próbuję załadować duży plik do udziału NFS, przesyłanie zaczyna się od ~ 1,5 Mb / s, powoli wzrasta do 18-20 Mb / s i przestaje rosnąć. Czasami udział „zawiesza się” na kilka minut przed faktycznym rozpoczęciem przesyłania, tj. Ruch między hostami zbliża się do zera, a jeśli wykonam ls /mnt/test, nie wraca w ciągu minuty lub dwóch. Następnie lspolecenie powraca i przesyłanie rozpoczyna się z początkową prędkością 1,5 Mb / s.

Kiedy prędkość wysyłania osiąga maksymalną wartość (18-20 Mb / s), uruchamiam iptraf-ngi pokazuje ona ruch na interfejsie sieciowym w wysokości ~ 190 Mbit / s, więc sieć nie jest tutaj wąskim gardłem, podobnie jak dysk twardy serwera.

Co próbowałem:

1. Skonfiguruj serwer NFS na trzecim hoście, który był podłączony tylko za pomocą 100Mbit Ethernet NIC. Wyniki są analogiczne: DL wykazuje dobrą wydajność i prawie pełne wykorzystanie sieci 100 Mb / s, przesyłanie nie działa szybciej niż setki kilobajtów na sekundę, pozostawiając wykorzystanie sieci bardzo niskie (zgodnie z 2,5 Mbit / s iptraf-ng).

2. Próbowałem dostroić niektóre parametry NFS:

  • sync lub async

  • noatime

  • Nie hard

  • rsizei wsizesą maksymalne w moich przykładach, więc próbowałem je zmniejszać w kilku krokach do 8192

3. Próbowałem zmienić komputer kliencki i serwerowy (skonfigurować serwer NFS na poprzednim kliencie i odwrotnie). Co więcej, jest jeszcze sześć serwerów o tej samej konfiguracji, więc próbowałem zamontować je ze sobą w różnych wariantach. Ten sam wynik.

4. MTU = 9000, MTU = 9000 i agregacja łączy 802.3ad, agregacja łączy z MTU = 1500.

5. tuning sysctl:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

Ten sam wynik.

6. Zamontuj z localhost:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

I tutaj otrzymuję ten sam wynik: pobieranie z /mnt/testmount/jest szybkie, przesyłanie do /mnt/testmount/jest bardzo wolne, nie szybsze niż 22 MB / s, i istnieje niewielkie opóźnienie przed faktycznym rozpoczęciem przesyłania. Czy to oznacza, że ​​stos sieci działa bezbłędnie, a problem tkwi w NFS?

Wszystko to nie pomogło, wyniki nie różniły się znacząco od domyślnej konfiguracji. echo 3 > /proc/sys/vm/drop_cacheszostał wykonany przed wszystkimi testami.

MTU wszystkich NICS na wszystkich 3 hostach wynosi 1500, nie przeprowadzono niestandardowego strojenia sieci. Przełącznik Ethernet to Dell MXL 10 / 40Gbe.

System operacyjny to CentOS 7.

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Jakie ustawienia mi brakuje? Jak sprawić, by NFS pisał szybko i bez zawieszeń?

Siergiej
źródło
1
Masz dość dobrze zaokrąglony przypadek testowy, ale spróbuję zamontować na samym serwerze i napisać stamtąd, w ten sposób możesz dowiedzieć się, czy wina NFS lub stosu sieciowego jest winy. Spróbuj także przełączyć serwer i klienta (eksportuj z klienta, montuj na serwerze), a także używając zupełnie innego klienta. śledzenie procesów serwera / klienta niczego nie ujawniło?
Dalibor Karlović
@ DaliborKarlović Próbowałem wszystkich oprócz strace i dodałem informacje do pytania. Montowanie z hosta lokalnego działa wolno, więc stos i przełączniki sieciowe nie wydają się być winne. Używam NFS w przestrzeni jądra i Operation not permittedpróbuję dołączyć strace do procesu NFS.
Siergiej
Zakładam, że oznacza to, że możesz całkowicie wykluczyć stos sieciowy (ale musisz to zrobić, aby się upewnić). Powinieneś być w stanie prześledzić każdy proces jako użytkownik root, jeśli nie zostanie dotknięty przez określony błąd .
Dalibor Karlović
@ DaliborKarlović Z pewnością próbuję strace jako root. Jestem w stanie dołączyć do dowolnego procesu przestrzeni użytkownika, ale nie do procesu jądra. Ale jakie informacje mogę uzyskać z jego wyników? Podejrzewam, że wygeneruje setki tysięcy linii wyjściowych, jeśli dołączę go do NFS i zacznę ładować. Czy powinienem zwracać uwagę na niezerowe wartości zwracane?
Siergiej
Masz rację, nie myślałem o tym, że jest to proces niezwiązany z użytkowaniem. Spodziewałbym się zobaczyć, co robi, gdy „zawiesza się” na początku przesyłania, może to być coś trywialnego, jak źle skonfigurowane odwrotne wyszukiwanie DNS.
Dalibor Karlović

Odpowiedzi:

3

Korzystasz z opcji synchronizacji w wyciągu eksportowym. Oznacza to, że serwer potwierdza operacje zapisu dopiero po ich faktycznym zapisaniu na dysk. Biorąc pod uwagę, że masz wirujący dysk (tj. Bez dysku SSD), wymaga to średnio co najmniej 1/2 obrotu dysku na operację zapisu, co jest przyczyną spowolnienia.

Korzystając z ustawienia asynchronizacji, serwer natychmiast potwierdza operację zapisu dla klienta, gdy jest ona przetwarzana, ale jeszcze nie zapisana na dysku. Jest to trochę bardziej zawodne, np. W przypadku awarii zasilania, gdy klient otrzymał potwierdzenie za operację, która się nie wydarzyła. Jednak zapewnia ogromny wzrost wydajności zapisu.

(edytuj) Właśnie widziałem, że już przetestowałeś opcje asynchroniczne vs synchroniczne. Jednak jestem prawie pewien, że jest to przyczyną problemu z obniżeniem wydajności - kiedyś miałem dokładnie to samo wskazanie przy konfiguracji idencitcal. Może przetestujesz to jeszcze raz. Czy podałeś opcję asynchroniczną na wyciągu eksportowym serwera ORAZ podczas operacji montowania na kliencie w tym samym czasie?

Bernd Gloss
źródło
+1 Najbardziej prawdopodobne wytłumaczenie jest takie, że synchronizacja nie została poprawnie wyłączona.
David Schwartz,
2

Może to być problem związany z rozmiarem pakietu i opóźnieniem. Spróbuj wykonać następujące czynności:

Raport z powrotem swoje wyniki.

Shodanshok
źródło
Próbowałem dużych ramek z MTU = 9000, ale wyniki były takie same. Próbowałem też agregować łącza za pomocą 802.3ad, znowu bez zmian. Dlatego cofnąłem wszystkie te ustawienia, aby zbliżyć się do stanu domyślnego, jak to możliwe. Próbowałem też dostroić to net.core.*i net.ipv4.*sysctls, ale może zrobiłem zbyt mało eksperymentów. OK, zrobię więcej testów i zdam raport.
Siergiej
Próbowałem jeszcze raz dostroić sysctl zarówno na serwerze, jak i kliencie, ale to nie pomogło.
Siergiej
Czy próbowałeś z UDP jako protokołem transportowym?
shodanshok
Próbowałem UDP (proto = udp w opcjach montowania), ale działa nawet 1-2 MB / s wolniej niż TCP. Rezultatem było takie samo zamontowanie z hosta lokalnego i hosta zdalnego.
Siergiej
2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

Konfigurowanie harmonogramu systemu Linux w systemach ze sprzętową macierzą RAID i zmiana wartości domyślnej z [cfq] na [noop] zapewnia ulepszenia we / wy.

Użyj komendy nfsstat, aby obliczyć procent odczytów / zapisów. Ustaw odpowiedni współczynnik pamięci podręcznej kontrolera RAID.

W przypadku dużych obciążeń konieczne będzie zwiększenie liczby wątków serwera NFS.

Skonfiguruj wątki NFS, aby zapisywać bez opóźnień na dysku za pomocą opcji no_delay.

Poinformuj jądro Linuksa, aby opróżniało się tak szybko, jak to możliwe, aby zapisy były jak najmniejsze. W jądrze Linuksa częstotliwość zapisu brudnych stron może być kontrolowana przez dwa parametry.

Aby przyspieszyć zapisywanie na dysku, użyj opcji data = dataystem systemu plików i zapobiegaj aktualizacjom czasów dostępu do plików, co samo w sobie powoduje zapisanie dodatkowych danych na dysku. Ten tryb jest najszybszy, gdy dane muszą być odczytywane i zapisywane na dysk w tym samym czasie, w którym przewyższa wszystkie inne tryby

Vasco V.
źródło