On Fri, Apr 20, 2018 at 09:46:23AM +0200, Willy Tarreau wrote:

> On Fri, Apr 20, 2018 at 09:41:08AM +0300, Slawa Olhovchenkov wrote:
> > On Fri, Apr 20, 2018 at 08:22:04AM +0200, Willy Tarreau wrote:
> > 
> > > On Fri, Apr 20, 2018 at 09:11:47AM +0300, Slawa Olhovchenkov wrote:
> > > > > Try 1.8.8, it contains the kqueue fix.
> > > > 
> > > > Work (kqueue), nice!
> > > 
> > > Excellent, thanks for your feedback!
> > 
> > Thank for fix!
> > 
> > > > Average load same as for multiprocess, but load of distinct CPU from
> > > > 0.06 to 0.39. Is this normal or expected?
> > > 
> > > It can depend on your workload. There is *always* a small overhead
> > > incured by thread synchronization that doesn't exist between processes,
> > > but the ability to share certain elements can sometimes be beneficial
> > > as well (eg: shared cache in CPU).
> > 
> > Hmm, may be I am nor clean.
> > In process mode all 8 CPU have load 0.18. In thread mode summary
> > average load still about 0.18, but distinct CPU load now different:
> > 
> > 0: 0.13
> > 1: 0.15
> > 2: 0.07
> > 3: 0.40
> > 4: 0.23
> > 5: 0.33
> > 6: 0.16
> > 7: 0.15
> > 
> > Average (0.20) is about same as 0.18 (rised by more users now)
> 
> Oh I think I understand. In multi-process mode you probably had several
> listening sockets, one per process. But in multi-thread mode you likely
> have a single one. Given that the connections are not migrated in 1.8,
> if a thread accepts a burst of connections it will have to process them.
> 
> What you can do is to keep multiple listeners, each bound to a different
> thread, exactly like you did with processes :
> 
>    bind :80 ... process 1/1
>    bind :80 ... process 1/2
>    bind :80 ... process 1/3
>    bind :80 ... process 1/4
>    ...
>    bind :80 ... process 1/8

CPU 0 busy 100%, all other -- 0%.

> I think we should post an article to explain how to optimize configs for
> threads, especially when coming from nbproc. Also, one very important
> thing I don't mention enough is that you must never ever have more
> threads than enabled CPUs. The threads are meant to be fast and almost
> never interrupted outside of poll(). If a context switch happens while
> a thread holds a lock, it will stall other threads' processing.

Reply via email to