Yes.
Firstly, thanks Olaf for measuring and analyzing this so carefully.
From your description i get the impression that you are trying to
maximize throughput for benchmarks - AIM9 and dbench live and die on
the ability to batch the workload.
If that is indeed the goal, could you try your measurement with
SCHED_BATCH enabled for all relevant (server and client) tasks?
SCHED_BATCH is a hint to the scheduler that the workload does not
care about wakeup latecy. Do you still get the new-fair-sleepers
sensitivity in that case?
The easiest way to se SCHED_BATCH is to do this in a shell:
schedtool -B $$
and then restart all server tasks ('service mysqld restart' for
example) and start the benchmark - all child tasks will have
SCHED_BATCH set.
<plug>
Also, analysis of such problems can generally be done faster and
more accuately (and the results are more convincing) if you use
perfcounters. It's very easy to set it up, as long as you have Core2
(or later) Intel CPUs or AMD CPUs. Pull this tree:
git pull \
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git \
perfcounters/core
No configuration needed - build it (accept the defaults), and boot
it and do:
cd Documentation/perf_counter/
make -j
and you are set. You can try:
./perf stat -a sleep 10
to get a 10 seconds snapshot of what's going on in the system:
aldebaran:~> perf stat -a sleep 10
Performance counter stats for 'sleep':
159827.019426 task clock ticks (msecs)
1274 context switches # 0.000 M/sec
78 CPU migrations # 0.000 M/sec
7777 pagefaults # 0.000 M/sec
2236492601 CPU cycles # 13.993 M/sec
1908732654 instructions # 11.942 M/sec
5059857 cache references # 0.032 M/sec
503188 cache misses # 0.003 M/sec
Wall-clock time elapsed: 10008.471596 msecs
You can also do 'perf stat dbench 10' type of measurements to only
measure that particular workload. In particular the context switch
rate, the cache-miss rate and the ratio between task-clock-ticks and
wall-clock-time (efficiency parallelization) can be pretty telling
about how 'healthy' a benchmark is - and how various tunables (such
as new-fair-sleepers) affect it.
Say 'hackbench 20' gives this output on my a testbox:
aldebaran:~> perf stat ./hackbench 20
Time: 0.882
Performance counter stats for './hackbench':
12117.839049 task clock ticks (msecs)
63444 context switches # 0.005 M/sec
6972 CPU migrations # 0.001 M/sec
35356 pagefaults # 0.003 M/sec
34561571429 CPU cycles # 2852.123 M/sec
26980655850 instructions # 2226.524 M/sec
115693364 cache references # 9.547 M/sec
57710692 cache misses # 4.762 M/sec
Wall-clock time elapsed: 996.284274 msecs
This is a 2.8 GHz CPU, and the cycles/sec value of 2.852 shows that
the workload is running at max CPU speed. 2.2 billion instructions
per second is OK-ish. Cache-miss rate is a bit high - but that's not
unexpected: hackbench 20 runs 400 tasks in parallel.
perf stat results become even more interesting when they are
compared. You might want to give it a try.
Thanks,
Ingo
--