Thread (23 messages) flat view 23 messages, 8 authors, 2012-03-12

Re: [PATCH 1/2] vhost: allow multiple workers threads

From: Jason Wang <hidden>
Date: 2012-02-21 04:51:53

On 02/19/2012 10:41 PM, Michael S. Tsirkin wrote:
On Fri, Feb 17, 2012 at 05:02:05PM -0600, Anthony Liguori wrote:
quoted
quoted
 This patch allows vhost to have multiple worker threads for devices such as
 virtio-net which may have multiple virtqueues.
 
 Since virtqueues are a lockless ring queue, in an ideal world data is being
 produced by the producer as fast as data is being consumed by the consumer.
 These loops will continue to consume data until none is left.
 
 vhost currently multiplexes the consumer side of the queue on a single thread
 by attempting to read from the queue until everything is read or it cannot
 process anymore.  This means that activity on one queue may stall another queue.
There's actually an attempt to address this: look up
VHOST_NET_WEIGHT in the code. I take it, this isn't effective?
quoted
quoted
 This is exacerbated when using any form of polling to read from the queues (as
 we'll introduce in the next patch).  By spawning a thread per-virtqueue, this
 is addressed.
 
 The only problem with this patch right now is how the wake up of the threads is
 done.  It's essentially a broadcast and we have seen lock contention as a
 result.
On which lock?
quoted
quoted
 We've tried some approaches to signal a single thread but I'm not
 confident that that code is correct yet so I'm only sending the broadcast
 version.
Yes, that looks like an obvious question.
quoted
quoted
 Here are some performance results from this change.  There's a modest
 improvement with stream although a fair bit of variability too.
 
 With RR, there's pretty significant improvements as the instance rate drives up.
Interesting. This was actually tested at one time and we saw
a significant performance improvement from using
a single thread especially with a single
stream in the guest. Profiling indicated that
with a single thread we get too many context
switches between TX and RX, since guest networking
tends to run TX and RX processing on the same
guest VCPU.

Maybe we were wrong or maybe this went away
for some reason. I'll see if this can be reproduced.
I've tried a similar test in Jan. The test uses one dedicated vhost 
thread to handle tx requests and another one for rx. Test result shows 
much degradation as the both of the #exits and #irq are increased. There 
are some differences as I test between local host and guest, and the 
guest does not have very recent virtio changes ( unlocked kick and 
exposing index immediately ). I would try the recent kernel.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help