Назад | Перейти на главную страницу

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

У меня есть две машины, подключенные к 10Gbit Ethernet. Пусть один из них будет сервером NFS, а другой - клиентом NFs.

Тестирование скорости сети по 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. Результаты аналогичны: DL показывает хорошую производительность и почти полное использование сети 100 Мбит, загрузка не превышает сотен килобайт в секунду, в результате чего загрузка сети остается очень низкой (2,5 Мбит / с согласно iptraf-ng).

2. Я попытался настроить некоторые параметры NFS:

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. Смонтировать с 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/

И здесь я получаю тот же результат: скачать с /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 писать быстро и без зависаний?

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

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

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

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

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

Отчет о ваших результатах.