sched: Reduce contention in update_cfs_rq_blocked_load
PATCH v2 1/1 sched: Reduce contention in update_cfs_rq_blocked_load
Based on perf profiles, the update_cfs_rq_blocked_load function constantly shows up as taking up a noticeable % of system run time. This is especially apparent on larger numa systems.
Much of the contention is in __update_cfs_rq_tg_load_contrib when we're updating the tg load contribution stats. However, it was noticed that the values often don't get modified by much. In fact, much of the time, they don't get modified at all. However, the update can always get attempted due to force_update.
In this patch, we remove the force_update in only the __update_cfs_rq_tg_load_contrib. Thus the tg load contrib stats now get modified only if the delta is large enough (in the current code, they get updated when the delta is larger than 12.5%). This is a way to rate-limit the updates while largely keeping the values accurate.
When testing this change with AIM7 workloads, we found that it was able to reduce the overhead of the function by up to a factor of 20x.
--- kernel/sched/fair.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)
kernel/sched/fair.c +4 -6
@@ -2352,8 +2352,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se) }#ifdef CONFIG_FAIR_GROUP_SCHED -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {struct task_group *tg = cfs_rq->tg;long tg_contrib;
@@ -2361,7 +2360,7 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; -if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) { +if (abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {atomic_long_add (tg_contrib, &tg->load_avg); cfs_rq->tg_load_contrib += tg_contrib; }
@@ -2436,8 +2435,7 @@ static inline void update_rq_runnable_avg(struct rq *rq, int runnable) __update_tg_runnable_avg(&rq->avg, &rq->cfs); }#else /* CONFIG_FAIR_GROUP_SCHED */ -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) {} +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {}static inline void __update_tg_runnable_avg (struct sched_avg *sa,struct cfs_rq *cfs_rq) {}static inline void __update_group_entity_contrib (struct sched_entity *se) {}
@@ -2537,7 +2535,7 @@ static void update_cfs_rq_blocked_load(struct cfs_rq *cfs_rq, int force_update) cfs_rq->last_decay = now; } -__update_cfs_rq_tg_load_contrib (cfs_rq, force_update); +__update_cfs_rq_tg_load_contrib (cfs_rq); }/* Add the load generated by se into cfs_rq's child load-average */
Signature · 1 line
1.7.1
Quoted 10 lines · Jason Low
Based on perf profiles, the
update_cfs_rq_blocked_loadfunction constantly shows up as taking up a noticeable % of system run time. This is especially apparent on larger numa systems.Much of the contention is in
__update_cfs_rq_tg_load_contribwhen we're updating the tg load contribution stats. However, it was noticed that the values often don't get modified by much. In fact, much of the time, they don't get modified at all. However, the update can always get attempted due toforce_update.
Quoted 8 lines
In this patch, we remove the
force_updatein only the__update_cfs_rq_tg_load_contrib. Thus the tg load contrib stats now get modified only if the delta is large enough (in the current code, they get updated when the delta is larger than 12.5%). This is a way to rate-limit the updates while largely keeping the values accurate.When testing this change with AIM7 workloads, we found that it was able to reduce the overhead of the function by up to a factor of 20x.
Looks reasonable.
Quoted 29 lines
Cc Yuyang Du <[email protected]>Cc Waiman Long <[email protected]>Cc Mel Gorman <[email protected]>Cc Mike Galbraith <[email protected]>Cc Rik van Riel <[email protected]>Cc Aswin Chandramouleeswaran <[email protected]>Cc Chegu Vinod <[email protected]>Cc Scott J Norton <[email protected]>Signed-off-by Jason Low <[email protected]>--- kernel/sched/fair.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)kernel/sched/fair.c +1
-2@@ -2352,8 +2352,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se) }#ifdef CONFIG_FAIR_GROUP_SCHED -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {struct task_group *tg = cfs_rq->tg;long tg_contrib;
kernel/sched/fair.c static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, · line 2364
Quoted 4 lines
kernel/sched/fair.c +0
-1@@ -2361,7 +2360,7 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; -if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {
Another option with slightly higher accuracy would be to increase the sensitivity here when force_update == 1.
E.g.:
abs(tg_contrib) > cfs_rq->tg_load_contrib / (8 * (1 + force_update))) { ...Alternatively we could bound total inaccuracy:
int divisor = force_update ? NR_CPUS : 8;
if (abs(tg_contrib) > cfs_rq->tg_load_contrib / divisor) { ...
[ And probably rename force_update to want_update ]
Quoted 33 lines
kernel/sched/fair.c +3
-4+if (abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {atomic_long_add (tg_contrib, &tg->load_avg); cfs_rq->tg_load_contrib += tg_contrib; }@@ -2436,8 +2435,7 @@ static inline void update_rq_runnable_avg(struct rq *rq, int runnable) __update_tg_runnable_avg(&rq->avg, &rq->cfs); }#else /* CONFIG_FAIR_GROUP_SCHED */ -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) {} +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {}static inline void __update_tg_runnable_avg (struct sched_avg *sa,struct cfs_rq *cfs_rq) {}static inline void __update_group_entity_contrib (struct sched_entity *se) {}@@ -2537,7 +2535,7 @@ static void update_cfs_rq_blocked_load(struct cfs_rq *cfs_rq, int force_update) cfs_rq->last_decay = now; } -__update_cfs_rq_tg_load_contrib (cfs_rq, force_update); +__update_cfs_rq_tg_load_contrib (cfs_rq); }/* Add the load generated by se into cfs_rq's child load-average */ --1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 60 lines · Paul Turner
Quoted 10 lines · Jason Low
Based on perf profiles, the
update_cfs_rq_blocked_loadfunction constantly shows up as taking up a noticeable % of system run time. This is especially apparent on larger numa systems.Much of the contention is in
__update_cfs_rq_tg_load_contribwhen we're updating the tg load contribution stats. However, it was noticed that the values often don't get modified by much. In fact, much of the time, they don't get modified at all. However, the update can always get attempted due toforce_update.Quoted 8 lines
In this patch, we remove the
force_updatein only the__update_cfs_rq_tg_load_contrib. Thus the tg load contrib stats now get modified only if the delta is large enough (in the current code, they get updated when the delta is larger than 12.5%). This is a way to rate-limit the updates while largely keeping the values accurate.When testing this change with AIM7 workloads, we found that it was able to reduce the overhead of the function by up to a factor of 20x.
Looks reasonable.
Quoted 29 lines
Cc Yuyang Du <[email protected]>Cc Waiman Long <[email protected]>Cc Mel Gorman <[email protected]>Cc Mike Galbraith <[email protected]>Cc Rik van Riel <[email protected]>Cc Aswin Chandramouleeswaran <[email protected]>Cc Chegu Vinod <[email protected]>Cc Scott J Norton <[email protected]>Signed-off-by Jason Low <[email protected]>--- kernel/sched/fair.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)kernel/sched/fair.c +1
-2@@ -2352,8 +2352,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se) }#ifdef CONFIG_FAIR_GROUP_SCHED -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {struct task_group *tg = cfs_rq->tg;long tg_contrib;kernel/sched/fair.c static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, · line 2364
Quoted 4 lines
kernel/sched/fair.c +0
-1@@ -2361,7 +2360,7 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; -if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {Another option with slightly higher accuracy would be to increase the sensitivity here when
force_update== 1.E.g.:
Quoted 8 lines
abs(tg_contrib) > cfs_rq->tg_load_contrib / (8 * (1 + force_update))) { ...Alternatively we could bound total inaccuracy:
int divisor = force_update ? NR_CPUS : 8; if (abs(tg_contrib) > cfs_rq->tg_load_contrib / divisor) { ...[ And probably rename
force_updatetowant_update]
Out of the 2 additional options, I think the first one is better. The other option of using NR_CPUS looks like we're increasing the update rate as the system gets larger, and its the larger systems that are typically more affected by the contention.
Do you prefer either of the 2 other options over this v2 patch? If so, I can test and send out a new patch, otherwise, I'll keep this current v2 patch.
Thanks.
Quoted 68 lines · Jason Low
Quoted 67 lines · Paul Turner
Quoted 10 lines · Jason Low
Based on perf profiles, the
update_cfs_rq_blocked_loadfunction constantly shows up as taking up a noticeable % of system run time. This is especially apparent on larger numa systems.Much of the contention is in
__update_cfs_rq_tg_load_contribwhen we're updating the tg load contribution stats. However, it was noticed that the values often don't get modified by much. In fact, much of the time, they don't get modified at all. However, the update can always get attempted due toforce_update.Quoted 8 lines
In this patch, we remove the
force_updatein only the__update_cfs_rq_tg_load_contrib. Thus the tg load contrib stats now get modified only if the delta is large enough (in the current code, they get updated when the delta is larger than 12.5%). This is a way to rate-limit the updates while largely keeping the values accurate.When testing this change with AIM7 workloads, we found that it was able to reduce the overhead of the function by up to a factor of 20x.
Looks reasonable.
Quoted 29 lines
Cc Yuyang Du <[email protected]>Cc Waiman Long <[email protected]>Cc Mel Gorman <[email protected]>Cc Mike Galbraith <[email protected]>Cc Rik van Riel <[email protected]>Cc Aswin Chandramouleeswaran <[email protected]>Cc Chegu Vinod <[email protected]>Cc Scott J Norton <[email protected]>Signed-off-by Jason Low <[email protected]>--- kernel/sched/fair.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)kernel/sched/fair.c +1
-2@@ -2352,8 +2352,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se) }#ifdef CONFIG_FAIR_GROUP_SCHED -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {struct task_group *tg = cfs_rq->tg;long tg_contrib;kernel/sched/fair.c static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, · line 2364
Quoted 4 lines
kernel/sched/fair.c +0
-1@@ -2361,7 +2360,7 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; -if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {Another option with slightly higher accuracy would be to increase the sensitivity here when
force_update== 1.E.g.:
abs(tg_contrib) > cfs_rq->tg_load_contrib / (8 * (1 + force_update))) { ...Alternatively we could bound total inaccuracy:
int divisor = force_update ? NR_CPUS : 8; if (abs(tg_contrib) > cfs_rq->tg_load_contrib / divisor) { ...
Quoted 6 lines
Quoted 1 line
[ And probably rename
force_updatetowant_update]Out of the 2 additional options, I think the first one is better. The other option of using
NR_CPUSlooks like we're increasing the update rate as the system gets larger, and its the larger systems that are typically more affected by the contention.
Probably num_present_cpus() will be better than NR_CPUS, which can be much larger than the actual cpus present.
Quoted 4 lines
Do you prefer either of the 2 other options over this v2 patch? If so, I can test and send out a new patch, otherwise, I'll keep this current v2 patch.
If there are multiple non-forced updates, option 1's error seems to accumulate and non-bounded as we do not actually update? Is this a concern?
Thanks.
Tim
Quoted 71 lines · Tim Chen
Quoted 70 lines · Jason Low
Quoted 68 lines · Paul Turner
Quoted 10 lines · Jason Low
Based on perf profiles, the
update_cfs_rq_blocked_loadfunction constantly shows up as taking up a noticeable % of system run time. This is especially apparent on larger numa systems.Much of the contention is in
__update_cfs_rq_tg_load_contribwhen we're updating the tg load contribution stats. However, it was noticed that the values often don't get modified by much. In fact, much of the time, they don't get modified at all. However, the update can always get attempted due toforce_update.Quoted 8 lines
In this patch, we remove the
force_updatein only the__update_cfs_rq_tg_load_contrib. Thus the tg load contrib stats now get modified only if the delta is large enough (in the current code, they get updated when the delta is larger than 12.5%). This is a way to rate-limit the updates while largely keeping the values accurate.When testing this change with AIM7 workloads, we found that it was able to reduce the overhead of the function by up to a factor of 20x.
Looks reasonable.
Quoted 29 lines
Cc Yuyang Du <[email protected]>Cc Waiman Long <[email protected]>Cc Mel Gorman <[email protected]>Cc Mike Galbraith <[email protected]>Cc Rik van Riel <[email protected]>Cc Aswin Chandramouleeswaran <[email protected]>Cc Chegu Vinod <[email protected]>Cc Scott J Norton <[email protected]>Signed-off-by Jason Low <[email protected]>--- kernel/sched/fair.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-)kernel/sched/fair.c +1
-2@@ -2352,8 +2352,7 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se) }#ifdef CONFIG_FAIR_GROUP_SCHED -static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq, -int force_update) +static inline void __update_cfs_rq_tg_load_contrib (struct cfs_rq *cfs_rq) {struct task_group *tg = cfs_rq->tg;long tg_contrib;kernel/sched/fair.c static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, · line 2364
Quoted 4 lines
kernel/sched/fair.c +0
-1@@ -2361,7 +2360,7 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; -if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {Another option with slightly higher accuracy would be to increase the sensitivity here when
force_update== 1.E.g.:
abs(tg_contrib) > cfs_rq->tg_load_contrib / (8 * (1 + force_update))) { ...Alternatively we could bound total inaccuracy:
int divisor = force_update ? NR_CPUS : 8; if (abs(tg_contrib) > cfs_rq->tg_load_contrib / divisor) { ...[ And probably rename
force_updatetowant_update]
Quoted 7 lines
Quoted 4 lines
Out of the 2 additional options, I think the first one is better. The other option of using
NR_CPUSlooks like we're increasing the update rate as the system gets larger, and its the larger systems that are typically more affected by the contention.Probably
num_present_cpus()will be better thanNR_CPUS, which can be much larger than the actual cpus present.
Yeah, num_present_cpus(), though the same issue would still be there.
Quoted 8 lines
Quoted 4 lines
Do you prefer either of the 2 other options over this v2 patch? If so, I can test and send out a new patch, otherwise, I'll keep this current v2 patch.
If there are multiple non-forced updates, option 1's error seems to accumulate and non-bounded as we do not actually update? Is this a concern?
It should be fine. Once the delta is large enough, we will end up doing the update anyway.
Thanks.
Peter Zijlstra
maintainerQuoted 8 lines · Jason Low
Quoted 3 lines · Tim Chen
If there are multiple non-forced updates, option 1's error seems to accumulate and non-bounded as we do not actually update? Is this a concern?
It should be fine. Once the delta is large enough, we will end up doing the update anyway.
Well, the thing is you can have nr_cpus * 12.5% of outstanding delta; that might be a lot, esp on the large machines.
Now there's two problems with all this; the first is the relative threshold, typically such per-cpu things have a fixed update threshold, this makes it much easier to qualify the actual error.
Secondly the indeed the nr_cpus in the error bound. Some things; like the proportion code scale the threshold by log2(nr_cpus) in an attempt to do something sensible there.
But yes, unbounded errors here are a problem, sure relaxing the updates makes things go fast, they also make things go skew.
Quoted 2 lines · Peter Zijlstra
But yes, unbounded errors here are a problem, sure relaxing the updates makes things go fast, they also make things go skew.
Okay. In that case, would you like to take our original patch which avoids unnecessary updates?
-----
Subject: [PATCH] sched: Reduce contention in update_cfs_rq_blocked_load
When running workloads on 2+ socket systems, based on perf profiles, the update_cfs_rq_blocked_load function often shows up as taking up a noticeable % of run time.
Much of the contention is in __update_cfs_rq_tg_load_contrib when we update the tg load contribution stats. However, it turns out that in many cases, they don't need to be updated and "tg_contrib" is 0.
This patch adds a check in __update_cfs_rq_tg_load_contrib to skip updating tg load contribution stats when nothing needs to be updated. This reduces the cacheline contention that would be unnecessary.
--- kernel/sched/fair.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
kernel/sched/fair.c +3 -0
@@ -2382,6 +2382,9 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; +if (!tg_contrib) +return ; +if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {atomic_long_add (tg_contrib, &tg->load_avg); cfs_rq->tg_load_contrib += tg_contrib;
Signature · 1 line
1.7.1
Peter Zijlstra
maintainerQuoted 6 lines · Jason Low
Quoted 2 lines · Peter Zijlstra
But yes, unbounded errors here are a problem, sure relaxing the updates makes things go fast, they also make things go skew.
Okay. In that case, would you like to take our original patch which avoids unnecessary updates?
This seems a safe patch; yes I'll queue it while we think of smarter things :-)
tip-bot for Jason Low
merge bot[tip:sched/core] sched: Reduce contention in update_cfs_rq_blocked_load()
In reply to Jason Lowsched: Reduce contention in update_cfs_rq_blocked_load()
Commit-ID: 8236d907ab3411ad452280faa8b26c1347327380 Gitweb: http://git.kernel.org/tip/8236d907ab3411ad452280faa8b26c1347327380 Author: Jason Low <[email protected]> AuthorDate: Tue, 2 Sep 2014 00:41:24 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 9 Sep 2014 06:47:29 +0200
sched: Reduce contention in update_cfs_rq_blocked_load()
When running workloads on 2+ socket systems, based on perf profiles, the update_cfs_rq_blocked_load() function often shows up as taking up a noticeable % of run time.
Much of the contention is in __update_cfs_rq_tg_load_contrib() when we update the tg load contribution stats. However, it turns out that in many cases, they don't need to be updated and "tg_contrib" is 0.
This patch adds a check in __update_cfs_rq_tg_load_contrib() to skip updating tg load contribution stats when nothing needs to be updated. This reduces the cacheline contention that would be unnecessary.
--- kernel/sched/fair.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/sched/fair.c +3 -0
@@ -2382,6 +2382,9 @@ static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq, tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg; tg_contrib -= cfs_rq->tg_load_contrib; +if (!tg_contrib) +return ; +if (force_update ||abs (tg_contrib) > cfs_rq->tg_load_contrib /8 ) {atomic_long_add (tg_contrib, &tg->load_avg); cfs_rq->tg_load_contrib += tg_contrib;
PATCH 1/1 sched: Rewrite per entity runnable load average tracking v5
In reply to Paul TurnerHi all,
We finished a round of tests for AIM7 workload for the patch v5 by LKP, the result is as follows:
Hostname: brickland3
Model: Brickland Ivy Bridge-E
CPU: 120
Memory: 512G
v3.16-rc7 rewrite-v5 testbox/testcase/testparams
--------------- ------------------------- ---------------------------
%stddev %change %stddev
\ | /
26317 ± 3% +34.7% 35437 ± 1% brickland3/aim7/2000-fork_test
43481 ± 0% +0.5% 43712 ± 0% brickland3/aim7/3000-brk_test
80810 ± 0% -0.2% 80625 ± 1% brickland3/aim7/3000-sieve
489830 ± 1% +14.7% 561691 ± 1% brickland3/aim7/8000-disk_src
1672643 ±12% -13.0% 1455960 ± 6% brickland3/aim7/8000-disk_wrt
1193986 ± 0% -1.5% 1175841 ± 0% brickland3/aim7/8000-mem_rtns_1
875113 ±13% +21.9% 1067191 ±13% brickland3/aim7/8000-misc_rtns_1
1188420 ± 1% -3.2% 1150624 ± 0% brickland3/aim7/8000-sort_rtns_1
807986 ± 0% -0.7% 802275 ± 0% brickland3/aim7/8000-string_rtns
6378589 ± 5% -0.1% 6373359 ± 4% TOTAL aim7.jobs-per-min--------------- -------------------------
339 ± 7% -22.9% 262 ± 0% brickland3/aim7/2000-fork_test
463 ± 0% +0.4% 465 ± 0% brickland3/aim7/3000-brk_test
337 ± 9% -3.1% 327 ± 6% brickland3/aim7/3000-disk_rd
534 ± 0% +0.9% 539 ± 0% brickland3/aim7/3000-sieve
391 ± 0% -10.7% 349 ± 1% brickland3/aim7/8000-disk_src
301 ± 4% +10.0% 331 ± 5% brickland3/aim7/8000-disk_wrt
405 ± 1% +6.0% 429 ± 0% brickland3/aim7/8000-mem_rtns_1
227 ±25% -0.8% 225 ±12% brickland3/aim7/8000-misc_rtns_1
395 ± 1% +5.1% 415 ± 0% brickland3/aim7/8000-sort_rtns_1
419 ± 0% +4.6% 438 ± 0% brickland3/aim7/8000-string_rtns
3815 ± 3% -0.8% 3784 ± 2% TOTAL turbostat.Pkg_W--------------- -------------------------
90.79 ± 1% -15.1% 77.04 ± 0% brickland3/aim7/2000-fork_test
62.42 ± 0% -0.0% 62.41 ± 0% brickland3/aim7/3000-brk_test
61.69 ± 2% -1.3% 60.92 ± 2% brickland3/aim7/3000-disk_rd
137.13 ± 0% +0.2% 137.39 ± 0% brickland3/aim7/3000-sieve
66.03 ± 1% +0.6% 66.41 ± 0% brickland3/aim7/8000-disk_src
53.94 ± 2% +6.1% 57.21 ± 0% brickland3/aim7/8000-disk_wrt
54.43 ± 0% +4.8% 57.02 ± 0% brickland3/aim7/8000-mem_rtns_1
58.71 ± 2% +0.0% 58.72 ± 1% brickland3/aim7/8000-misc_rtns_1
53.78 ± 1% +4.8% 56.36 ± 0% brickland3/aim7/8000-sort_rtns_1
56.47 ± 2% +2.5% 57.89 ± 0% brickland3/aim7/8000-string_rtns
695.38 ± 1% -0.6% 691.37 ± 1% TOTAL turbostat.RAM_W--------------- -------------------------
23.40 ±22% -16.2% 19.60 ± 1% brickland3/aim7/2000-fork_test
97.28 ± 0% -0.0% 97.25 ± 0% brickland3/aim7/3000-brk_test
35.09 ±24% -8.7% 32.05 ±21% brickland3/aim7/3000-disk_rd
94.92 ± 0% -0.0% 94.88 ± 0% brickland3/aim7/3000-sieve
41.04 ± 2% -26.8% 30.06 ± 3% brickland3/aim7/8000-disk_src
36.54 ±11% -10.2% 32.82 ±12% brickland3/aim7/8000-disk_wrt
61.39 ± 2% -7.4% 56.87 ± 1% brickland3/aim7/8000-mem_rtns_1
62.57 ± 4% -11.1% 55.64 ± 3% brickland3/aim7/8000-sort_rtns_1
76.06 ± 2% -3.4% 73.51 ± 0% brickland3/aim7/8000-string_rtns
528.30 ± 4% -6.7% 492.67 ± 3% TOTAL turbostat.%c0For performance, I think the overall is flat. For power, we can see some benefits. In perticular, the stddev indicates the variation is smaller than v3.16-rc7 (all subtests are done at least for 5 times).
To Jason, the format or specific metric is not directly comparable with your tests. If you can specify how to get the same look as your tests, we are happy to try.
Thanks,
Yuyang