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

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

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