
Ситуация: У нас есть сервер 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 и соответствующиеНастройка производительностиHowto. Большинство советов не применимы. Остальные не улучшили результаты.Там являются потоки здеськоторые касаются производительности дисков и KVM. Однако они не охватывают аспект NFS.Этотпоток есть, но скорость сети, похоже, не является ограничивающим фактором в нашем случае.
Чтобы дать полную картину, вот содержимое таблицы экспорта с разрешенными символическими ссылками и всеми показанными активными параметрами экспорта:
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% ...
...
Итак, тема довольно сложная, и мне хотелось бы узнать, куда еще обратиться и есть ли простое решение для этого.
решение1
Как оказалось, решить проблему оказалось проще, чем ожидалось. Настройкаrsizeиwsizeопция в fstab виртуальной машины сделала свое дело. Соответствующая строка теперь
192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=32768,wsize=32768 0 0
Для меня это не было очевидным, так как я ожидал наилучшей производительности, если значения дляrsizeиwsizeсоответствуют размеру блока диска (4096) и не превышают MTU сетевой карты (9000). По-видимому, это предположение было неверным.
Примечательно, что точная постоянная скорость передачи данных на диске зависит от самого файла: для двух похожих файлов размером 9 ГБ я наблюдал скорости между 155 МБ/с (файл 1) и 140 МБ/с (файл 2). Таким образом, пониженная скорость передачи данных с одним файлом может по-прежнему приводить к полной скорости передачи данных с другим файлом.