У мене є два машини, підключені до 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)
Якщо я спробую завантажити великий файл (~ 5Gb) на клієнтській машині з 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. Гора від 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 писати швидко і без зависань?
Operation not permitted
намагаюся приєднати strace до процесу NFS.