Skip to content

CFS Bandwidth Control v7.2

Paul Turner lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest18 patches 41 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/18sched: (fixlet) dont update shares twice on on_rq parentkernel/sched_fair.c+3 -01 reply
2/18sched: hierarchical task accounting for SCHED_OTHERkernel/sched.c kernel/sched_fair.c kernel/sched_rt.c +1 more+16 -71 reply
3/18sched: introduce primitives to account for CFS bandwidth trackinginit/Kconfig kernel/sched.c kernel/sched_fair.c+220 -42 replies
4/18sched: validate CFS quota hierarchieskernel/sched.c+98 -141 reply
5/18sched: accumulate per-cfs_rq cpu usage and charge against bandwidthinclude/linux/sched.h kernel/sched.c kernel/sched_fair.c +1 more+94 -31 reply
6/18sched: add a timer to handle CFS bandwidth refreshkernel/sched.c kernel/sched_fair.c+123 -241 reply
7/18sched: expire invalid runtimekernel/sched.c kernel/sched_fair.c+84 -101 reply
8/18sched: add support for throttling group entitieskernel/sched.c kernel/sched_fair.c+92 -44 replies
9/18sched: add support for unthrottling group entitieskernel/sched.c kernel/sched_fair.c+126 -41 reply
10/18sched: allow for positional tg_tree walkskernel/sched.c+39 -131 reply
11/18sched: prevent interactions with throttled entitieskernel/sched.c kernel/sched_fair.c+94 -76 replies
12/18sched: prevent buddy interactions with throttled entitieskernel/sched_fair.c+17 -11 reply
13/18sched: migrate throttled tasks on HOTPLUGkernel/sched.c+27 -01 reply
14/18sched: throttle entities exceeding their allowed bandwidthkernel/sched_fair.c+50 -21 reply
15/18sched: add exports tracking cfs bandwidth control statisticskernel/sched.c kernel/sched_fair.c+28 -01 reply
16/18sched: return unused runtime on group dequeuekernel/sched.c kernel/sched_fair.c+122 -11 reply
17/18sched: use jump labels to reduce overhead when bandwidth control is inactivekernel/sched.c kernel/sched_fair.c+43 -50 replies
18/18sched: add documentation for bandwidth controlDocumentation/scheduler/sched-bwc.txt+122 -01 reply

Reviews trailers per patch

10 of 18 patches have a Reviewed-by or Acked-by.

PatchHidetoshi Seto
1/18
2/18R-b R-b
3/18R-b R-b
4/18
5/18R-b R-b
6/18R-b R-b
7/18R-b R-b
8/18
9/18R-b R-b
10/18R-b R-b
11/18R-b R-b
12/18
13/18R-b R-b
14/18
15/18R-b R-b
16/18
17/18
18/18

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [patch 00/18] CFS Bandwidth Control v7.2

Hi all,

Please find attached the incremental v7.2 for bandwidth control.

This release follows a fairly intensive period of scraping cycles across various configurations. Unfortunately we seem to be currently taking an IPC hit for jump_labels (despite a savings in branches/instr. ret) which despite fairly extensive digging I don't have a good explanation for. The emitted assembly /looks/ ok, but cycles/wall time is consistently higher across several platforms.

As such I've demoted the jumppatch to [RFT] while these details are worked out. But there's no point in holding up the rest of the series any more.

[ Please find the specific discussion related to the above attached to patch 17/18. ]

So -- without jump labels -- the current performance looks like:

instructions cycles branches
---------------------------------------------------------------------------------------------

clovertown [!BWC]           843695716               965744453               151224759        
+unconstrained              845934117 (+0.27)       974222228 (+0.88)       152715407 (+0.99)
+10000000000/1000:          855102086 (+1.35)       978728348 (+1.34)       154495984 (+2.16)
+10000000000/1000000:       853981660 (+1.22)       976344561 (+1.10)       154287243 (+2.03)
barcelona [!BWC]            810514902               761071312               145351489        
+unconstrained              820573353 (+1.24)       748178486 (-1.69)       148161233 (+1.93)
+10000000000/1000:          827963132 (+2.15)       757829815 (-0.43)       149611950 (+2.93)
+10000000000/1000000:       827701516 (+2.12)       753575001 (-0.98)       149568284 (+2.90)
westmere [!BWC]             792513879               702882443               143267136        
+unconstrained              802533191 (+1.26)       694415157 (-1.20)       146071233 (+1.96)
+10000000000/1000:          809861594 (+2.19)       701781996 (-0.16)       147520953 (+2.97)
+10000000000/1000000:       809752541 (+2.18)       705278419 (+0.34)       147502154 (+2.96)

Under the workload:
mkdir -p /cgroup/cpu/test
echo $$ > /dev/cgroup/cpu/test (only cpu,cpuacct mounted)
(W1) taskset -c 0 perf stat --repeat 50 -e instructions,cycles,branches bash -c "for ((i=0;i<5;i++)); do $(dirname $0)/pipe-test 20000; done"

This may seem a strange work-load but it works around some bizarro overheads
currently introduced by perf. Comparing for example with::w
(W2)taskset -c 0 perf stat --repeat 50 -e instructions,cycles,branches bash -c "$(dirname $0)/pipe-test 100000;true" (W3)taskset -c 0 perf stat --repeat 50 -e instructions,cycles,branches bash -c "$(dirname $0)/pipe-test 100000;"

We see:

 (W1)  westmere [!BWC]             792513879               702882443               143267136             0.197246943  
 (W2)  westmere [!BWC]             912241728               772576786               165734252             0.214923134  
 (W3)  westmere [!BWC]             904349725               882084726               162577399             0.748506065  

vs an 'ideal' total exec time of (approximately):

$ time taskset -c 0 ./pipe-test 100000
 real    0m0.198 user    0m0.007s ys     0m0.095s

The overhead in W2 is explained by that invoking pipe-test directly, one of the siblings is becoming the perf_ctx parent, invoking lots of pain every time we switch. I do not have a reasonable explantion as to why (W1) is so much cheaper than (W2), I stumbled across it by accident when I was trying some combinations to reduce the <perf stat>-to-<perf stat> variance.

v7.2
-----------
- Build errors in !CGROUP_SCHED case fixed
- !CONFIG_SMP now 'supported' (#ifdef munging)
- gcc was failing to inline account_cfs_rq_runtime, affecting performance
- checks in expire_cfs_rq_runtime() and check_enqueue_throttle() re-organized to save branches.
- jump labels introduced in the case BWC is not being used system-wide to reduce inert overhead.
- branch saved in expiring runtime (reorganize conditonals)

Hidetoshi, the following patchsets have changed enough to necessitate tweaking of your Reviewed-by:
[patch 09/18] sched: add support for unthrottling group entities (extensive) [patch 11/18] sched: prevent interactions with throttled entities (update_cfs_shares) [patch 12/18] sched: prevent buddy interactions with throttled entities (new)

Previous postings:
-----------------
v7.1: https://lkml.org/lkml/2011/7/7/24
v7: http://lkml.org/lkml/2011/6/21/43
v6: http://lkml.org/lkml/2011/5/7/37
v5: http://lkml.org/lkml/2011/3 /22/477
v4: http://lkml.org/lkml/2011/2/23/44
v3: http://lkml.org/lkml/2010/10/12/44
v2: http://lkml.org/lkml/2010/4/28/88
Original posting: http://lkml.org/lkml/2010/2/12/393

Prior approaches: http://lkml.org/lkml/2010/1/5/44 ["CFS Hard limits v5"]

Thanks,

- Paul