From: "Charles 'Buck' Krasic" <krasic@cs.ubc.ca>
To: linux-kernel@vger.kernel.org
Subject: Re: observe and act upon workload parallelism: PERF_TYPE_PARALLELISM (Was: [RFC][PATCH] sched_wait_block: wait for blocked threads)
Date: Thu, 26 Nov 2009 13:59:16 -0800 [thread overview]
Message-ID: <4B0EFA34.3080802@cs.ubc.ca> (raw)
Hi,
I recently posted to the kernel list about our research in linux
scheduling, but I suspect few noticed the post:
http://lwn.net/Articles/358295/
Our work is very much focused on supporting efficient user-level
scheduling (meaning event driven apps), and
augmenting a "poll" interface to that end, ours is call coop_poll().
We are very much interested in the scaling in the cases where threads
are busy most of the time, so I hope people on this thread might take a
look.
The paper about it and slides from the talk I gave at Eurosys 2009 are
at the above link.
-- Buck
On Nov 21, 3:30 am, Stijn Devriendt <high...@gmail.com> wrote:
> > Think of it like a classic user-level threading package, where one
process
> > implements multiple threads entirely in user space, and switches
between
> > them. Except we'd do the exact reverse: create multiple threads in the
> > kernel, but only run _one_ of them at a time. So as far as the
scheduler
> > is concerned, it acts as just a single thread - except it's a single
> > thread that has multiple instances associated with it.
>
> > And every time the "currently active" thread in that group runs out
of CPU
> > time - or any time it sleeps - we'd just go on to the next thread
in the
> > group.
>
> Without trying to sound selfish: after some thinking I can't see how this
> solves my problem. This is fine for the case you mentioned later on,
> like UI threads, but it's not powerful enough for what I'm trying to
achieve.
>
> Let's make the round-trip for the thread pool case and start with an
empty
> thread pool queue:
> - All threads are blocked on the queue condition variable untill new work
> is queued.
> - Thread 1 happily wakes up and runs the work item untill it's blocked.
> - A new work item arrives and Thread 2 is woken to handle the new work
> item.
> - As long as new work arrives and Thread 2 is not blocked (regardless
> of preemption because the deal was that they will not preempt each
> other) Thread 2 keeps running this work.
> Even when Thread 1 is woken, it will not preempt Thread 1.
>
> One solution would be to let Thread 2 call sched_yield, but the
> question then is "when" and "how much". Every time a lightweight
> thread yields, you'll incur context switches. Because you don't
> know when or how much, you'll be penalized for context switching
> even when not needed. (Consider 1 blocked thread and 4 extra threads
> sched_yield'ing every 5 work items)
>
> Another option is to have a group-leader. Non-leader threads will call
> sched_yield once in a while in order to try and jump back to the
group-leader.
> The group-leader will always continue work without sched_yield'ing.
> There's no preemption between these threads.
> The down-side is that in case multiple of these threads are waiting for
> an event, wake-ups must wake the group leader rather than the other
> coop-scheduled threads for this model to work.
> Another down-side is that when a non-leader thread is blocked and the
> group-leader is run, the non-leader thread is treated unfair.
>
> Either solution's end-result is a very unfair threadpool where one cannot
> guarantee even a loose FIFO-model where items are handled more or
> less in the order they are queued and a library that needs to make
> trade-offs in performance to get this behaviour back.
>
> The solution is great when the threads are blocked most of the time
> and have little CPU processing to do (like UI threads), but doesn't
> scale beyond that.
>
> As ever, enlighten me when you have a great solution to this problem.
>
> Stijn
> --
> To unsubscribe from this list: send the line "unsubscribe
linux-kernel" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next reply other threads:[~2009-11-26 21:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-26 21:59 Charles 'Buck' Krasic [this message]
[not found] <dKVtE-7Jt-21@gated-at.bofh.it>
[not found] ` <dKVtE-7Jt-23@gated-at.bofh.it>
[not found] ` <dKVtE-7Jt-25@gated-at.bofh.it>
[not found] ` <dKVtE-7Jt-27@gated-at.bofh.it>
[not found] ` <dKVtE-7Jt-19@gated-at.bofh.it>
[not found] ` <dL7XP-2R5-13@gated-at.bofh.it>
2009-11-27 17:19 ` observe and act upon workload parallelism: PERF_TYPE_PARALLELISM (Was: [RFC][PATCH] sched_wait_block: wait for blocked threads) Buck
2009-11-28 1:19 ` Anirban Sinha
[not found] <fa.KsFh5TyrbQsJFfr+ZG/B2XUIl64@ifi.uio.no>
[not found] ` <fa.VvrbWjrI+B/wni3lCHPP3szBuO8@ifi.uio.no>
[not found] ` <fa.Nf5tUBtLntQXqlJGJxXNN4M8u4o@ifi.uio.no>
[not found] ` <fa.Hqdoss5lzrLWp+lFEJqZ/ujkI+s@ifi.uio.no>
2009-11-26 21:08 ` Buck
2009-11-27 12:10 ` Stijn Devriendt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B0EFA34.3080802@cs.ubc.ca \
--to=krasic@cs.ubc.ca \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox