KVM гість io набагато повільніше, ніж хост io: це нормально?


13

У мене встановлена ​​система хосту Qemu-KVM на CentOS 6.3. Чотири диски SATA 1 TB, що працюють в Software RAID10. Guest CentOS 6.3 встановлюється на окремих LVM. Люди кажуть, що вони бачать продуктивність гостей майже рівною ефективності, але я цього не бачу. Мої тести на введення / виведення показують на 30-70% більш низьку продуктивність у гостях, ніж на хост-системі. Я намагався змінити планувальник (встановлений elevator=deadlineна хості та elevator=noopв гостях), встановив blkio.weight1000 у групі, змінив 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 -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 тест читання: один процес, а потім чотири одночасні процеси

# 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 тест запису: один процес, а потім чотири одночасні процеси

# 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 -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 тест читання: один процес, а потім чотири одночасні процеси

# 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 тест запису: один процес, а потім чотири одночасні процеси

# 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

Цікаво, це нормальна ситуація чи я щось пропустив?


Ви сказали, що ви змінили свого гостя, щоб він використовував тип автобуса virtio, який дає кращі показники, але він повинен встановити драйвери virtio, щоб отримати ці переваги. Ви не сказали, чи використовуєте ви це чи ні. Я не знаю CentOS досить грунтовно, щоб прокоментувати те, хто з цих драйверів буде присутній у вашого гостя за замовчуванням чи ні.
jwbensley

1
@javano CentOS завжди включає virtio, і вам доведеться явно видалити його, відновивши пакети ядра.
Майкл Хемптон

Завжди зручно знати, ура :)
jwbensley

Відповіді:


22

Ви ще не закінчили налаштування продуктивності.

  <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-масив не підтримується батареєю, або ви ризикуєте втратити дані. (Звичайно, якщо втратити дані в порядку, тоді сміливо.)

По-третє, деякі інші речі, які можуть допомогти, включають відключення бар'єрів та використання планувальника термінів у гостях.

Нарешті, зробіть кілька досліджень. На конференції з сантехніків Linux 2010 IBM виступила з цікавою презентацією щодо продуктивності вводу / виводу KVM . Крім того, у них є широкий набір найкращих практик використання KVM, що, безумовно, буде цікавим.

PS Тривалі послідовні читання та записи рідко представляють реальну навантаження. Спробуйте робити еталонні показники з іншими видами навантажень, в ідеалі - реальними програмами, які ви збираєтеся використовувати у виробництві.


+1 за "тест зі своїм шаблоном вводу-виведення"
Хав'єр

О, добре подобається документам IBM, +1 :)
jwbensley

1
Дуже корисно, дякую! Тепер я покращив свої гостьові результати до 90% від ефективності хоста. Моя вина була досить дурною: я virsh reset <domain>не застосував моїх virsh edit <domain>змін, і я вважав, що гість використовував virtio, але насправді цього не сталося. Тільки virsh destroy <domain>слідували за допомогою virsh start <domain>. Правила Віртіо! ;)
Евольвер

1
кеш = списання не додає жодних ризиків у реальному житті (важливі дані не загрожують, лише дані під час польоту, які в будь-якому випадку відкидаються при аварії). Лише кеш = небезпечний. Знижка не передбачає додаткових вимог до обладнання ("RAID-масив, захищений акумулятором" жодним чином не допомагає). Він має той самий рівень цілісності, що і кеш-пам'ять жорсткого диска: операційні системи обидва промиваються при необхідності.
korkman

io='native'дав майже 20-30% додаткової WRITE продуктивності в моєму випадку
rahul286
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.