NFS плохая производительность записи

20

У меня есть две машины, связанные с 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 писать быстро и без зависаний?

Сергей
источник
1
У вас есть довольно хороший тестовый пример, но я бы попробовал подключиться к самому серверу и написать оттуда, чтобы вы могли выяснить, виноват ли стек NFS или сетевой стек. Кроме того, попробуйте переключить сервер и клиент (экспорт с клиента, монтировать на сервере), а также с использованием другого клиента. отслеживание процессов сервер / клиент ничего не выявило?
Далибор Карлович
@ DaliborKarlović Я попробовал все, кроме strace и добавил информацию к вопросу. Монтирование с локального хоста работает медленно, поэтому сетевой стек и коммутатор, кажется, не виноваты. Я использую пространство ядра NFS и Operation not permittedпытаюсь подключить strace к процессу NFS.
Сергей
Я предполагаю, что это означает, что вы можете полностью исключить сетевой стек (но вам необходимо подключить к нему strace). Вы должны иметь возможность связать любой процесс с правами пользователя root, если он не затронут определенной ошибкой .
Далибор Карлович
@ DaliborKarlović Конечно, я пробую strace как root. Я могу подключиться к любому процессу в пространстве пользователя, но не к процессам ядра. Но какую информацию я могу получить из ее результатов? Я предполагаю, что он выдаст сотни тысяч строк, если я подключу его к NFS и начну загрузку. Стоит ли обращать внимание на ненулевые возвращаемые значения?
Сергей
Вы правы, я не думал о том, что это процесс не для пользователей. Я ожидаю увидеть, что он делает, пока он «зависает» в начале передачи, это может быть чем-то тривиальным, как неправильно настроенный обратный поиск DNS.
Далибор Карлович

Ответы:

3

Вы используете опцию sync в своем заявлении на экспорт. Это означает, что сервер подтверждает операции записи только после того, как они фактически записаны на диск. Если у вас есть вращающийся диск (т. Е. Нет SSD), это требует в среднем как минимум 1/2 оборота диска на операцию записи, что является причиной замедления.

Используя параметр асинхронности, сервер немедленно подтверждает операцию записи клиенту, когда она обрабатывается, но еще не записана на диск. Это немного более ненадежно, например, в случае сбоя питания, когда клиент получил подтверждение для операции, которая не произошла. Тем не менее, это обеспечивает огромное увеличение производительности записи.

(правка) Я только что увидел, что вы уже тестировали параметры async vs sync. Тем не менее, я почти уверен, что это является причиной вашей проблемы с производительностью - у меня когда-то была точно такая же индикация с идентичной установкой. Может быть, вы проверите это снова. Вы указали опцию async в операторе экспорта сервера И в операции монтирования на клиенте одновременно?

Бернд Глосс
источник
+1 Наиболее вероятное объяснение состоит в том, что синхронизация была неправильно отключена.
Дэвид Шварц
2

Это может быть проблемой, связанной с размером пакета и задержкой. Попробуйте следующее:

Отчет вернет ваши результаты.

shodanshok
источник
Я пробовал гигантские кадры с MTU = 9000, но результаты были такими же. Я также пытался агрегировать ссылки с 802.3ad, опять без изменений. Поэтому я вернул все эти настройки, чтобы максимально приблизиться к состоянию по умолчанию. Также я пытался настроить это net.core.*и net.ipv4.*sysctls, но, возможно, я провел слишком мало экспериментов. Хорошо, я сделаю еще несколько тестов и сообщу.
Сергей
Я попытался еще раз настроить sysctl как на сервере, так и на клиенте, но это не помогло.
Сергей
Вы пробовали использовать UDP в качестве транспортного протокола?
Shodanshok
Я пробовал UDP (proto = udp в опциях монтирования), но он работает даже на 1-2 МБ / с медленнее, чем TCP. Результат был одинаковым при монтировании с локального хоста и с удаленного хоста.
Сергей
2

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 и не допускайте обновления времени доступа к файлу, что само по себе приводит к записи дополнительных данных на диск. Этот режим является самым быстрым, когда данные должны считываться и записываться на диск одновременно, когда он превосходит все остальные режимы.

Васко В.
источник