У меня есть две машины, связанные с 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.Ответы:
Вы используете опцию sync в своем заявлении на экспорт. Это означает, что сервер подтверждает операции записи только после того, как они фактически записаны на диск. Если у вас есть вращающийся диск (т. Е. Нет SSD), это требует в среднем как минимум 1/2 оборота диска на операцию записи, что является причиной замедления.
Используя параметр асинхронности, сервер немедленно подтверждает операцию записи клиенту, когда она обрабатывается, но еще не записана на диск. Это немного более ненадежно, например, в случае сбоя питания, когда клиент получил подтверждение для операции, которая не произошла. Тем не менее, это обеспечивает огромное увеличение производительности записи.
(правка) Я только что увидел, что вы уже тестировали параметры async vs sync. Тем не менее, я почти уверен, что это является причиной вашей проблемы с производительностью - у меня когда-то была точно такая же индикация с идентичной установкой. Может быть, вы проверите это снова. Вы указали опцию async в операторе экспорта сервера И в операции монтирования на клиенте одновременно?
источник
Это может быть проблемой, связанной с размером пакета и задержкой. Попробуйте следующее:
Отчет вернет ваши результаты.
источник
net.core.*
иnet.ipv4.*
sysctls, но, возможно, я провел слишком мало экспериментов. Хорошо, я сделаю еще несколько тестов и сообщу.http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html
Конфигурирование планировщика Linux в системах с аппаратным RAID-массивом и изменение значения по умолчанию с [cfq] на [noop] дает улучшения ввода-вывода.
Используйте команду nfsstat, чтобы рассчитать процент чтения / записи. Установите соотношение кэша контроллера RAID, чтобы соответствовать.
Для тяжелых рабочих нагрузок вам необходимо увеличить количество потоков NFS-сервера.
Сконфигурируйте потоки nfs для немедленной записи на диск, используя опцию no_delay.
Скажите ядру Linux, чтобы он сбрасывался как можно быстрее, чтобы записи были как можно меньше. В ядре Linux частота обратной записи грязных страниц может контролироваться двумя параметрами.
Для более быстрой записи на диск используйте опцию файловая система data = journal и не допускайте обновления времени доступа к файлу, что само по себе приводит к записи дополнительных данных на диск. Этот режим является самым быстрым, когда данные должны считываться и записываться на диск одновременно, когда он превосходит все остальные режимы.
источник