[illumos-Developer] "preallocation" style taskqs
Garrett D'Amore
garrett at damore.org
Fri Feb 11 19:08:50 PST 2011
On Sat, 2011-02-12 at 12:06 +1000, David Gwynne wrote:
> To my mind the performance is less interesting than making code more
> robust by avoiding the possibility that the taskq ent allocation can
> fail.
Me too... dealing with scheduling failure in interrupt context can be a
significant PITA. That's the first time this came up in my brain, a few
years ago... I've just never been bothered enough to fix it. (Then
there was that whole PSARC thing... :-p)
- Garrett
>
> Sent from my phone
>
> ----- Reply message -----
> From: "Garrett D'Amore" <garrett at damore.org>
> Date: Sat, Feb 12, 2011 08:49
> Subject: [illumos-Developer] "preallocation" style taskqs
> To: "Eric Schrock" <eric.schrock at delphix.com>
> Cc: <developer at lists.illumos.org>
>
>
> On Fri, 2011-02-11 at 17:34 -0500, Eric Schrock wrote:
> > Seems reasonable to me. Out of curiosity, do you have any perf
> > numbers?
>
> No numbers... its just something that has bugged me many many times.
> There are cases where I know of bugs that result in far too many
> allocations due to dispatching to the same queue millions of jobs, and
> other cases where I know we are hitting the backing kmem store pretty
> hard.
>
> Collecting numbers would be done on a case by case basis as we convert
> individual callers to use the new interface.
>
> >
> > Do we need it to be part of the DDI, or can we just make it
> > consolidation private? My concern is that if there is going to be
> any
> > significant effort around taskq scalability (which there probably
> > should be), we may want to change this structure. And what does it
> > even mean to be in the DDI in Illumos? Do we have a 9F manpage
> > repository that would be modified to include this?
>
> I'd be happy to have a non-DDI version to start with. The question
> about what a DDI means are interesting... that presumes a functioning
> ARC (there is developer-council, but that's mostly quiescent at
> present), and real doc efforts, etc.
>
>
> > On a side note, if you're looking at general taskq scalability, one
> > major problem is the lack of CPU affinity for non-dynamic taskqs.
>
> Yes, although its not entirely clear how to handle that generically --
> but perhaps tagging a cpuid and dispatching to a per-cpu list first
> would be a start.
>
> - Garrett
> >
> >
> > Thanks,
> >
> >
> > - Eric
> >
> > On Fri, Feb 11, 2011 at 4:14 PM, Garrett D'Amore
> <garrett at damore.org>
> > wrote:
> > So I've been wanting to do this for a long time.... and I
> > think that it
> > relates to certain bugs.
> >
> > In illumos, taskqs are used *heavily* for scheduling,
> because
> > they are
> > extremely convenient to work with.
> >
> > However, one thing that often gets overlooked is that the
> > implementation
> > in illumos requires hitting up a shared list, or possibly
> even
> > doing a
> > kmem_cache_alloc() to get a task entry.
> >
> > Many of the uses of taskqs could be made to eliminate this
> > code path,
> > reducing contention on hot paths (e.g. taskq dispatch can be
> > called up
> > to once per packet for networking!) by having support for
> > preallocated
> > taskq_ent_t's that were stored within data structures.
> >
> > For example, zio_t could use an inline taskq_ent_t, to
> handle
> > dispatching of zio_execute or zio_reexecute (although note
> > that this
> > only makes sense where a zio can only be dispatched onto a
> > single such
> > taskq.)
> >
> > This could also offer a "guaranteed" form of taskq dispatch,
> > since if
> > the data structure is already preallocated there is no
> chance
> > of an
> > allocation failure, even in situations which might be
> > challenging, like
> > interrupt context.
> >
> > For folks trying to achieve extreme performance, I think
> this
> > could win.
> >
> > To this end, I'm proposing the following:
> >
> > sizeof (taskq_ent_t) become a fixed part of the DDI. (The
> > actual
> > structure contents would be undocumented/opaque.)
> >
> > creation of a new interface:
> >
> > void ddi_taskq_dispatch_prealloc(ddi_taskq_t *, void
> > (*func)(void *),
> > void *arg, uint_t flags, taskq_ent_t *);
> >
> > Note that from a simple matter of ease of implementation,
> this
> > interface
> > would *only* be available to non-DYNAMIC taskqs. (With the
> > potential to
> > allocate new threads, etc. dynamic taskqs don't seem well
> > suited to
> > preallocation.)
> >
> > Note that IIRC NetBSD taskqs work much like I'm suggesting
> > here, except
> > that they are *always* prealloc style. (That may have
> changed
> > since I
> > last looked though.)
> >
> > Thoughts?
> >
> > - Garrett
> >
> >
> > _______________________________________________
> > Developer mailing list
> > Developer at lists.illumos.org
> > http://lists.illumos.org/m/listinfo/developer
> >
> >
> >
> > --
> > Eric Schrock
> > Delphix
> >
> >
> > 275 Middlefield Road, Suite 50
> > Menlo Park, CA 94025
> > http://www.delphix.com
> >
> >
>
>
>
> _______________________________________________
> Developer mailing list
> Developer at lists.illumos.org
> http://lists.illumos.org/m/listinfo/developer
>
>
More information about the Developer
mailing list