kernel-packages team mailing list archive
-
kernel-packages team
-
Mailing list archive
-
Message #125570
[Bug 1470404] Re: Some workloads experience more measurement variation with scaling_governor=performance than ondemand
** Changed in: linux (Ubuntu Utopic)
Status: In Progress => Fix Committed
** Changed in: linux (Ubuntu Vivid)
Status: In Progress => Fix Committed
--
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1470404
Title:
Some workloads experience more measurement variation with
scaling_governor=performance than ondemand
Status in linux package in Ubuntu:
Confirmed
Status in linux source package in Utopic:
Fix Committed
Status in linux source package in Vivid:
Fix Committed
Bug description:
SRU Justification:
[Impact]
Certain workloads can exhibit a large variance in behavior due to how how cpus are idled on power8 systems.
[Fix]
For 3.16:
74aa51b5ccd3975392e30d11820dc073c5f2cd32
92c83ff5b42b109c94fdeee53cb31f674f776d75
70734a786acfd1998e47d40df19cba5c29469bdf
For 3.16, 3.19:
78eaa10f027cf69f9bd409e64eaff902172b2327
$ git describe 78eaa10f027cf69f9bd409e64eaff902172b2327
v4.1-rc2-9-g78eaa10
Once we rebase to something v4.1+ we'll have this fixed in Wily.
[Test Case]
Set the system with the SMT8 mode and scaling_governor=performance or ondemand.
Run the workload 100 times.
--
== Comment: #0 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-15 21:30:31 ==
---Problem Description---
Many workloads experience wide measurement variation, more with scaling_governor=performance than ondemand.
Contact Information = wpeter@xxxxxxxxxx, farid@xxxxxxxxxx
---uname output---
Linux c656f7n04 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:42:36 UTC 2015 ppc64le ppc64le ppc64le GNU/Linux
Machine Type = 20-core and 24-core Tuleta systems
---Debugger---
A debugger is not configured
---Steps to Reproduce---
Set the system with the SMT8 mode and scaling_governor=performance or ondemand.
Run the workload 100 times.
Get 100 data points and sort them.
Compare the spread of results with two governor modes.
The source and scripts to run a simple test case will be provided.
Stack trace output:
no
Oops output:
no
Userspace tool common name: not sure what it is.
Userspace rpm: ??
The userspace tool has the following bit modes: These are 64-bit
programs.
System Dump Info:
The system is not configured to capture a system dump.
Userspace tool obtained from project website: na
*Additional Instructions for wpeter@xxxxxxxxxx, farid@xxxxxxxxxx:
-Attach sysctl -a output output to the bug.
-Attach ltrace and strace of userspace application.
== Comment: #2 - Paul A. Clarke <pacman@xxxxxxxxxx> - 2015-04-16 08:47:41 ==
This problem has a number of variables we were trying to reduce:
- endianness
- operating system
- kernel level
- compiler
Bob Walkup says he's seen the variability in a bunch of CPU-intensive
test cases, in various languages, using various compilers, which would
seem to eliminate the "compiler" variable.
We had not looked at the performance governor setting to this point.
Interesting results, and yet another variable to add to the above mix.
Perhaps two more runs? (LE-ondemand, LE-performance, BE-ondemand, BE-
performance)
== Comment: #3 - Paul A. Clarke <pacman@xxxxxxxxxx> - 2015-04-16 08:50:09 ==
Also, Bob says he can reproduce this with and without vectorization (the stalls move from the VSU to the FPU), and with and without floating point (the stalls move from the FPU to the FXU). Very odd.
== Comment: #4 - Andrea M. Davis <amdavis@xxxxxxxxxx> - 2015-04-16 10:10:01 ==
Peter, what version of Ubuntu are you running?
== Comment: #5 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-16 10:32:58 ==
Andrea,
Ubuntu 14.04.2 LTS.
#uname -a
Linux c656f7n04 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:42:36 UTC 2015 ppc64le ppc64le ppc64le GNU/Linux
#lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.2 LTS
Release: 14.04
Codename: trusty
== Comment: #6 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-16 10:50:11 ==
There are a few more things we have tried.
(1) For STREAM, it was originally compiled with gfotran and its
corresponding OpenMP. I compiled it with xlf and its corresponding
OpenMP. There is no difference in performance.
(2) There was a concern about NUMA, meaning is it possible the CPU
binding by OpenMP is incorrect so that there are remote memory
accesses behind the scene? By disabling one DCM and using 10 or 12
cores only in the other DCM, we can still see occasional drops in
performance, although not often. We can conclude it is not due to
NUMA.
(3) Farid and I also tried out different scheduler parameters
(sched_min_granularity_ns, sched_wakeup_granularity_ns,
sched_latency_ns, and others) and matched the correponding the other
distro's values, but did not see performance changes.
(4) For the workload AMG2006, the use of scaling_performance=ondemand
also reduces the spread of data significantly.
(5) For all the above investigations, I used a 20-core Tuleta and a
24-core Tuleta, although they are configured identically with Ubuntu
14.04.2. I mean two systems paint a consistent picture.
So far, we looked at compiler, NUMA, scheduler, memory test, CPU test,
ST vs SMT, etc. There is a significant difference in variation between
scaling_governor=performance and scaling_govenor=ondemand with the
same application and system configurations.
Hopefully, the data point us to the right direction, i.e., there could
be some unexpected behaviour with the implementation of
scaling_governor=performance.
== Comment: #7 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-16 14:30:21 ==
Note that Bob Walkup does not see the improvement using scaling_governor=ondemand on a borrowed POK lab system. However, he still suggested me to open a bug based on my findings. I guess he is not totally sure about the system he got.
It would be good to have data independently collected by others to
verify my observations.
Bob's serial_loop.c program can be compiled and run very easily. The
examination of data is straightforward too.
== Comment: #10 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-04-17 16:33:38 ==
I was able to reproduce the problem with the serial_loop test described in comment 1 (my system is Ubunu 15.04), however disabling the nap cpuidle state seemed to resolve the variance:
cpupower idle-set -d 0
Can others reproduce? I am not sure why nap behavior would be any
different w/ the performance governor though.. Note, to re-enable:
cpupower idle-set -E
== Comment: #11 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-04-20 13:09:34 ==
(In reply to comment #10)
> disabling the nap cpuidle
> state seemed to resolve the variance:
>
> cpupower idle-set -d 0
just want to clarify state0 is actually snooze, not nap:
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/name
snooze
# cat /sys/devices/system/cpu/cpu0/cpuidle/state1/name
Nap
== Comment: #12 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-20 16:26:32 ==
Jenifer, thanks for the suggestion.
"cpupower idle-set -d 0" works for Bob's serial_loop.c program.
There are 24 identical processes running serial_loop in parallel, each
bound to one core. With 100 iterations, there are 2400 elapsed times
collected for each run. Each elapsed time over 5 seconds is counted as
an outlier.
The following data were collected on a 24-core Tuleta system.
Scaling_govenor = P(erformance) or O(ndemand)
snooze (state0) = default (enabled) and disabled
P and default = 34-35 outliers
P and snooze disabled = 0 outliers
O and default = 2-4 outliers
O and snooze disabled = 0 outliers
As you asked, why do we need to disable snooze in order to reduce
measurement variation when scaling_governor=performance?
== Comment: #13 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-04-20 16:40:46 ==
Vaidy, could your team comment on this? In SMT8 mode, more measurement variation is seen using the performance governor compared to the ondemand governor when snooze is enabled, but disabling snooze seems to resolve the problem. Does it make sense that snooze impacts would be higher in performance mode?
Stewart mentioned some latency improvements in the new 830 OPAL
firmware, is that related to this type of sleep state wakeup?
== Comment: #14 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-21 12:23:01 ==
"cpupower idle-set -d 0" also fixes the measurement variation of STREAM on a 24-core Tuleta system.
scaling_governor=performance and default snooze = 65 outliers out of
400 runs.
scaling_governor=performance and snooze disabled = 0 outlier out of
400 runs.
== Comment: #15 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-21 23:21:22 ==
"cpupower idle-set -d 0" also fixes the measurement variation of AMG2006 on a 24-core Tuleta system.
It means when scaling_governor=performance, disabling snooze (state0,
shallow sleep) while still enabling Nap (state1, deep sleep) can
stabilize measurements.
Vaidy, please help understand this behaviour.
== Comment: #17 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-04-22 14:22:11 ==
Hi Team,
Interesting observation. Let me give possible contributing factors:
(a) When running on ondemand, cpu frequency changed from min to max including turbo frequencies.
(b) When running performance governor, frequency is set to constantly run turbo.
Based on temperature, CPU may not be able to sustain turbo since we
are constantly running at the frequency and burning more power. The
variation could actually come from the fact that we the platform (OCC)
could drop the frequency periodically due to over temperature.
While running ondemand, turning down the power could help sustain the turbo frequency longer.
Disabling snooze will further increase the power consumption and push for more variation at turbo frequency.
Our systems are designed to run consistently at nominal frequency and
hence I would suggest that you run your experiment by setting nominal
frequency to all cores using performance governor+max limit or
userspace governor.
You could use "Throughput-performance profile" using tuned-adm for
this purpose.
If running in "Nominal" Frequency gives you consistent performance,
then the above theory of turbo mode variation holds good. We can
confirm them with additional traces in cpufreq back-end driver code.
We are currently improving our instrumentation to detect frequency
variation and throttling. This is a good scenario to validate our
trace design as well.
Let me know what you find.
--Vaidy
== Comment: #18 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-04-22 14:28:15 ==
(In reply to comment #17)
> Disabling snooze will further increase the power consumption and push for
> more variation at turbo frequency.
We actually see the opposite effect, disabling snooze makes the
variability at turbo freq go away :)
== Comment: #19 - Basu Vaidyanathan <basu@xxxxxxxxxx> - 2015-04-22 14:44:43 ==
Additionally, this is not a problem when running BE kernel, on the same P8 configuration box. I suspect
it is more to do with configuration settings on LE before we start pointing finger at the FW codepath
when using Ubuntu LE.
== Comment: #20 - Paul A. Clarke <pacman@xxxxxxxxxx> - 2015-04-22 15:23:43 ==
Bob is finding another distro LE does _not_ exhibit variation.
This would seem to eliminate LE as the culprit.
Looking at the settings of
/sys/devices/system/cpu/cpu*/cpuidle/state0/disable, they all report
"0", which I believe is the same as having "snooze" enabled, correct?
That would seem to eliminate "snooze" in and of itself as a culprit,
*at least with this kernel level (3.10.0-210.ael7a)*.
I'm starting to suspect it's an issue with the kernel in Ubuntu
(3.16...)
== Comment: #21 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> -
2015-04-22 15:31:41 ==
Running at constant nominal frequency will help you eliminate turbo
mode variation and focus on the Linux issues and root-cause faster.
The behavior I described above is not a bug or problem in firmware.
It is the expected and correct behavior where throttling can happen.
I am only trying to help you to reduce the number of variables that is
affecting this experiment.
--Vaidy
== Comment: #22 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-04-22 15:35:45 ==
(In reply to comment #20)
This is good input. The other distro does not have fast-sleep
support. We will have only snooze and nap. On the Ubuntu system do
you see /sys/devices/system/cpu/cpu*/cpuidle/state2/name ?
Disabling fast-sleep state if present in your Ubuntu setup could help
us to the next step.
--Vaidy
== Comment: #23 - Robert E. Walkup <walkup@xxxxxxxxxx> - 2015-04-22 16:30:28 ==
On the different distro LE system provided by Paul Clarke, the observed behavior is different than what I have seen on Ubuntu LE systems, but one of the tests ... the MPI-enabled simple loop ... shows huge timing variations core-to-core for nearly every job. That system has 24 cores in smt8 mode
ppc64_cpu --frequency
Power Savings Mode: Dynamic, Favor Performance
min: 3.961 GHz (cpu 175)
max: 3.963 GHz (cpu 1)
avg: 3.962 GHz
and nearly every job provides output that looks like this :
out.10:tmin = 3.757, tmax = 6.519 on rank 17, tavg = 5.126
meaning that it takes anywhere from 3.757 to 6.519 seconds to get
through the timed loop :
MPI_Barrier(MPI_COMM_WORLD);
t1 = MPI_Wtime();
sum = 0.0;
for (i=0; i<2000000000; i++) sum += ((double) (i%10));
t2 = MPI_Wtime();
elapsed = t2 - t1;
There are no loads or stores in that loop ... there is a separate
process bound to each core, and they work independently. Additional
instrumentation shows that the slow processes are in the run queue the
whole time.
So far, the other work loads that I have tried on the different distro
LE system showed significantly lower timing variations than what I had
recorder on Ubuntu LE ... but not this one.
== Comment: #24 - Robert E. Walkup <walkup@xxxxxxxxxx> - 2015-04-22 16:54:07 ==
Just adding that on the same different distro LE system, after turning off SMT via the command : ppc64_cpu --smt=1, all instances of the simple loop test have outputs like this :
tmin = 3.756, tmax = 3.757 on rank 5, tavg = 3.757
in other words it takes the same time to complete the work in the loop
on every core ... every time, within the limits of what I have had
the patience to check.
== Comment: #25 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-22 17:03:16 ==
Bob, the use of ST mode reduces variation on Ubuntu 14.04.2 as well.
With SMT8 on another distro LE, I wonder whether "cpupower idle-set -d
0" helps reduce variation for the MPI-enabled simple loop?
Is it correct to say that both Ubuntu LE 14.04.2 (kernel 3.16.0) and
another distro LE (kernel) exhibit variation?
Vaidy, Ubuntu 14.4.2 does not have cpuidle/state2 (fastsleep state).
== Comment: #26 - Robert E. Walkup <walkup@xxxxxxxxxx> - 2015-04-22 17:11:42 ==
I ran the command :
[root@tuleta ~]# cpupower idle-set -d 0
Idlestate 0 disabled on CPU 0
Idlestate 0 disabled on CPU 1
...
on the different distro LE system after setting the state back to
smt8, and the timing variability is still there :
out.2:tmin = 3.757, tmax = 9.010 on rank 4, tavg = 4.619
out.3:tmin = 3.757, tmax = 11.518 on rank 2, tavg = 4.684
out.4:tmin = 3.757, tmax = 9.398 on rank 3, tavg = 4.773
Essentially every job is showing truly huge timing variations.
== Comment: #27 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-22 17:24:46 ==
Does it make any difference with "cpupower idle-set -d 1"? to disable Nap too?
I think we only have snooze and Nap on LE.
== Comment: #28 - Basu Vaidyanathan <basu@xxxxxxxxxx> - 2015-04-22 17:46:14 ==
(In reply to comment #27)
I have a p8 box running ubuntu 14.10 and I do see
cat /sys/devices/system/cpu/cpu0/cpuidle/state2/name
FastSleep
== Comment: #29 - Preeti U. Murthy <preeti.murthy@xxxxxxxxxx> - 2015-04-23 06:01:57 ==
I see that there are hotplug operations being carried out simultaneously with running the benchmark. If so, the performance degradation could be due to the tasks being not allowed to run on the freshly onlined cpus.
I would suggest boot a system with all hardware threads and not do
hotplug operations in order to keep the above issue away while
verifying the performance of the benchmarks, if the intention is to
profile the cpufreq governors.
Regards
Preeti U Murthy
== Comment: #31 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-28 00:27:52 ==
On Ubuntu 14.04.2, there are two states in cpuidle: snooze and Nap.
Are the enabling and disabling of these two states independent?
== Comment: #32 - Robert E. Walkup <walkup@xxxxxxxxxx> - 2015-04-28 16:16:23 ==
Adding an observation on ubuntu le systems, using the simple-loop example above and the userspace governor (chosen so that one can set the frequency to a desired value). When using one thread per core with the system in SMT8 state, the time for the loop varies from ~3.7 sec to over 8 sec. However, if a lot of iterations (10-20) of the same loop are done before starting the timed section of the code (adding a warmup loop), the variations in the timed section are dramatically reduced. There are still some outliers, but a much smaller number of them; and the timing spread is a fraction of one second, instead of several seconds. So there is a clear dependence on history, with the largest timing variations occurring immediately after job startup. I should mention that this remains a problem for many performance benchmarks in the HPC area, which often run in a total time of less than one minute. I would hope that with the userspace governor, or the performance governor, the power and frequency settings would remain constant. Can someone confirm that?
== Comment: #33 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-04-29 17:16:58 ==
Vaidy, would you help answer my question on Comment 31?
== Comment: #34 - George A. Chochia <chochia@xxxxxxxxxx> - 2015-05-13 11:52:53 ==
Vaidy, I am currently seeing a 2.5x performance degradation in the Message Rate benchmark on p8, Ubuntu 14.04.02 LE.
Performance was normal back in February, when we had 14.04.01 and
older FW.
The degradation goes away once snooze state is disabled. There have
been two FW updates: 1/13 and 2/17.
== Comment: #35 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-05-13 14:35:37 ==
(In reply to comment #31)
> On Ubuntu 14.04.2, there are two states in cpuidle: snooze and Nap.
>
> Are the enabling and disabling of these two states independent?
Hi Peter,
Yes the enable/disable for idle states are independent. Atleast 1
idle state is expected to be enabled, if not the CPU may busy loop at
idle and not reduce the thread priority like snooze.
You can disable snooze and have nap enabled or the other way, but
having both disabled will lead to idle threads burning more cycles.
--Vaidy
== Comment: #36 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-05-13 14:58:07 ==
(In reply to comment #34)
Hi George,
The idle state management code is same for both the kernels. You have
only snooze and nap as idle states right?
As I explained over email, when snooze and nap are enabled, the
cpuidle logic should choose nap for idle sibling threads after a short
period in snooze.
Can you guys analyse and confirm that following points:
* Workloads is run on primary thread on each core always
* Remaining 7 sibling threads should be in nap (state1)
* Time spend in 'nap' state for each of the sibling threads can be obtained from sysfs
/sys/devices/system/cpu/cpuN/cpuidle/state1/time (unit is micro secs)
* Workload variation is related to nap residency of sibling threads on that core
If the nap residency (time spent in nap) is not uniform then workload
performance would be proportionally non uniform.
The above statement (if proven) is one possible root-cause, that can
help us move forward and design a fix.
--Vaidy
== Comment: #37 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-05-13 17:45:33 ==
Hi Vaidy,
Let's use Bob's serial_loop.c as an example. There are 24 copies of
his program running on 24 cores in parallel. Only the primary threads
of the cores are used.
Did Shilpa use Bob's program to re-create the problem and find out
that some unused sibling threads do not sleep fast enough and take
away cycles from the primary thread to cause variability?
It is great to know that we can study the sleep time by examining the
/sys/devices/system/cpu/cpuN/cpuidle/state1/time. Did Shilpa use this
method to come up with the above understanding?
Based on George's finding, do you know whether there are thermal code
changes in the old firmware that affects the thermal behavior in the
current version?
Thanks,
Peter
== Comment: #38 - Preeti U. Murthy <preeti.murthy@xxxxxxxxxx> - 2015-05-13 23:24:18 ==
Is this really related to snooze ? Jennifer mentioned in Comment 10 that disabling nap and not snooze also reduced the variance ? Can you please confirm if this is the case ? This will help us narrow down on the issue.
Regards
Preeti U Murthy
== Comment: #39 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-05-14 10:19:09 ==
(In reply to comment #38)
Hi Preeti, sorry I corrected myself in comment 11, I was disabling state0 which is snooze, not nap:
# cpupower idle-set -d 0
# cat /sys/devices/system/cpu/cpu0/cpuidle/state0/name
snooze
Still might be interesting to try some tests w/ nap disabled.
== Comment: #40 - Shilpasri G. Bhat <shigbhat@xxxxxxxxxx> - 2015-05-14 11:15:45 ==
(In reply to comment #37)
Yes . I also used perf-trace events to get the same info.
Regards,
Shilpa
== Comment: #42 - Anton Blanchard <antonb@xxxxxxxxxxx> - 2015-05-19 19:40:45 ==
If I am reading that trace right, we spent over 200ms in snooze on a secondary thread of a badly performing core. That is an enormous amount of time to be chewing up the core.
== Comment: #43 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-05-19 21:45:20 ==
Vaidy,
Could you provide more information on your proposed solution which is
in the kernel, not in OPAL?
Does it mean that you need to upstream different patches to set of
kernels for Ubuntu and other distro?
Peter
== Comment: #44 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-05-20 10:56:48 ==
(In reply to comment #42)
Hi Anton,
That is right, exit from snooze state is the problem. In the proposed
fix Shilpa has added a forced exit from snooze loop after the target
residency so that the cpuidle governor can select nap.
We have to rewrite the snooze loop and exit after the first interrupt
or timer or after after target residency (100us) so that the idle
state promotion can happen.
--Vaidy
== Comment: #45 - Shilpasri G. Bhat <shigbhat@xxxxxxxxxx> - 2015-05-20 11:02:06 ==
Hi,
I am sharing the link for ubuntu kernel packages with the fix:
1) http://kernel.stglabs.ibm.com/~shilpa/ubuntu-14-04.tar
This file contains the following packages:
a)linux-headers-3.16.0-38-generic_3.16.0-38.52~14.04.1_ppc64el.deb
b)linux-image-3.16.0-38-generic_3.16.0-38.52~14.04.1_ppc64el.deb
c)linux-image-extra-3.16.0-38-generic_3.16.0-38.52~14.04.1_ppc64el.deb
d)linux-tools-3.16.0-38-generic_3.16.0-38.52~14.04.1_ppc64el.deb
The fix is based on top of ubuntu-14.-04.02 3.16.0-38-generic + upstream commit (92c83ff5b42b cpuidle: powernv: Read target_residency value of idle states from DT if available)
2) http://kernel.stglabs.ibm.com/~shilpa/ubuntu-15.04.tar
This file contains the following packages:
linux-headers-3.19.0-17-generic_3.19.0-17.17+snooze_ppc64el.deb
linux-image-3.19.0-17-generic_3.19.0-17.17+snooze_ppc64el.deb
linux-image-extra-3.19.0-17-generic_3.19.0-17.17+snooze_ppc64el.deb
linux-tools-3.19.0-17-generic_3.19.0-17.17+snooze_ppc64el.deb
The fix is based on top of ubuntu-15.04 3.19.0-17-generic
== Comment: #46 - VAIDYANATHAN SRINIVASAN <svaidyan@xxxxxxxxxx> - 2015-05-20 11:21:07 ==
(In reply to comment #43)
Hi Peter,
Sure. As per our discussion yesterday, we agreed on the following:
* The issue is not machine specific, the problem was recreated by
Jenifer on S822L also even though other teams believe the issue is
S824L specific.
* The key issue observed is the sibling thread's snooze time variation
which chews cycles from primary thread.
* The fix is to force exit snooze loop after target residency (100us)
and allow the cpuidle governor to enter nap.
* This fix is completely in Linux kernel cpuidle driver code and does
not require change in OPAL.
Yes, once we verify the solution, we will design the correct idle
state auto-promotion logic in cpuidle driver and get it upstream and
then push to the other distro and ubuntu distros that run bare-metal.
--Vaidy
== Comment: #47 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-05-20 12:44:17 ==
I tested Shilpa's kernel packages w/ the fix and can confirm I no longer see the variation issue w/ the serial loop program running on primary threads in SMT8 mode when the performance governor is set. I will get with Peter to test with another benchmark that previously hit the variation issue.
----
System:
8247-42L
20 cores, SMT8
FW830_041
Ubuntu 15.04
Run script:
#!/bin/bash
for iter in `seq 1 100`
do
for cpu in 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152
do
taskset -c ${cpu} ./serial_loop > out.${cpu}.${iter} &
done
echo $iter
wait
done
Results:
-- 3.19.0-17 fix --
Performance
-----------
Loop elapsed: User time:
Min Max Min Max
3.885 3.92 3.877 3.914
3.885 3.892 3.877 3.886
3.885 3.908 3.877 3.901
Ondemand
--------
Loop elapsed: User time:
Min Max Min Max
3.933 3.949 3.901 3.912
-- orig 3.19.0-16 kernel --
Performance
-----------
Loop elapsed: User time:
Min Max Min Max
3.886 4.507 3.88 4.498
3.884 10.404 3.877 10.39
Ondemand
--------
Loop elapsed: User time:
Min Max Min Max
3.932 3.994 3.901 3.959
== Comment: #49 - JENIFER HOPPER <jhopper@xxxxxxxxxx> - 2015-05-21 18:59:33 ==
The fix from comment #45 also resolves large variance issues w/ STREAM and DGEMM workloads. Results listed below.
=========================================
STREAM:
MB/sec
SMT8, 1 thread per core, 100 loop
-------- orig 3.19.0-16 kernel --------
Performance:
____________
Min Max %diff
run1: 304384.6341 308199.3341 1.25%
run2: 150096.0562 308516.5557 69.09%
Performance
+ disable snooze:
_________________
Min Max %diff
run1: 305700.3257 308403.9185 0.88%
run2: 305547.2215 308771.2772 1.05%
Ondemand:
_________
Min Max %diff
run1: 298386.1295 302209.7456 1.27%
----------- 3.19.0-17 fix -----------
Performance:
____________
Min Max %diff
run1: 303486.8368 308433.0545 1.62%
run2: 304768.6159 308410.2177 1.19%
run3: 304723.2556 308847.065 1.34%
Ondemand:
_________
Min Max %diff
run1: 297364.385 302473.0888 1.70%
=========================================
=========================================
DGEMM:
GFlops
SMT8, 1 thread per core, 20 loop
-------- orig 3.19.0-16 kernel --------
Performance:
____________
Min Max %diff
run1: 479.53 520.2 8.14%
Performance
+ disable snooze:
_________________
Min Max %diff
run1: 511.18 520.49 1.80%
Ondemand:
_________
Min Max %diff
run1: 505.64 509.88 0.84%
----------- 3.19.0-17 fix -----------
Performance:
____________
Min Max %diff
run1: 512.77 520.84 1.56%
run2: 517.19 520.34 0.61%
run3: 517.93 520.35 0.47%
Ondemand:
_________
Min Max %diff
run1: 505.72 508.53 0.55%
== Comment: #51 - Peter W. Wong <wpeter@xxxxxxxxxx> - 2015-06-14 22:53:05 ==
Vaidy, is this fix being reviewed by the Linux kernel community? Can you give some estimates as to when this kernel fix will get into mainline and also when it will get into Ubuntu distro?
== Comment: #52 - Shilpasri G. Bhat <shigbhat@xxxxxxxxxx> - 2015-06-24 07:18:28 ==
The patch can be found in the upstream kernel 4.2
78eaa10f027c cpuidle: powernv/pseries: Auto-promotion of snooze to deeper idle state
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1470404/+subscriptions