blob: 4121ca02962a9ec8752e8dcea39068e2a2b1b926 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Slow UDP performance with virtio device
I'm working on an app that is very sensitive to round-trip latency
between the guest and host, and qemu/kvm seems to be significantly
slower than it needs to be.
The attached program is a ping/pong over UDP. Call it with a single
argument to start a listener/echo server on that port. With three
arguments it becomes a counted "pinger" that will exit after a
specified number of round trips for performance measurements. For
example:
$ gcc -o udp-pong udp-pong.c
$ ./udp-pong 12345 & # start a listener on port 12345
$ time ./udp-pong 127.0.0.1 12345 1000000 # time a million round trips
When run on the loopback device on a single machine (true on the host
or within a guest), I get about 100k/s.
When run across a port forward using "user" networking on qemu (or
kvm, the performance is the same) and the default rtl8139 driver (both
the host and guest are Ubuntu Lucid), I get about 10k/s. This seems
very slow, but perhaps unavoidably so?
When run in the same configuration using the "virtio" driver, I get
only 2k/s. This is almost certainly a bug in the virtio driver, given
that it's a paravirtualized device that is 5x slower than the "slow"
hardware emulation.
I get no meaningful change in performance between kvm/qemu.
|