Ситуация: у нас есть сервер Ubuntu, на котором размещены три виртуальные машины с использованием KVM. Все гости, а также хост должны иметь доступ к одним и тем же файлам в определенной подпапке / var. Таким образом, подпапка экспортируется через NFS. Наша проблема в том, что гость может читать / писать в каталог только с половиной скорости хоста. Таблица экспорта выглядит так
alice@host:~$ cat /etc/exports
/home/videos 192.168.10.0/24(rw,sync,no_root_squash)
где хост имеет IP 192.168.10.2, а виртуальные машины 192.168.10.1 {1..3}. / home / videos - это символическая ссылка на определенную подпапку в / var. В частности, это / var / videos / genvids.
Это соответствующая строка из fstab виртуальной машины:
192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=4096,wsize=4096 0 0
Жесткий диск имеет постоянную скорость передачи данных ~ 155 МБ / с, что подтверждается выходными данными hdparm -tT, а также dd:
alice@host:~$ dd if=/home/videos/4987_1359358478.mp4 of=/dev/null bs=1024k count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 2.04579 s, 154 MB/s
Внутри виртуальной машины все выглядит иначе:
bob@guest:~$ dd if=/mnt/nfs/4959_3184629068.mp4 of=/dev/null bs=1024k count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 4.60858 s, 68.3 MB/
Подгонка размера блока к размеру страницы файловой системы не дала удовлетворительного эффекта:
bob@guest:~$ dd if=/mnt/nfs/4925_1385624470.mp4 of=/dev/null bs=4096 count=100000
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 5.77247 s, 71.0 MB/s
Я проконсультировался с различными страницами о производительности NFS, наиболее важными из которых являются Часто задаваемые вопросы о NFS Часть B и соответствующие Настройка производительности Как. Большинство подсказок неприменимы. Остальные результаты не улучшили. Там являются потоки Вот которые касаются производительности диска и KVM. Однако они не охватывают аспект NFS. это thread, но в нашем случае скорость сети не является ограничивающим фактором.
Чтобы дать полную картину, это содержимое etab экспорта с разрешенными символическими ссылками и показанными всеми активными параметрами экспорта:
alice@host:~$ cat /var/lib/nfs/etab
/var/videos/genvids 192.168.10.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,
no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,
anonuid=65534,anongid=65534)
Что меня также беспокоит в этом контексте - и чего я не понимаю - это вывод файла procfile nfsd:
alice@host:~$ cat /proc/net/rpc/nfsd
...
th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
...
Для третьего и последующих столбцов я бы ожидал значений, отличных от нулей, после чтения с диска в виртуальных машинах. Однако nfsstat сообщает мне, что действительно были операции чтения:
alice@host:~$ nfsstat
...
Server nfs v3:
null getattr ...
9 0% 15106 3% ...
read write ...
411971 95% 118 0% ...
...
Итак, тема довольно сложная, и я хотел бы знать, где еще искать и есть ли для нее простое решение.
Как оказалось, проблему решить оказалось проще, чем ожидалось. Настройка размер и размер вариант в fstab виртуальной машины сделал свое дело. Соответствующая строка теперь
192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=32768,wsize=32768 0 0
Для меня это было неочевидно, поскольку я ожидал лучшей производительности, если значения для размер и размер соответствуют размеру блока диска (4096) и не превышают MTU сетевой карты (9000). Видимо, это предположение было ошибочным.
Примечательно, что точная устойчивая скорость передачи данных на диске зависит от самого файла: для двух одинаковых файлов размером 9 ГБ я наблюдал скорости от 155 МБ / с (файл 1) до 140 МБ / с (файл 2). Таким образом, снижение скорости передачи данных с одним файлом все равно может привести к полной скорости передачи данных с другим файлом.