virtio-blk performance degradation happened with virito-serial
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPS
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
[environment]
Host OS: linux-3.10
QEMU: 2.0.1
Guest OS: windows server 2008
[qemu command]/usr/bin/kvm -id 1587174272642 -chardev socket,id=qmp,path=/var/run/qemu-server/1587174272642.qmp,server,nowait -mon chardev=qmp,mode=control -vnc :0,websocket,to=200 -enable-kvm -pidfile /var/run/qemu-server/1587174272642.pid -daemonize -name win2008-32 -smp sockets=1,cores=1 -cpu core2duo -nodefaults -vga cirrus -no-hpet -k en-us -boot menu=on,splash-time=8000 -m 2048 -usb -drive if=none,id=drive-ide0,media=cdrom,aio=native -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=200 -drive file=/sf/data/local/images/host-00e081de43d7/cea072c4294f/win2008-32.vm/vm-disk-1.qcow2,if=none,id=drive-ide2,cache=none,aio=native -device ide-hd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=100 -netdev type=tap,id=net0,ifname=158717427264200,script=/sf/etc/kvm/vtp-bridge -device e10
00,mac=FE:FC:FE:D3:F9:2B,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,clock=rt,base=localtime -global kvm-pit.lost_tick_policy=discard -global PIIX4_PM.disable_s3
=1 -global PIIX4_PM.disable_s4=1
Any ideas?
Thanks,
Zhang Haoyu
Quoted 11 lines · Zhang Haoyu
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSbut if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPS
Quoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?
Thanks,
Zhang Haoyu
Quoted 6 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 22 lines · Zhang Haoyu
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSQuoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
So, I think it has no business with legacy interrupt mode, right?
Quoted 3 lines
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?
So it's a windows guest; it could be something windows driver specific, then? Do you see the same on Linux guests too?
Amit
Re: [Qemu-devel] [question] virtio-blk performancedegradationhappened with virito-serial
Quoted 22 lines
Quoted 22 lines
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSQuoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
So, I think it has no business with legacy interrupt mode, right?
Quoted 7 lines
Quoted 3 lines
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?So it's a windows guest; it could be something windows driver specific, then? Do you see the same on Linux guests too?
I suspect windows driver specific, too.
I have not test linux guest, I'll test it later.
Thanks,
Zhang Haoyu
Quoted 1 line
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
In reply to Zhang HaoyuQuoted 12 lines
Quoted 12 lines
Quoted 11 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSbut if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Quoted 8 lines
Quoted 4 lines
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.
Quoted 14 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Thanks,
Zhang HaoyuQuoted 6 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 16 lines · Zhang Haoyu
Quoted 16 lines
Quoted 16 lines
Quoted 11 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSbut if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
Quoted 6 lines
Quoted 4 lines
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.
This is just wild guessing:
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
Christian
Paolo Bonzini
maintainerRe: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Il 01/09/2014 15:09, Christian Borntraeger ha scritto:
Quoted 3 lines
This is just wild guessing:
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Paolo
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 9 lines · Paolo Bonzini
Il 01/09/2014 15:09, Christian Borntraeger ha scritto:
Quoted 3 lines
This is just wild guessing:
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.That could be the case if MSI is disabled.
Paolo
Do the windows virtio drivers enable MSIs, in their inf file?
Christian
Paolo Bonzini
maintainerRe: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Il 01/09/2014 15:22, Christian Borntraeger ha scritto:
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
Paolo
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 6 lines · Paolo Bonzini
Il 01/09/2014 15:22, Christian Borntraeger ha scritto:
Quoted 5 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Quoted 7 lines
Quoted 1 line
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
Paolo
Zhang Haoyu, which virtio drivers did you use?
I just checked the Fedora virtio driver. The INF file does not contain the MSI enablement as described in
http://msdn.microsoft.com/en-us/library/windows/hardware/ff544246%28v=vs.85%29.aspx
That would explain the performance issues - given that the link information is still true.
Christian
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 13 lines · Christian Borntraeger
Quoted 12 lines · Paolo Bonzini
Il 01/09/2014 15:22, Christian Borntraeger ha scritto:
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
Quoted 7 lines
Quoted 1 line
Paolo
Zhang Haoyu, which virtio drivers did you use?
I just checked the Fedora virtio driver. The INF file does not contain the MSI enablement as described in
http://msdn.microsoft.com/en-us/library/windows/hardware/ff544246%28v=vs.85%29.aspx
That would explain the performance issues - given that the link information is still true.
Sorry, looked at the wrong inf file. The fedora driver does use MSI for serial and block.
Re: [Qemu-devel] [question] virtio-blk performance degradationhappenedwith virito-serial
In reply to Christian BorntraegerQuoted 11 lines
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
I made a test with fio on rhel-6.5 guest, the same degradation happened too, this degradation can be reproduced on rhel6.5 guest 100%. virtio_console module installed:
64K-write-sequence: 285 MBPS, 4380 IOPSvirtio_console module uninstalled:
64K-write-sequence: 370 MBPS, 5670 IOPS
And, virio-blk's interrupt mode always is MSI, no matter if virtio_console module is installed or uninstalled.
25: 2245933 PCI-MSI-edge virtio1-requests
fio command:
fio -filename /dev/vda -direct=1 -iodepth=1 -thread -rw=write -ioengine=psync -bs=64k -size=30G -numjobs=1 -name=mytest
QEMU comamnd:/usr/bin/kvm -id 5497356709352 -chardev socket,id=qmp,path=/var/run/qemu-server/5497356709352.qmp,server,nowait -mon chardev=qmp,mode=control -vnc :0,websocket,to=200 -enable-kvm -pidfile /var/run/qemu-server/5497356709352.pid -daemonize -name io-test-rhel-6.5 -smp sockets=1,cores=1 -cpu core2duo -nodefaults -vga cirrus -no-hpet -k en-us -boot menu=on,splash-time=8000 -m 4096 -usb -drive file=/sf/data/local/zhanghaoyu/rhel-server-6.5-x86_64-dvd.iso,if=none,id=drive-ide0,media=cdrom,aio=native,forecast=disable -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=200 -drive file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-1.qcow2,if=none,id=drive-virtio1,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio1,id=virtio1,bus=pci.0,addr=0xb -drive file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-2.qcow2,if=none,id=drive-virtio2,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio2,id=virtio2,bus=pci
.0,addr=0xc,bootindex=101 -netdev type=tap,id=net0,ifname=164922379979200,script=/sf/etc/kvm/vtp-bridge,vhost=on,vhostforce=on -device virtio-net-pci,mac=FE:FC:FE:C6:47:F6,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,clock=rt -global kvm-pit.lost_tick_policy=discard -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -chardev socket,path=/run/virtser/1649223799792.sock,server,nowait,id=channelser -device virtio-serial,vectors=4 -device virtserialport,chardev=channelser,name=channelser.virtserial0.0
[environment]
Host:linux-3.10(RHEL7-rc1)
QEMU: qemu-2.0.1
Guest: RHEL6.5
# lspci -tv
-[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma]
+-01.0 Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
+-01.1 Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
+-01.2 Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II]
+-01.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI
+-02.0 Cirrus Logic GD 5446
+-03.0 Red Hat, Inc Virtio console
+-0b.0 Red Hat, Inc Virtio block device
+-0c.0 Red Hat, Inc Virtio block device
\-12.0 Red Hat, Inc Virtio network device# lspci -vvv
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] (prog-if 80 [Master])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Region 0: [virtual] Memory at 000001f0 (32-bit, non-prefetchable) [size=8]
Region 1: [virtual] Memory at 000003f0 (type 3, non-prefetchable)
Region 2: [virtual] Memory at 00000170 (32-bit, non-prefetchable) [size=8]
Region 3: [virtual] Memory at 00000370 (type 3, non-prefetchable)
Region 4: I/O ports at c0e0 [size=16]
Kernel driver in use: ata_piix
Kernel modules: ata_generic, pata_acpi, ata_piix
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) (prog-if 00 [UHCI])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin D routed to IRQ 11
Region 4: I/O ports at c080 [size=32]
Kernel driver in use: uhci_hcd
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 9
Kernel driver in use: piix4_smbus
Kernel modules: i2c-piix4
00:02.0 VGA compatible controller: Cirrus Logic GD 5446 (prog-if 00 [VGA controller])
Subsystem: Red Hat, Inc Device 1100
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Region 0: Memory at fc000000 (32-bit, prefetchable) [size=32M]
Region 1: Memory at febd0000 (32-bit, non-prefetchable) [size=4K]
Expansion ROM at febc0000 [disabled] [size=64K]
Kernel modules: cirrusfb
00:03.0 Communication controller: Red Hat, Inc Virtio console
Subsystem: Red Hat, Inc Device 0003
Physical Slot: 3
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0a0 [size=32]
Region 1: Memory at febd1000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable- Count=4 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules: virtio_pci
00:0b.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 11
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c000 [size=64]
Region 1: Memory at febd2000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules: virtio_pci
00:0c.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 12
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 0: I/O ports at c040 [size=64]
Region 1: Memory at febd3000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules: virtio_pci
00:12.0 Ethernet controller: Red Hat, Inc Virtio network device
Subsystem: Red Hat, Inc Device 0001
Physical Slot: 18
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0c0 [size=32]
Region 1: Memory at febd4000 (32-bit, non-prefetchable) [size=4K]
Expansion ROM at feb80000 [disabled] [size=256K]
Capabilities: [40] MSI-X: Enable+ Count=3 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules: virtio_pci
Thanks,
Zhang Haoyu
Quoted 1 line
Paolo
Re: [Qemu-devel] [question] virtio-blk performance degradationhappenedwith virito-serial
Hi, Paolo, Amit,
any ideas?
Thanks,
Zhang Haoyu
Quoted 14 lines · Zhang Haoyu
Quoted 8 lines
Quoted 4 lines
Quoted 3 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
I made a test with fio on rhel-6.5 guest, the same degradation happened too, this degradation can be reproduced on rhel6.5 guest 100%.
virtio_consolemodule installed:
64K-write-sequence: 285 MBPS, 4380 IOPSvirtio_consolemodule uninstalled:
64K-write-sequence: 370 MBPS, 5670 IOPS
Quoted 8 lines
And, virio-blk's interrupt mode always is MSI, no matter if
virtio_consolemodule is installed or uninstalled.
25: 2245933 PCI-MSI-edge virtio1-requestsfio command:
fio -filename/dev/vda-direct=1 -iodepth=1 -thread -rw=write -ioengine=psync -bs=64k -size=30G -numjobs=1 -name=mytestQEMU comamnd:
/usr/bin/kvm-id 5497356709352 -chardev socket,id=qmp,path=/var/run/qemu-server/5497356709352.qmp,server,nowait -mon chardev=qmp,mode=control -vnc :0,websocket,to=200 -enable-kvm -pidfile/var/run/qemu-server/5497356709352.pid-daemonize -name io-test-rhel-6.5 -smp sockets=1,cores=1 -cpu core2duo -nodefaults -vga cirrus -no-hpet -k en-us -boot menu=on,splash-time=8000 -m 4096 -usb -drive file=/sf/data/local/zhanghaoyu/rhel-server-6.5-x86_64-dvd.iso,if=none,id=drive-ide0,media=cdrom,aio=native,forecast=disable -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=200 -drive file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-1.qcow2,if=none,id=drive-virtio1,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio1,id=virtio1,bus=pci.0,addr=0xb -dri
ve file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-2.qcow2,if=none,id=drive-virtio2,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio2,id=virtio2,bus=pci
Quoted 132 lines
.0,addr=0xc,bootindex=101 -netdev type=tap,id=net0,ifname=164922379979200,script=/sf/etc/kvm/vtp-bridge,vhost=on,vhostforce=on -device virtio-net-pci,mac=FE:FC:FE:C6:47:F6,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,clock=rt -global kvm-pit.lost_tick_policy=discard -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -chardev socket,path=/run/virtser/1649223799792.sock,server,nowait,id=channelser -device virtio-serial,vectors=4 -device virtserialport,chardev=channelser,name=channelser.virtserial0.0
[environment]
Host:linux-3.10(RHEL7-rc1)
QEMU: qemu-2.0.1
Guest: RHEL6.5# lspci -tv -[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma] +-01.0 Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] +-01.1 Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] +-01.2 Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] +-01.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI +-02.0 Cirrus Logic GD 5446 +-03.0 Red Hat, Inc Virtio console +-0b.0 Red Hat, Inc Virtio block device +-0c.0 Red Hat, Inc Virtio block device \-12.0 Red Hat, Inc Virtio network device# lspci -vvv 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) Subsystem: Red Hat, Inc Qemu virtual machine Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] (prog-if 80 [Master])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Region 0: [virtual] Memory at000001f0(32-bit, non-prefetchable) [size=8]
Region 1: [virtual] Memory at000003f0(type 3, non-prefetchable)
Region 2: [virtual] Memory at 00000170 (32-bit, non-prefetchable) [size=8]
Region 3: [virtual] Memory at 00000370 (type 3, non-prefetchable)
Region 4: I/O ports at c0e0 [size=16]
Kernel driver in use:ata_piix
Kernel modules:ata_generic,pata_acpi,ata_piix00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) (prog-if 00 [UHCI])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin D routed to IRQ 11
Region 4: I/O ports at c080 [size=32]
Kernel driver in use:uhci_hcd00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 9
Kernel driver in use:piix4_smbus
Kernel modules: i2c-piix400:02.0 VGA compatible controller: Cirrus Logic GD 5446 (prog-if 00 [VGA controller])
Subsystem: Red Hat, Inc Device 1100
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Region 0: Memory atfc000000(32-bit, prefetchable) [size=32M]
Region 1: Memory atfebd0000(32-bit, non-prefetchable) [size=4K]
Expansion ROM atfebc0000[disabled] [size=64K]
Kernel modules: cirrusfb00:03.0 Communication controller: Red Hat, Inc Virtio console
Subsystem: Red Hat, Inc Device 0003
Physical Slot: 3
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0a0 [size=32]
Region 1: Memory atfebd1000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable- Count=4 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:0b.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 11
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c000 [size=64]
Region 1: Memory atfebd2000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:0c.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 12
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 0: I/O ports at c040 [size=64]
Region 1: Memory atfebd3000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:12.0 Ethernet controller: Red Hat, Inc Virtio network device
Subsystem: Red Hat, Inc Device 0001
Physical Slot: 18
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0c0 [size=32]
Region 1: Memory atfebd4000(32-bit, non-prefetchable) [size=4K]
Expansion ROM atfeb80000[disabled] [size=256K]
Capabilities: [40] MSI-X: Enable+ Count=3 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pciThanks,
Zhang HaoyuQuoted 1 line
Paolo
Re: [Qemu-devel] [question] virtio-blk performance degradationhappenedwith virito-serial
Quoted 2 lines · Zhang Haoyu
Hi, Paolo, Amit,
any ideas?
I'll check this, thanks for testing with Linux guests.
Amit
Quoted 11 lines
Quoted 11 lines
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
Quoted 6 lines
I made a test with fio on rhel-6.5 guest, the same degradation happened too, this degradation can be reproduced on rhel6.5 guest 100%.
virtio_consolemodule installed:
64K-write-sequence: 285 MBPS, 4380 IOPSvirtio_consolemodule uninstalled:
64K-write-sequence: 370 MBPS, 5670 IOPS
I use top -d 1 -H -p <qemu-pid> to monitor the cpu usage, and found that, virtio_console module installed:
qemu main thread cpu usage: 98%virtio_console module uninstalled:
qemu main thread cpu usage: 60%
perf top -p <qemu-pid> result,virtio_console module installed:
PerfTop: 9868 irqs/sec kernel:76.4% exact: 0.0% [4000Hz cycles], (target_pid: 88381)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
11.80% [kernel] [k] _raw_spin_lock_irqsave
8.42% [kernel] [k] _raw_spin_unlock_irqrestore
7.33% [kernel] [k] fget_light
6.28% [kernel] [k] fput
3.61% [kernel] [k] do_sys_poll
3.30% qemu-system-x86_64 [.] qcow2_check_metadata_overlap
3.10% [kernel] [k] __pollwait
2.15% qemu-system-x86_64 [.] qemu_iohandler_poll
1.44% libglib-2.0.so.0.3200.4 [.] g_array_append_vals
1.36% libc-2.13.so [.] 0x000000000011fc2a
1.31% libpthread-2.13.so [.] pthread_mutex_lock
1.24% libglib-2.0.so.0.3200.4 [.] 0x000000000001f961
1.20% libpthread-2.13.so [.] __pthread_mutex_unlock_usercnt
0.99% [kernel] [k] eventfd_poll
0.98% [vdso] [.] 0x0000000000000771
0.97% [kernel] [k] remove_wait_queue
0.96% qemu-system-x86_64 [.] qemu_iohandler_fill
0.95% [kernel] [k] add_wait_queue
0.69% [kernel] [k] __srcu_read_lock
0.58% [kernel] [k] poll_freewait
0.57% [kernel] [k] _raw_spin_lock_irq
0.54% [kernel] [k] __srcu_read_unlock
0.47% [kernel] [k] copy_user_enhanced_fast_string
0.46% [kvm_intel] [k] vmx_vcpu_run
0.46% [kvm] [k] vcpu_enter_guest
0.42% [kernel] [k] tcp_poll
0.41% [kernel] [k] system_call_after_swapgs
0.40% libglib-2.0.so.0.3200.4 [.] g_slice_alloc
0.40% [kernel] [k] system_call
0.38% libpthread-2.13.so [.] 0x000000000000e18d
0.38% libglib-2.0.so.0.3200.4 [.] g_slice_free1
0.38% qemu-system-x86_64 [.] address_space_translate_internal
0.38% [kernel] [k] _raw_spin_lock
0.37% qemu-system-x86_64 [.] phys_page_find
0.36% [kernel] [k] get_page_from_freelist
0.35% [kernel] [k] sock_poll
0.34% [kernel] [k] fsnotify
0.31% libglib-2.0.so.0.3200.4 [.] g_main_context_check
0.30% [kernel] [k] do_direct_IO
0.29% libpthread-2.13.so [.] pthread_getspecificvirtio_console module uninstalled:
PerfTop: 9138 irqs/sec kernel:71.7% exact: 0.0% [4000Hz cycles], (target_pid: 88381)
------------------------------------------------------------------------------------------------------------------------------
5.72% qemu-system-x86_64 [.] qcow2_check_metadata_overlap
4.51% [kernel] [k] fget_light
3.98% [kernel] [k] _raw_spin_lock_irqsave
2.55% [kernel] [k] fput
2.48% libpthread-2.13.so [.] pthread_mutex_lock
2.46% [kernel] [k] _raw_spin_unlock_irqrestore
2.21% libpthread-2.13.so [.] __pthread_mutex_unlock_usercnt
1.71% [vdso] [.] 0x000000000000060c
1.68% libc-2.13.so [.] 0x00000000000e751f
1.64% libglib-2.0.so.0.3200.4 [.] 0x000000000004fca0
1.20% [kernel] [k] __srcu_read_lock
1.14% [kernel] [k] do_sys_poll
0.96% [kernel] [k] _raw_spin_lock_irq
0.95% [kernel] [k] __pollwait
0.91% [kernel] [k] __srcu_read_unlock
0.78% [kernel] [k] tcp_poll
0.74% [kvm] [k] vcpu_enter_guest
0.73% [kvm_intel] [k] vmx_vcpu_run
0.72% [kernel] [k] _raw_spin_lock
0.72% [kernel] [k] system_call_after_swapgs
0.70% [kernel] [k] copy_user_enhanced_fast_string
0.67% libglib-2.0.so.0.3200.4 [.] g_slice_free1
0.66% libpthread-2.13.so [.] 0x000000000000e12d
0.65% [kernel] [k] system_call
0.61% [kernel] [k] do_direct_IO
0.57% qemu-system-x86_64 [.] qemu_iohandler_poll
0.57% [kernel] [k] fsnotify
0.54% libglib-2.0.so.0.3200.4 [.] g_slice_alloc
0.50% [kernel] [k] vfs_write
0.49% libpthread-2.13.so [.] pthread_getspecific
0.48% qemu-system-x86_64 [.] qemu_event_reset
0.47% libglib-2.0.so.0.3200.4 [.] g_main_context_check
0.46% qemu-system-x86_64 [.] address_space_translate_internal
0.46% [kernel] [k] sock_poll
0.46% libpthread-2.13.so [.] __pthread_disable_asynccancel
0.44% [kernel] [k] resched_task
0.43% libpthread-2.13.so [.] __pthread_enable_asynccancel
0.42% qemu-system-x86_64 [.] phys_page_find
0.39% qemu-system-x86_64 [.] object_dynamic_cast_assertQuoted 8 lines
And, virio-blk's interrupt mode always is MSI, no matter if
virtio_consolemodule is installed or uninstalled.
25: 2245933 PCI-MSI-edge virtio1-requestsfio command:
fio -filename/dev/vda-direct=1 -iodepth=1 -thread -rw=write -ioengine=psync -bs=64k -size=30G -numjobs=1 -name=mytestQEMU comamnd:
/usr/bin/kvm-id 5497356709352 -chardev socket,id=qmp,path=/var/run/qemu-server/5497356709352.qmp,server,nowait -mon chardev=qmp,mode=control -vnc :0,websocket,to=200 -enable-kvm -pidfile/var/run/qemu-server/5497356709352.pid-daemonize -name io-test-rhel-6.5 -smp sockets=1,cores=1 -cpu core2duo -nodefaults -vga cirrus -no-hpet -k en-us -boot menu=on,splash-time=8000 -m 4096 -usb -drive file=/sf/data/local/zhanghaoyu/rhel-server-6.5-x86_64-dvd.iso,if=none,id=drive-ide0,media=cdrom,aio=native,forecast=disable -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=200 -drive file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-1.qcow2,if=none,id=drive-virtio1,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio1,id=virtio1,bus=pci.0,addr=0xb -driv
e file=/sf/data/local/images/host-1051721dff13/io-test-rhel-6.5.vm/vm-disk-2.qcow2,if=none,id=drive-virtio2,cache=none,aio=native -device virtio-blk-pci,drive=drive-virtio2,id=virtio2,bus=pc i
Quoted 128 lines
.0,addr=0xc,bootindex=101 -netdev type=tap,id=net0,ifname=164922379979200,script=/sf/etc/kvm/vtp-bridge,vhost=on,vhostforce=on -device virtio-net-pci,mac=FE:FC:FE:C6:47:F6,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,clock=rt -global kvm-pit.lost_tick_policy=discard -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -chardev socket,path=/run/virtser/1649223799792.sock,server,nowait,id=channelser -device virtio-serial,vectors=4 -device virtserialport,chardev=channelser,name=channelser.virtserial0.0
[environment]
Host:linux-3.10(RHEL7-rc1)
QEMU: qemu-2.0.1
Guest: RHEL6.5# lspci -tv -[0000:00]-+-00.0 Intel Corporation 440FX - 82441FX PMC [Natoma] +-01.0 Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] +-01.1 Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] +-01.2 Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] +-01.3 Intel Corporation 82371AB/EB/MB PIIX4 ACPI +-02.0 Cirrus Logic GD 5446 +-03.0 Red Hat, Inc Virtio console +-0b.0 Red Hat, Inc Virtio block device +-0c.0 Red Hat, Inc Virtio block device \-12.0 Red Hat, Inc Virtio network device# lspci -vvv 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) Subsystem: Red Hat, Inc Qemu virtual machine Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II] (prog-if 80 [Master])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Region 0: [virtual] Memory at000001f0(32-bit, non-prefetchable) [size=8]
Region 1: [virtual] Memory at000003f0(type 3, non-prefetchable)
Region 2: [virtual] Memory at 00000170 (32-bit, non-prefetchable) [size=8]
Region 3: [virtual] Memory at 00000370 (type 3, non-prefetchable)
Region 4: I/O ports at c0e0 [size=16]
Kernel driver in use:ata_piix
Kernel modules:ata_generic,pata_acpi,ata_piix00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01) (prog-if 00 [UHCI])
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin D routed to IRQ 11
Region 4: I/O ports at c080 [size=32]
Kernel driver in use:uhci_hcd00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
Subsystem: Red Hat, Inc Qemu virtual machine
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 9
Kernel driver in use:piix4_smbus
Kernel modules: i2c-piix400:02.0 VGA compatible controller: Cirrus Logic GD 5446 (prog-if 00 [VGA controller])
Subsystem: Red Hat, Inc Device 1100
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Region 0: Memory atfc000000(32-bit, prefetchable) [size=32M]
Region 1: Memory atfebd0000(32-bit, non-prefetchable) [size=4K]
Expansion ROM atfebc0000[disabled] [size=64K]
Kernel modules: cirrusfb00:03.0 Communication controller: Red Hat, Inc Virtio console
Subsystem: Red Hat, Inc Device 0003
Physical Slot: 3
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0a0 [size=32]
Region 1: Memory atfebd1000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable- Count=4 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:0b.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 11
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c000 [size=64]
Region 1: Memory atfebd2000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:0c.0 SCSI storage controller: Red Hat, Inc Virtio block device
Subsystem: Red Hat, Inc Device 0002
Physical Slot: 12
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 0: I/O ports at c040 [size=64]
Region 1: Memory atfebd3000(32-bit, non-prefetchable) [size=4K]
Capabilities: [40] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pci00:12.0 Ethernet controller: Red Hat, Inc Virtio network device
Subsystem: Red Hat, Inc Device 0001
Physical Slot: 18
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 10
Region 0: I/O ports at c0c0 [size=32]
Region 1: Memory atfebd4000(32-bit, non-prefetchable) [size=4K]
Expansion ROM atfeb80000[disabled] [size=256K]
Capabilities: [40] MSI-X: Enable+ Count=3 Masked-
Vector table: BAR=1 offset=00000000
PBA: BAR=1 offset=00000800
Kernel driver in use: virtio-pci
Kernel modules:virtio_pciThanks,
Zhang Haoyu
Quoted 104 lines · Zhang Haoyu
Quoted 11 lines
Quoted 11 lines
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
If virtio-blk and virtio-serial share an IRQ, the guest operating system has to check each virtqueue for activity. Maybe there is some inefficiency doing that. AFAIK virtio-serial registers 64 virtqueues (on 31 ports + console) even if everything is unused.
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
Quoted 6 lines
I made a test with fio on rhel-6.5 guest, the same degradation happened too, this degradation can be reproduced on rhel6.5 guest 100%.
virtio_consolemodule installed:
64K-write-sequence: 285 MBPS, 4380 IOPSvirtio_consolemodule uninstalled:
64K-write-sequence: 370 MBPS, 5670 IOPSI use top -d 1 -H -p <qemu-pid> to monitor the cpu usage, and found that,
virtio_consolemodule installed:
qemu main thread cpu usage: 98%virtio_consolemodule uninstalled:
qemu main thread cpu usage: 60%perf top -p <qemu-pid> result,
virtio_consolemodule installed:PerfTop: 9868 irqs/sec kernel:76.4% exact: 0.0% [4000Hz cycles], (target_pid: 88381)----------------------------------------------------------------------------------------------------------------------------------------------------------------------
11.80% [kernel] [k] _raw_spin_lock_irqsave 8.42% [kernel] [k] _raw_spin_unlock_irqrestore 7.33% [kernel] [k] fget_light 6.28% [kernel] [k] fput 3.61% [kernel] [k] do_sys_poll 3.30% qemu-system-x86_64 [.] qcow2_check_metadata_overlap 3.10% [kernel] [k] __pollwait 2.15% qemu-system-x86_64 [.] qemu_iohandler_poll 1.44% libglib-2.0.so.0.3200.4 [.] g_array_append_vals 1.36% libc-2.13.so [.] 0x000000000011fc2a 1.31% libpthread-2.13.so [.] pthread_mutex_lock 1.24% libglib-2.0.so.0.3200.4 [.] 0x000000000001f961 1.20% libpthread-2.13.so [.] __pthread_mutex_unlock_usercnt 0.99% [kernel] [k] eventfd_poll 0.98% [vdso] [.] 0x0000000000000771 0.97% [kernel] [k] remove_wait_queue 0.96% qemu-system-x86_64 [.] qemu_iohandler_fill 0.95% [kernel] [k] add_wait_queue 0.69% [kernel] [k] __srcu_read_lock 0.58% [kernel] [k] poll_freewait 0.57% [kernel] [k] _raw_spin_lock_irq 0.54% [kernel] [k] __srcu_read_unlock 0.47% [kernel] [k] copy_user_enhanced_fast_string 0.46% [kvm_intel] [k] vmx_vcpu_run 0.46% [kvm] [k] vcpu_enter_guest 0.42% [kernel] [k] tcp_poll 0.41% [kernel] [k] system_call_after_swapgs 0.40% libglib-2.0.so.0.3200.4 [.] g_slice_alloc 0.40% [kernel] [k] system_call 0.38% libpthread-2.13.so [.] 0x000000000000e18d 0.38% libglib-2.0.so.0.3200.4 [.] g_slice_free1 0.38% qemu-system-x86_64 [.] address_space_translate_internal 0.38% [kernel] [k] _raw_spin_lock 0.37% qemu-system-x86_64 [.] phys_page_find 0.36% [kernel] [k] get_page_from_freelist 0.35% [kernel] [k] sock_poll 0.34% [kernel] [k] fsnotify 0.31% libglib-2.0.so.0.3200.4 [.] g_main_context_check 0.30% [kernel] [k] do_direct_IO 0.29% libpthread-2.13.so [.] pthread_getspecific
virtio_consolemodule uninstalled:PerfTop: 9138 irqs/sec kernel:71.7% exact: 0.0% [4000Hz cycles], (target_pid: 88381)------------------------------------------------------------------------------------------------------------------------------
5.72% qemu-system-x86_64 [.] qcow2_check_metadata_overlap 4.51% [kernel] [k] fget_light 3.98% [kernel] [k] _raw_spin_lock_irqsave 2.55% [kernel] [k] fput 2.48% libpthread-2.13.so [.] pthread_mutex_lock 2.46% [kernel] [k] _raw_spin_unlock_irqrestore 2.21% libpthread-2.13.so [.] __pthread_mutex_unlock_usercnt 1.71% [vdso] [.] 0x000000000000060c 1.68% libc-2.13.so [.] 0x00000000000e751f 1.64% libglib-2.0.so.0.3200.4 [.] 0x000000000004fca0 1.20% [kernel] [k] __srcu_read_lock 1.14% [kernel] [k] do_sys_poll 0.96% [kernel] [k] _raw_spin_lock_irq 0.95% [kernel] [k] __pollwait 0.91% [kernel] [k] __srcu_read_unlock 0.78% [kernel] [k] tcp_poll 0.74% [kvm] [k] vcpu_enter_guest 0.73% [kvm_intel] [k] vmx_vcpu_run 0.72% [kernel] [k] _raw_spin_lock 0.72% [kernel] [k] system_call_after_swapgs 0.70% [kernel] [k] copy_user_enhanced_fast_string 0.67% libglib-2.0.so.0.3200.4 [.] g_slice_free1 0.66% libpthread-2.13.so [.] 0x000000000000e12d 0.65% [kernel] [k] system_call 0.61% [kernel] [k] do_direct_IO 0.57% qemu-system-x86_64 [.] qemu_iohandler_poll 0.57% [kernel] [k] fsnotify 0.54% libglib-2.0.so.0.3200.4 [.] g_slice_alloc 0.50% [kernel] [k] vfs_write 0.49% libpthread-2.13.so [.] pthread_getspecific 0.48% qemu-system-x86_64 [.] qemu_event_reset
Quoted 8 lines
0.47% libglib-2.0.so.0.3200.4 [.] g_main_context_check
0.46% qemu-system-x86_64 [.] address_space_translate_internal
0.46% [kernel] [k] sock_poll
0.46% libpthread-2.13.so [.] __pthread_disable_asynccancel
0.44% [kernel] [k] resched_task
0.43% libpthread-2.13.so [.] __pthread_enable_asynccancel
0.42% qemu-system-x86_64 [.] phys_page_find
0.39% qemu-system-x86_64 [.] object_dynamic_cast_assertMax: Unrelated to this performance issue but I notice that the qcow2 metadata overlap check is high in the host CPU profile. Have you had any thoughts about optimizing the check?
Stefan
Quoted 5 lines · Stefan Hajnoczi
Max: Unrelated to this performance issue but I notice that the qcow2 metadata overlap check is high in the host CPU profile. Have you had any thoughts about optimizing the check?
Stefan
In fact, I have done so (albeit only briefly). Instead of gathering all the information in the overlap function itself, we could either have a generic list of typed ranges (e.g. "cluster 0: header", "clusters 1 to 5: L1 table", etc.) or a not-really-bitmap (with 4 bits per entry specifying the cluster type (header, L1 table, free or data cluster, etc.)).
The disadvantage of the former would be that in its simplest form we'd have to run through the whole list to find out whether a cluster is already reserved for metadata or not. We could easily optimize this by keeping the list in order and then performing a binary search.
The disadvantage of the latter would obviously be its memory size. For a 1 TB image with 64 kB clusters, it would be 8 MB in size. Could be considered acceptable, but I deem it too large. The advantage would be constant access time, of course.
We could combine both approaches, that is, using the bitmap as a cache: Whenever a cluster is overlap checked, the corresponding bitmap range (or "bitmap window") is requested; if that is not available, it is generated from the range list and then put into the cache.
The remaining question is how large the range list would be in memory. Basically, its size would be comparable to an RLE version of the bitmap. In contrast to a raw RLE version, however, we'd have to add the start cluster to each entry in order to be able to perform binary search and we'd omit free and/or data clusters. So, we'd have 4 bits for the cluster type, let's say 12 bits for the cluster count and of course 64 bits for the first cluster index. Or, for maximum efficiency, we'd have 64 - 9 - 1 = 54 bits for the cluster index, 4 bits for the type and then 6 bits for the cluster count. The first variant gives us 10 bytes per metadata range, the second 8. Considering one refcount block can handle cluster_size / 2 entries and one L2 table can handle cluster_size / 8 entries, we have (for images with a cluster size of 64 kB) a ratio of about 1/32768 refcount blocks per cluster and 1/8192 L2 tables per cluster. I guess we therefore have a metadata ratio of about 1/6000. At the worst, each metadata cluster requires its own range list entry, which for 10 bytes per entry means less than 30 kB for the list of a 1 TB image with 64 kB clusters. I think that's acceptable.
We could compress that list even more by making it a real RLE version of the bitmap, removing the cluster index from each entry; remember that for this mixed range list/bitmap approach we no longer need to be able to perform exact binary search but only need to be able to quickly seek to the beginning of a bitmap window. This can be achieved by forcing breaks in the range list at every window border and keeping track of those offsets along with the corresponding bitmap window index. When we want to generate a bitmap window, we look up the start offset in the range list (constant time), then generate it (linear to window size) and can then perform constant-time lookups for each overlap checks in that window.
I think that could greatly speed things up and also allow us to always perform range checks on data structures not kept in memory (inactive L1 and L2 tables). The only question now remaining to me is whether that caching is actually feasible or whether binary search into the range list (which then would have to include the cluster index for each entry) would be faster than generating bitmap windows which might suffer from ping-pong effects.
Max
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
If virtio-blk and virtio-serial share an IRQ, the guest operating
system has to check each virtqueue for activity. Maybe there is some inefficiency doing that.
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
AFAIK virtio-serial registers 64 virtqueues (on 31 ports +
console) even if everything is unused.
Quoted 10 lines
Quoted 10 lines
Quoted 9 lines
Quoted 4 lines
Quoted 2 lines
That could be the case if MSI is disabled.
Do the windows virtio drivers enable MSIs, in their inf file?
It depends on the version of the drivers, but it is a reasonable guess at what differs between Linux and Windows. Haoyu, can you give us the output of lspci from a Linux guest?
I made a test with fio on rhel-6.5 guest, the same degradation
happened too, this degradation can be reproduced on rhel6.5 guest 100%.
Quoted 11 lines
Quoted 5 lines
virtio_consolemodule installed:
64K-write-sequence: 285 MBPS, 4380 IOPSvirtio_consolemodule uninstalled:
64K-write-sequence: 370 MBPS, 5670 IOPSI use top -d 1 -H -p <qemu-pid> to monitor the cpu usage, and found that,
virtio_consolemodule installed:
qemu main thread cpu usage: 98%virtio_consolemodule uninstalled:
qemu main thread cpu usage: 60%
I found that the statement "err = register_virtio_driver(&virtio_console);" in virtio_console module's init() function will
cause the degradation, if I directly return before "err = register_virtio_driver(&virtio_console);", then the degradation disappeared, if directly return after "err = register_virtio_driver(&virtio_console);", the degradation is still there. I will try below test case,
1. Dose not emulate virito-serial deivce, then install/uninstall virtio_console driver in guest,
to see whether there is difference in virtio-blk performance and cpu usage.
2. Does not emulate virito-serial deivce, then install virtio_balloon driver (and also dose not emulate virtio-balloon device),
to see whether virtio-blk performance degradation will happen.
3. Emulating virtio-balloon device instead of virtio-serial deivce , then to see whether the virtio-blk performance is hampered.
Base on the test result, corresponding analysis will be performed. Any ideas?
Thanks,
Zhang Haoyu
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
In reply to Zhang HaoyuQuoted 16 lines · Zhang Haoyu
Quoted 16 lines
Quoted 16 lines
Quoted 11 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSbut if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
Quoted 6 lines
Quoted 4 lines
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.
Using the vectors= option as mentioned below, you can restrict the number of MSI vectors the virtio-serial device gets. You can then confirm whether it's MSI that's related to these issues.
Quoted 11 lines
Quoted 11 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Thanks,
Zhang HaoyuQuoted 3 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 42 lines · Amit Shah
Quoted 16 lines · Zhang Haoyu
Quoted 16 lines
Quoted 16 lines
Quoted 11 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSbut if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
Quoted 6 lines
Quoted 4 lines
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.Using the vectors= option as mentioned below, you can restrict the number of MSI vectors the virtio-serial device gets. You can then confirm whether it's MSI that's related to these issues.
Quoted 11 lines
Quoted 11 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Thanks,
Zhang HaoyuQuoted 3 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Quoted 5 lines
Amit
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Can confirm serious degradation comparing to the 1.1 with regular serial output - I am able to hang VM forever after some tens of seconds after continuously printing dmest to the ttyS0. VM just ate all available CPU quota during test and hanged over some tens of seconds, not even responding to regular pings and progressively raising CPU consumption up to the limit.
Re: [question] virtio-blk performance degradationhappened with virito-serial
Quoted 6 lines · Andrey Korolyov
Can confirm serious degradation comparing to the 1.1 with regular serial output - I am able to hang VM forever after some tens of seconds after continuously printing dmest to the ttyS0. VM just ate all available CPU quota during test and hanged over some tens of seconds, not even responding to regular pings and progressively raising CPU consumption up to the limit.
Entirely different to what's being discussed here. You're observing slowdown with ttyS0 in the guest -- the isa-serial device. This thread is discussing virtio-blk and virtio-serial.
Amit
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
Quoted 9 lines · Amit Shah
Quoted 6 lines · Andrey Korolyov
Can confirm serious degradation comparing to the 1.1 with regular serial output - I am able to hang VM forever after some tens of seconds after continuously printing dmest to the ttyS0. VM just ate all available CPU quota during test and hanged over some tens of seconds, not even responding to regular pings and progressively raising CPU consumption up to the limit.
Quoted 5 lines
Entirely different to what's being discussed here. You're observing slowdown with ttyS0 in the guest -- the isa-serial device. This thread is discussing virtio-blk and virtio-serial.
Amit
Sorry for thread hijacking, the problem definitely not related to the interrupt rework, will start a new thread.
Re: [Qemu-devel] [question] virtio-blk performancedegradationhappened with virito-serial
In reply to Amit ShahQuoted 20 lines
Quoted 20 lines
Quoted 20 lines
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSQuoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
Quoted 7 lines
Quoted 2 lines
add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.Using the vectors= option as mentioned below, you can restrict the number of MSI vectors the virtio-serial device gets. You can then confirm whether it's MSI that's related to these issues.
I use "-device virtio-serial,vectors=4" instead of "-device virtio-serial", but the degradation still happened, nothing changed. with virtio-serial enabled:
64k-write-sequence: 4200 IOPS
with virtio-serial disabled:
64k-write-sequence: 5300 IOPS
How to confirm whether it's MSI in windows?
Thanks,
Zhang Haoyu
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Thanks,
Zhang HaoyuQuoted 3 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Re: [Qemu-devel] [question] virtio-blk performance degradationhappened with virito-serial
In reply to Amit ShahQuoted 21 lines · Amit Shah
Quoted 20 lines · Zhang Haoyu
Quoted 20 lines
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSQuoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.
Quoted 6 lines
Quoted 2 lines
add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.Using the vectors= option as mentioned below, you can restrict the number of MSI vectors the virtio-serial device gets. You can then confirm whether it's MSI that's related to these issues.
Amit,
It's related to the big number of ioeventfds used in virtio-serial-pci. With virtio-serial-pci's ioeventfd=off, the performance is not affected no matter if guest initializes it or not.
In my test, there are 12 fds to poll in qemu_poll_ns before loading guest virtio_console.ko, whereas 76 once modprobe virtio_console.
Looks like the ppoll takes more time to poll more fds.
Some trace data with systemtap:
12 fds:
time rel_time symbol 15 (+1) qemu_poll_ns [enter] 18 (+3) qemu_poll_ns [return]
76 fd:
12 (+2) qemu_poll_ns [enter] 18 (+6) qemu_poll_ns [return]
I haven't looked at virtio-serial code, I'm not sure if we should reduce the number of ioeventfds in virtio-serial-pci or focus on lower level efficiency.
Haven't compared with g_poll but I think the underlying syscall should be the same.
Any ideas?
Fam
Quoted 20 lines
Quoted 7 lines
Quoted 7 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Quoted 5 lines
Quoted 5 lines
Thanks,
Zhang HaoyuQuoted 3 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Paolo Bonzini
maintainerRe: [question] virtio-blk performance degradationhappened with virito-serial
Il 19/09/2014 07:53, Fam Zheng ha scritto:
Quoted 1 line
Any ideas?
The obvious, but hardish one is to switch to epoll (one epoll fd per AioContext, plus one for iohandler.c).
This would require converting iohandler.c to a GSource.
Paolo
Re: [Qemu-devel] [question] virtio-blk performancedegradationhappened with virito-serial
In reply to Fam ZhengQuoted 46 lines
Quoted 20 lines
Quoted 20 lines
Quoted 20 lines
Quoted 8 lines
Quoted 8 lines
Hi, all
I start a VM with virtio-serial (default ports number: 31), and found that virtio-blk performance degradation happened, about 25%, this problem can be reproduced 100%. without virtio-serial:
4k-read-random 1186 IOPS
with virtio-serial:
4k-read-random 871 IOPSQuoted 8 lines
Quoted 3 lines
but if use max_ports=2 option to limit the max number of virio-serial ports, then the IO performance degradation is not so serious, about 5%.
And, ide performance degradation does not happen with virtio-serial.
Pretty sure it's related to MSI vectors in use. It's possible that the virtio-serial device takes up all the avl vectors in the guests, leaving old-style irqs for the virtio-blk device.
I don't think so,
I use iometer to test 64k-read(or write)-sequence case, if I disable the virtio-serial dynamically via device manager->virtio-serial => disable, then the performance get promotion about 25% immediately, then I re-enable the virtio-serial via device manager->virtio-serial => enable, the performance got back again, very obvious.Quoted 6 lines
Quoted 2 lines
add comments:
Although the virtio-serial is enabled, I don't use it at all, the degradation still happened.Using the vectors= option as mentioned below, you can restrict the number of MSI vectors the virtio-serial device gets. You can then confirm whether it's MSI that's related to these issues.
Amit,
It's related to the big number of ioeventfds used in virtio-serial-pci. With virtio-serial-pci's ioeventfd=off, the performance is not affected no matter if guest initializes it or not.
In my test, there are 12 fds to poll in
qemu_poll_nsbefore loading guest virtio_console.ko, whereas 76 once modprobevirtio_console.Looks like the ppoll takes more time to poll more fds.
Some trace data with systemtap:
12 fds:
time rel_time symbol 15 (+1) qemu_poll_ns [enter] 18 (+3) qemu_poll_ns [return]
Quoted 8 lines
76 fd:
12 (+2) qemu_poll_ns [enter] 18 (+6) qemu_poll_ns [return]I haven't looked at virtio-serial code, I'm not sure if we should reduce the number of ioeventfds in virtio-serial-pci or focus on lower level efficiency.
Does ioeventfd=off hamper the performance of virtio-serial?
In my opinion, virtio-serial's use scenario is not so high throughput rate, so ioventfd=off has slight impaction on the performance.
Thanks,
Zhang Haoyu
Quoted 24 lines
Haven't compared with
g_pollbut I think the underlying syscall should be the same.Any ideas?
Fam
Quoted 16 lines
Quoted 7 lines
Quoted 7 lines
So, I think it has no business with legacy interrupt mode, right?
I am going to observe the difference of perf top data on qemu and perf kvm stat data when disable/enable virtio-serial in guest, and the difference of perf top data on guest when disable/enable virtio-serial in guest,
any ideas?Quoted 5 lines
Quoted 5 lines
Thanks,
Zhang HaoyuQuoted 3 lines
If you restrict the number of vectors the virtio-serial device gets (using the -device virtio-serial-pci,vectors= param), does that make things better for you?
Amit
Re: [Qemu-devel] [question] virtio-blk performancedegradationhappened with virito-serial
Quoted 22 lines · Zhang Haoyu
Quoted 22 lines
Amit,
It's related to the big number of ioeventfds used in virtio-serial-pci. With virtio-serial-pci's ioeventfd=off, the performance is not affected no matter if guest initializes it or not.
In my test, there are 12 fds to poll in
qemu_poll_nsbefore loading guest virtio_console.ko, whereas 76 once modprobevirtio_console.Looks like the ppoll takes more time to poll more fds.
Some trace data with systemtap:
12 fds:
time rel_time symbol 15 (+1) qemu_poll_ns [enter] 18 (+3) qemu_poll_ns [return]76 fd:
Quoted 7 lines
Quoted 6 lines
12 (+2) qemu_poll_ns [enter] 18 (+6) qemu_poll_ns [return]I haven't looked at virtio-serial code, I'm not sure if we should reduce the number of ioeventfds in virtio-serial-pci or focus on lower level efficiency.
Does ioeventfd=off hamper the performance of virtio-serial?
In theory it has an impact, but I have no data about this. If you have a performance demand, it's best to try it against your use case to answer this question.
Fam