sub milisec socket server write

Neeraj Rai rneeraj at yahoo.com
Wed Feb 17 04:10:19 CET 2010


Thanks a lot for replies Marc. I'll try to digest the info you have 
provided and continue with experimenting as suggested.

Neeraj
--- On Tue, 2/16/10, Marc Lehmann <schmorp at schmorp.de> wrote:

> From: Marc Lehmann <schmorp at schmorp.de>
> Subject: Re: sub milisec socket server write
> To: "Neeraj Rai" <rneeraj at yahoo.com>
> Cc: libev at lists.schmorp.de
> Date: Tuesday, February 16, 2010, 3:46 AM
> Please don't wrap e-mails you receive
> in the horrible way you do - that
> makes your e-mails needlessly hard to read - not a good way
> to encourage
> replies. Especially as your e-mail client itself creates
> extremely long
> lines itself, which again makes your mails harder to read.
> 
> On Mon, Feb 15, 2010 at 06:18:26PM -0800, Neeraj Rai <rneeraj at yahoo.com>
> wrote:
> > > ev_async doesn't necessarily use a pipe (it uses
> eventfd if
> > > available),
> > > and if it uses one, it never writes more than a
> single
> > > octet.
> > is this 1 octet per write ? or is it 1 octet till it
> is consumed and then
> > next octet ?
> 
> there is usually just one single octet in the pipe, but
> it's impossible
> to avoid having multiple octets in there (there is a race
> when multiple
> threads try to write at the same time) in general. the
> latter should be
> very rare, and doesn't affect correctness, so "one octet
> max at any time"
> is a reasonable expectation.
> 
> > > Note that pipes are quite slow compared to
> memory
> > > manipulation (and
> > > eventfd is even slower if your threads run on
> different
> > > cores, but that
> > > should be avoided in general!).
> > Sorry, I'm confused by this. So what's the best way to
> use ev_async ? 
> 
> Well, just use it as often as you want/need. ev_async is
> optimised quite
> well, but it still incurs a kernel syscall once per loop
> iteration, and
> waking up the loop blocking in the kernel.
> 
> > Or are you hinting that I shouldn't worry about this
> as it will be slow no
> > matter what.
> 
> I am saying that you need to kepe in mind that event
> processing is not
> free - you still need to ask the kernel for events, and you
> still need a
> pipe write (or eventfd write).
> 
> The trade-offs are often not clear - evetnfd is way faster
> than a pipe
> when you keep your threads on a single core (which is what
> threads are
> made for), and pipes are much faster than eventfd when the
> threads are
> spread over multiple cores.
> 
> YMMV.
> 
> > One more complication here that I should have
> mentioned is that single thread handles many connections.
> Each connection has an input queue. These
> > are polled non-blocking (peek and continue) for data.
> If data not found, next queue is checked. And this might
> still work well with what you suggest- poll queue and write
> blocking.
> 
> Well, that doesn't sound efficient, but maybe you have to
> do that to
> achieve some latency requirement, that's not clear from
> what you write.
> 
> Achieving low latency (<< 10ms) on a non-rt kernel
> (linux) is hard in any
> case, and libev doesn't even attempt to give you 1ms
> accuracy. You will
> have to experiment a lot.
> 
> > We tried blocking writes stress test a while back (
> and I had even little experience then... so it could have
> been some stupid obvious bug),
> > and got a deadlock with channel full.
> 
> Blocking I/O is not viable when you have more than one
> socket per thread
> to tend to.
> 
> -- 
>                 The
> choice of a       Deliantra, the
> free code+content MORPG
>       -----==- 
>    _GNU_         
>     http://www.deliantra.net
>       ----==-- _   
>    generation
>       ---==---(_)__  __ ____ 
> __      Marc Lehmann
>       --==---/ / _ \/ // /\ \/ / 
>     schmorp at schmorp.de
>       -=====/_/_//_/\_,_/ /_/\_\
> 


      



More information about the libev mailing list