[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] virtio-blk: notify guest directly
From: |
sochin . jiang |
Subject: |
Re: [Qemu-devel] [PATCH] virtio-blk: notify guest directly |
Date: |
Wed, 20 Dec 2017 10:53:18 +0800 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 |
In fact, I firstly found a performance loss before and after
commit 9ffe337 using fio tools in suse11-sp3 guest(vitio-blk), especially
when testing 4k single IO models(say, write, randwrite, read and
randread, with iodepth set to 1), the result is 15%-20% performance loss
since commit 9ffe337, difference is an extra notification bh in dataplane as
I posted.
Then, I tested more IO models. Indeed, an extra BH can decrease interrupts
in guest, but not much more like ~13K/sec now, and only when testing
large IO(bs set to 64k,128k, 1024k...) or large iodepths(64, 128...) models,
~5K/sec
decreased.
I did not test all IO models of course, and different models with different
interrupts.
But on the whole, a performance loss is certain with an extra notification BH.
Sochin
On 2017/12/20 8:57, Paolo Bonzini wrote:
> On 19/12/2017 14:33, sochin.jiang wrote:
>> From: "sochin.jiang" <address@hidden>
>>
>> Till now, we've already notify guest as a batch mostly, an
>> extra BH won't decrease guest interrupts much, but cause a
>> significant notification loss. Generally, we could have 15%
>> or so performance lost in single queue IO models, as I tested.
> Interesting, this was indeed done to decrease interrupt overhead:
>
> commit 5b2ffbe4d99843fd8305c573a100047a8c962327
> Author: Ming Lei <address@hidden>
> Date: Sat Jul 12 12:08:53 2014 +0800
>
> virtio-blk: dataplane: notify guest as a batch
>
> Now requests are submitted as a batch, so it is natural
> to notify guest as a batch too.
>
> This may suppress interrupt notification to VM a lot:
>
> - in my test, decreased by ~13K/sec
>
> Signed-off-by: Ming Lei <address@hidden>
> Signed-off-by: Stefan Hajnoczi <address@hidden>
>
> Can you explain your benchmark setup?
>
> Paolo
>
>
>> Signed-off-by: sochin.jiang <address@hidden>
>> ---
>> hw/block/dataplane/virtio-blk.c | 19 +++++++------------
>> 1 file changed, 7 insertions(+), 12 deletions(-)
>>
>> diff --git a/hw/block/dataplane/virtio-blk.c
>> b/hw/block/dataplane/virtio-blk.c
>> index 5556f0e..a261a1d 100644
>> --- a/hw/block/dataplane/virtio-blk.c
>> +++ b/hw/block/dataplane/virtio-blk.c
>> @@ -32,7 +32,6 @@ struct VirtIOBlockDataPlane {
>>
>> VirtIOBlkConf *conf;
>> VirtIODevice *vdev;
>> - QEMUBH *bh; /* bh for guest notification */
>> unsigned long *batch_notify_vqs;
>>
>> /* Note that these EventNotifiers are assigned by value. This is
>> @@ -44,14 +43,7 @@ struct VirtIOBlockDataPlane {
>> AioContext *ctx;
>> };
>>
>> -/* Raise an interrupt to signal guest, if necessary */
>> -void virtio_blk_data_plane_notify(VirtIOBlockDataPlane *s, VirtQueue *vq)
>> -{
>> - set_bit(virtio_get_queue_index(vq), s->batch_notify_vqs);
>> - qemu_bh_schedule(s->bh);
>> -}
>> -
>> -static void notify_guest_bh(void *opaque)
>> +static void notify_guest(void *opaque)
>> {
>> VirtIOBlockDataPlane *s = opaque;
>> unsigned nvqs = s->conf->num_queues;
>> @@ -75,7 +67,12 @@ static void notify_guest_bh(void *opaque)
>> }
>> }
>>
>> -/* Context: QEMU global mutex held */
>> +/* Raise an interrupt to signal guest, if necessary */
>> +void virtio_blk_data_plane_notify(VirtIOBlockDataPlane *s, VirtQueue *vq)
>> +{
>> + set_bit(virtio_get_queue_index(vq), s->batch_notify_vqs);
>> + notify_guest(s);
>> +}
>> void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
>> VirtIOBlockDataPlane **dataplane,
>> Error **errp)
>> @@ -122,7 +119,6 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev,
>> VirtIOBlkConf *conf,
>> } else {
>> s->ctx = qemu_get_aio_context();
>> }
>> - s->bh = aio_bh_new(s->ctx, notify_guest_bh, s);
>> s->batch_notify_vqs = bitmap_new(conf->num_queues);
>>
>> *dataplane = s;
>> @@ -140,7 +136,6 @@ void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane
>> *s)
>> vblk = VIRTIO_BLK(s->vdev);
>> assert(!vblk->dataplane_started);
>> g_free(s->batch_notify_vqs);
>> - qemu_bh_delete(s->bh);
>> if (s->iothread) {
>> object_unref(OBJECT(s->iothread));
>> }
>>
>
> .
>