I assume thread affinity can't literal mean no lock contention. You'd need a lock on the thread run queue wouldn't you? Continuations can't only get queued for the event thread from the event thread. I don't think we can say conclusively that there would be a significant difference due to lock contention. I'm guessing that Fei would agree that the Continuation dispatch code is difficult to understand and work on. Simplification and more modularity is obviously a goal. Seems like it would be simpler if all the Continuations in a to-run list where actually ready to run.
On Tue, Oct 1, 2019 at 9:22 AM Alan Carroll <solidwallofc...@verizonmedia.com.invalid> wrote: > Do you have any more specific information on mutex contention? We have in > fact already looked at doing this, I think back in 2015 with Dan Xu. The > goal there was to have queues with the mutexes to avoid rescheduling. As a > precursor Dan did some profiling and the only significant lock contention > he could find was in the cache. That lead to the partial object caching > work setting up queues for the hot locks, but it was decided that given the > lack of > contention elsewhere, it wasn't worth the complexity. > > I think thread affinity is a better choice because no lock contention will > always beat even the most optimized lock contention resolution. If > Continuations related to the same constellation of data objects are on the > same thread, then the locks are never contested, which makes it as fast as > possible. > > On Mon, Sep 30, 2019 at 3:45 PM Walt Karas <wka...@verizonmedia.com > .invalid> > wrote: > > > From the longer-term TSers I've heard comments about seeing profiling > > results that show that waiting on mutexes is a significant performance > > issue with TS. But I'm not aware of any write-ups of such results. > > Unfortunately, I'm relatively new to TS and Linux, so I'm not currently > > familiar with the best approaches to profiling TS. > > > > For better performance, I think that having a single to-run Continuation > > queue, or one per core, with a queue feeding multiple event threads is > the > > main thing. It's more resilient to Continuations that block. There > > doesn't seem to be enthusiasm for getting hard-core about not having > > blocking Continuations (see > > https://github.com/apache/trafficserver/pull/5412 ). I'm not sure > > changing > > to queue-based mutexes would have a significant performance impact. But > it > > seems a cleaner design, making sure Continuations in the to-run list(s) > are > > actually ready to run. But a different mutex implementation is not > > strictly necessary in order to consolidate to-run Continuation queues. > > > > On Mon, Sep 30, 2019 at 2:39 PM Kees Spoelstra <kspoels...@we-amp.com> > > wrote: > > > > > Sounds very interesting. > > > But what is the problem we're trying to solve here, I like the thread > > > affinity because it gives us head ache free concurrency in some cases, > > and > > > I'll bet that there is some code which doesn't have the proper > > continuation > > > mutexes because we know it runs on the same thread. > > > > > > Are we seeing a lot of imbalanced threads (too much processing causing > > long > > > queues of continuations, which I can imagine in some cases) ? And > > shouldn't > > > we balance based on transactions or connections, move those around when > > we > > > see imbalance and aim for embarrassingly parallel processing :) Come > > > to think of it, this might introduce another set of problems, how to > know > > > which continuations are part of the life cycle of a connection :/ > > > > > > Jumping threads in one transaction is not always ideal either, this can > > > really hurt performance. But your proposed model seems to handle that > > > somewhat better than the current implementation. > > > > > > Very interested and wondering what this would mean for plugin > developers. > > > > > > On Mon, 30 Sep 2019, 19:20 Walt Karas, <wka...@verizonmedia.com > .invalid> > > > wrote: > > > > > > > If a Continuation is scheduled, but its mutex is locked, it's put in > a > > > > queue specific to that mutex. The release function for the mutex > > (called > > > > when a Continuation holding the mutex exists) would put the > > Continuation > > > at > > > > the front of the mutex's queue (if not empty) into the ready-to-run > > queue > > > > (transferring the lock to that Continuation). A drawback is that the > > > queue > > > > would itself need a mutex (spinlock?), but the critical section would > > be > > > > very short. > > > > > > > > There would be a function to lock a mutex directly. It would create > a > > > > Continuation that had two condition variables. It would assign the > > mutex > > > > to this Continuation and schedule it. (In this case, it might make > > sense > > > > to put this Continuation at the front of the mutex's queue, since it > > > would > > > > be blocking an entire event thread.) The direct-lock function would > > then > > > > block on the first condition variable. When the Continuation ran, it > > > would > > > > trigger the first condition variable, and then block on the second > > > > condition variable. The direct-lock function would then exit, > allowing > > > the > > > > calling code to enter its critical section. At the end of the > critical > > > > section, another function to release the direct lock would be called. > > It > > > > would trigger the second condition variable, which would cause the > > > function > > > > of the Continuation created for the direct lock to exit (thus > releasing > > > the > > > > mutex). > > > > > > > > With this approach, I'm not sure thread affinities would be of any > > value. > > > > I think perhaps each core should have it's own list of ready-to-run > > > > Continuations, and a pool of event threads with affinity to that > core. > > > Not > > > > having per-event-thread ready-to-run lists means that a Continuation > > > > function that blocks is less likely to block other ready-to-run > > > > Continuations. If Continuations had core affinities to some degree, > > this > > > > might reduce evictions in per-core memory cache. (Multiple > > Continuations > > > > having the same function should have the same core affinity.) > > > > > > > > > >