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 iperf
pokazuje ~ 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/exports
to:
/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)
Klient montuje ten udział w swoim lokalnym /mnt/test
z 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 ls
polecenie 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-ng
i 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
lubasync
noatime
Nie
hard
rsize
iwsize
są 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_caches
został 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ń?
źródło
Operation not permitted
próbuję dołączyć strace do procesu NFS.Odpowiedzi:
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?
źródło
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.
źródło
net.core.*
inet.ipv4.*
sysctls, ale może zrobiłem zbyt mało eksperymentów. OK, zrobię więcej testów i zdam raport.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
źródło