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ń?
Operation not permitted
próbuję dołączyć strace do procesu NFS.