2016-08-19 16 views
3

Привет, Недавно я провел эксперимент virtio-scsi через rbd через цель qemu (для поддержки DISCARD/TRIM) и сравнил пропускную способность и iops с настройкой virtio-blk over rbd на той же машине, используя fio в Гость. Показатель пропускной способности при последовательной записи чтения в 7 раз меньше (42,3 МБ/с против 309 МБ/с), а iops в случайной записи чтения в 10 раз меньше (546 против 5705).Почему в моем эксперименте virtio-scsi намного медленнее, чем virtio-blk (поверх и ceph rbd-изображение)?

Что я делаю, это создать виртуальную машину с помощью OpenStack Juno, которая даст мне настройку virtio-blk over rbd. Затем я изменил соответствующую часть в Libvirt конфигурационного XML, с:

<disk type='network' device='disk'> 
    <driver name='qemu' type='raw' cache='writeback'/> 
    <auth username='cinder'> 
    <secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/> 
    </auth> 
    <source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'> 
    <host name='192.168.20.105' port='6789'/> 
    </source> 
    <target dev='vda' bus='virtio'/> 
    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 
</disk> 

к этому:

<disk type='network' device='disk'> 
    <driver name='qemu' type='raw' cache='writeback' discard='unmap'/> 
    <auth username='cinder'> 
    <secret type='ceph' uuid='482b83f9-be95-448e-87cc-9fa602196590'/> 
    </auth> 
    <source protocol='rbd' name='vms/c504ea8b-18e6-491e-9470-41c60aa50b81_disk'> 
    <host name='192.168.20.105' port='6789'/> 
    </source> 
    <target dev='vda' bus='scsi'/> 
    <controller type='scsi' model='virtio-scsi' index='0'/> 
</disk> 

версии программного обеспечения являются:

QEMU 2.5.1

libvirt 1.2.2

ядро ​​ 3.18.0-031800-родовое # 201412071935 SMP пн 8 декабря 00:36:34 UTC 2014 x86_64 (а Ubuntu 14,04 ядро)

И гипервизор KVM.

Я не думаю, что разница в производительности может быть такой большой между virtio-scsi и virtio-blk. Поэтому, пожалуйста, укажите, что я сделал неправильно, и как добиться разумной производительности.

Ограничение в том, что я хочу решение, которое работает для OpenStack (идеально, если работает для Juno) без большого количества исправлений или кодирования. Например, я слышал о virtio-scsi + vhost-scsi + scsi-mq, но это кажется недоступным в OpenStack прямо сейчас.

ответ

-1

Вы позволили отказаться Unmap в измененной configure.xml:

 
<driver name='qemu' type='raw' cache='writeback' discard='unmap' /> 

Это скрабы блоки на лету.

+0

И это отвечает на вопрос, потому что ...? – rustyx

+1

Нет, это не так. Он, конечно же, не делает никаких изменений, пока вы не вызываете 'fstrim' в гостевой системе, или, если вы монтируете с опцией' discard', 'rm'. –

1

Простой ответ заключается в том, что VirtIO-SCSI немного сложнее, чем VirtIO-Block. Заимствуя простое описание из here:

Virtio Блок имеет следующие слои:

guest: app -> Block Layer -> virtio-blk 
host: QEMU -> Block Layer -> Block Device Driver -> Hardware 

В то время как Virtio SCSI имеет следующий вид:

guest: app -> Block Layer -> SCSI Layer -> scsi_mod 
host: QEMU -> Block Layer -> SCSI Layer -> Block Device Driver -> Hardware 

В сущности, Virtio SCSI должен пройти через другой уровень перевода по сравнению с VirtIO Block.

В большинстве случаев использование локальных устройств в результате будет медленнее. Есть несколько нечетных конкретных случаев, когда иногда происходит обратное, а именно:

  • Прямая пересылка хоста SCSI LUN на адаптер VirtIO SCSI. Это немного быстрее, потому что он обходит слой блока на стороне хоста.
  • QEMU собственный доступ к устройствам iSCSI.Это происходит быстрее, потому что он полностью исключает уровни хоста и SCSI и не требует перевода команд VirtIO Block в команды SCSI.

Для записи, хотя, есть три связанные невыполнением преимущества использования Virtio SCSI над Virtio блока:

  1. Она поддерживает гораздо больше устройств. Блок VirtIO предоставляет одно устройство PCI для каждого блочного устройства, которое ограничивает возможности примерно до 21-24 устройств, тогда как VirtIO SCSI использует только одно устройство PCI и может обрабатывать абсолютно астрономическое количество LUN на этом устройстве.
  2. VirtIO SCSI поддерживает команду SCSI UNMAP (TRIM в терминах ATA, DISCARD в терминах ядра Linux). Это важно, если вы находитесь на тонко подготовленном хранилище.
  3. VirtIO SCSI предоставляет устройства как обычные узлы SCSI, тогда как VirtIO Block использует специальное устройство. Обычно это не очень важно, но может быть полезно при преобразовании из физической системы.

 Смежные вопросы

  • Нет связанных вопросов^_^