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

KVM guest io работает намного медленнее, чем host io: это нормально?

У меня установлена ​​хост-система Qemu-KVM на CentOS 6.3. Четыре жестких диска SATA емкостью 1 ТБ, работающих в программном RAID10. Гостевая CentOS 6.3 устанавливается на отдельный LVM. Люди говорят, что они видят производительность гостя почти равную производительности хозяина, но я этого не вижу. Мои тесты ввода-вывода показывают на 30-70% меньшую производительность на гостевой системе, чем на хост-системе. Пытался сменить планировщик (установить elevator=deadline на хосте и elevator=noop на гостя), установить blkio.weight до 1000 в cgroup, измените io на virtio ... Но ни одно из этих изменений не дало мне значительных результатов. Это гостевая часть конфигурации .xml:

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/dev/vgkvmnode/lv2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

Вот мои тесты:

Хост-система:

iozone тест

# iozone -a -i0 -i1 -i2 -s8G -r64k
                                                            random  random 
              KB  reclen   write rewrite    read    reread    read   write 
         8388608      64  189930  197436   266786   267254   28644   66642 

dd read test: один процесс, а затем четыре одновременных процесса

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct
1073741824 bytes (1.1 GB) copied, 4.23044 s, 254 MB/s

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 14.4528 s, 74.3 MB/s
1073741824 bytes (1.1 GB) copied, 14.562 s, 73.7 MB/s
1073741824 bytes (1.1 GB) copied, 14.6341 s, 73.4 MB/s
1073741824 bytes (1.1 GB) copied, 14.7006 s, 73.0 MB/s

dd write test: один процесс, а затем четыре одновременных процесса

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 6.2039 s, 173 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 32.7173 s, 32.8 MB/s
1073741824 bytes (1.1 GB) copied, 32.8868 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9097 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9688 s, 32.6 MB/s

Гостевая система:

iozone тест

# iozone -a -i0 -i1 -i2 -s512M -r64k
                                                            random  random
              KB  reclen   write rewrite    read    reread    read   write
          524288      64   93374  154596   141193   149865   21394   46264 

dd read test: один процесс, а затем четыре одновременных процесса

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024
1073741824 bytes (1.1 GB) copied, 5.04356 s, 213 MB/s

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 24.7348 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7378 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7408 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.744 s, 43.4 MB/s

dd write test: один процесс, а затем четыре одновременных процесса

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 10.415 s, 103 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 49.8874 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8608 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8693 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.9427 s, 21.5 MB/s

Интересно, это нормальная ситуация или я что-то упустил?

Вы еще не закончили настройку производительности.

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>

Во-первых, какой механизм ввода-вывода использовать.

QEMU имеет два механизма асинхронного ввода-вывода: эмуляция POSIX AIO с использованием пула рабочих потоков и собственный Linux AIO.

Установите либо io='native' или io='threads' в вашем XML, чтобы сравнить каждый из них.

Во-вторых, какой механизм кэширования использовать. Вы можете установить cache='writeback', cache='writethrough' или вы можете выключить его с помощью cache='none', который, по вашему мнению, работает лучше всего.

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

Не использовать writeback если ваш RAID-массив не имеет батарейного питания, иначе вы рискуете потерять данные. (Конечно, если потеря данных - это нормально, не стесняйтесь.)

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

Наконец, проведите небольшое исследование. IBM сделала очень интересный презентация о производительности KVM I / O на конференции сантехников Linux 2010 года. Кроме того, у них есть обширный набор лучших практик по использованию KVM что, безусловно, будет интересно.

P.S. Длительные последовательные операции чтения и записи редко отражают реальную рабочую нагрузку. Попробуйте выполнить тесты с другими типами рабочих нагрузок, в идеале с фактическими приложениями, которые вы собираетесь запускать в производственной среде.