У меня есть две машины, подключенные с 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)
Если я пытаюсь загрузить большой файл (~5Gb) на клиентской машине от доли NFS, я получаю производительность на ~130-140 Мбайт/с, которая является близко к производительности локального диска сервера, таким образом, это удовлетворительно.
Но когда я пробую, действительно загружают большой файл на долю NFS, загрузка запускается на уровне ~1.5 мегабайтов/с, медленно увеличивается на 18-20 мегабайтов/с и прекращает увеличиваться. Иногда доля "зависает" в течение нескольких минут, прежде чем загрузка на самом деле запустится, т.е. трафик между хостами становится близко к нулю и если я выполняюсь ls /mnt/test
, это не возвращается в течение минуты или два. Затем ls
управляйте возвратами, и загрузка запускается в, он - начальная 1.5Mbit/s скорость.
Когда скорость загрузки достигает, это максимально (18-20 мегабайтов/с), я работаю iptraf-ng
и это показывает трафик на ~190 Мбит/с в сетевом интерфейсе, таким образом, сеть не является узким местом здесь, а также жестким диском сервера.
Что я попробовал:
1. Настройте сервер NFS на третьем хосте, который был соединен только с Ethernet на 100 Мбит NIC. Результаты аналогичны: DL показывает хорошую производительность и почти полное использование сети на 100 Мбит, загрузка не работает быстрее, чем сотни килобайт в секунду, оставляя использование сети очень низко (2,5 Мбит/с согласно iptraf-ng
).
2. Я пытался настроить некоторые параметры NFS:
sync
или async
noatime
нет hard
rsize
и wsize
максимальны в моих примерах, таким образом, я пытался уменьшить их в несколько этапов вниз к 8 192
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 быстро, и без зависает?
Это может быть проблема, связанная с размером пакета и задержкой. Попробуйте следующее:
сообщите о своих результатах.
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 и предотвращайте обновление времени доступа к файлам, что само по себе приводит к записи дополнительных данных на диск.Этот режим является самым быстрым, когда данные необходимо читать и записывать на диск одновременно, он превосходит все другие режимы
Вы используете синхронность в операторе экспорта. Это означает, что сервер подтверждает операции записи только после их фактической записи на диск. Учитывая, что у вас есть вращающийся диск (т.е. нет SSD), это требует в среднем не менее 1/2 оборота диска за операцию записи, что и является причиной замедления.
Используя настройку async, сервер сразу же подтверждает клиенту операцию записи, когда она обрабатывается, но еще не записывается на диск. Это немного более ненадежно, например, в случае отключения электричества, когда клиент получил сигнал на операцию, которая не состоялась. Однако, это дает огромный прирост производительности при записи.
(edit) Я только что видел, что вы уже протестировали опции async vs sync. Однако я почти уверен, что это и есть причина вашей проблемы с падением производительности - однажды у меня был точно такой же признак при идентичной настройке. Может быть, вы протестируете ее еще раз. Предоставили ли вы опцию async в экспортном заявлении сервера И в операции монтирования на клиенте одновременно?