У меня есть две машины, связанные с 10Gbit Ethernet. Пусть один из них будет сервером NFS, а другой - клиентом NF.
Тестирование скорости сети по протоколу TCP с iperf
пропускной способностью ~ 9,8 Гбит / с в обоих направлениях, поэтому сеть в порядке.
Тестирование производительности диска сервера NFS:
dd if=/dev/zero of=/mnt/test/rnd2 count=1000000
Результат составляет ~ 150 МБ / с, поэтому диск отлично подходит для записи.
Сервер /etc/exports
это:
/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)
Клиент подключает эту папку к своей локальной сети /mnt/test
со следующими параметрами:
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)
Если я пытаюсь загрузить большой файл (~ 5 ГБ) на клиентском компьютере из общего ресурса NFS, я получаю производительность ~ 130-140 МБ / с, которая близка к производительности локального диска сервера, поэтому она удовлетворительная.
Но когда я пытаюсь загрузить большой файл в общий ресурс NFS, загрузка начинается с ~ 1,5 МБ / с, медленно увеличивается до 18-20 МБ / с и прекращает увеличиваться. Иногда общий ресурс «зависает» на пару минут перед тем, как загрузка начнется, то есть трафик между хостами становится близким к нулю, и если я выполняю ls /mnt/test
его, он не возвращается в течение минуты или двух. Затем ls
команда возвращается и загрузка начинается с начальной скоростью 1,5 Мбит / с.
Когда скорость загрузки достигает своего максимума (18-20 Мбайт / с), я запускаю iptraf-ng
и показывает сетевой трафик ~ 190 Мбит / с, поэтому сеть здесь не является узким местом, также как и жесткий диск сервера.
Что я пробовал:
1.
Настройте NFS-сервер на третьем хосте, который был подключен только к 100 Мбит Ethernet NIC. Результаты аналогичны: DL показывает хорошую производительность и почти полное использование сети 100 Мбит, загрузка не выполняется быстрее, чем сотни килобайт в секунду, в результате чего использование сети очень низкое (согласно 2,5 Мбит / с iptraf-ng
).
2. Я попытался настроить некоторые параметры NFS:
sync
илиasync
noatime
нет
hard
rsize
иwsize
являются максимальными в моих примерах, поэтому я попытался уменьшить их в несколько шагов до 8192
3. Я попытался переключить клиентские и серверные машины (настроить сервер NFS на прежнем клиенте и наоборот). Более того, есть еще шесть серверов с такой же конфигурацией, поэтому я попытался смонтировать их друг к другу в разных вариациях. Тот же результат.
4. MTU = 9000, MTU = 9000 и агрегация каналов 802.3ad, агрегация каналов с MTU = 1500.
5. настройка 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
Тот же результат.
6. Смонтировать с локального хоста:
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/
И здесь я получаю тот же результат: загрузка с /mnt/testmount/
очень быстрая, загрузка с /mnt/testmount/
очень медленная, не быстрее, чем 22 МБ / с, и перед началом передачи небольшая задержка. Означает ли это, что сетевой стек работает без нареканий и проблема в NFS?
Все это не помогло, результаты существенно не отличались от конфигурации по умолчанию. echo 3 > /proc/sys/vm/drop_caches
был выполнен до всех испытаний.
MTU всех NICS на всех 3 хостах составляет 1500, нестандартная настройка сети не выполняется. Ethernet-коммутатор - Dell MXL 10 / 40Gbe.
ОС 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
Какие настройки мне не хватает? Как заставить NFS писать быстро и без зависаний?
Operation not permitted
пытаюсь подключить strace к процессу NFS.