sched: Make schedstats a runtime tunable that is disabled by default
Subsystems (3)
PATCH 1/1 sched: Make schedstats a runtime tunable that is disabled by default
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
The benefits are workload-dependent but when it gets down to it, the difference will be whether cache misses are incurred updating the shared stats or not. These measurements were taken from a 48-core 2-socket machine with Xeon(R) E5-2670 v3 cpus.
netperf TCP_STREAM
4.4.0 4.4.0
vanilla nostats
Hmean 64 566.50 ( 0.00%) 571.86 ( 0.95%)
Hmean 128 699.15 ( 0.00%) 712.82 ( 1.95%)
Hmean 256 920.33 ( 0.00%) 934.86 ( 1.58%)
Hmean 1024 1097.89 ( 0.00%) 1207.15 ( 9.95%)
Hmean 2048 2356.64 ( 0.00%) 2720.96 ( 15.46%)
Hmean 3312 4363.97 ( 0.00%) 4409.14 ( 1.04%)
Hmean 4096 5050.99 ( 0.00%) 5080.74 ( 0.59%)
Hmean 8192 9703.42 ( 0.00%) 10057.36 ( 3.65%)
Hmean 16384 17524.31 ( 0.00%) 18126.95 ( 3.44%)Small gains here, UDP_STREAM showed nothing interesting.
tbench4
4.4.0 4.4.0
vanilla nostats-v1
Hmean mb/sec-1 430.56 ( 0.00%) 453.55 ( 5.34%)
Hmean mb/sec-2 831.14 ( 0.00%) 820.39 ( -1.29%)
Hmean mb/sec-4 1537.69 ( 0.00%) 1678.43 ( 9.15%)
Hmean mb/sec-8 3327.61 ( 0.00%) 3124.44 ( -6.11%)
Hmean mb/sec-16 5833.78 ( 0.00%) 5936.33 ( 1.76%)
Hmean mb/sec-32 11022.03 ( 0.00%) 11076.39 ( 0.49%)
Hmean mb/sec-64 15757.57 ( 0.00%) 15850.09 ( 0.59%)
Hmean mb/sec-128 15086.64 ( 0.00%) 15192.84 ( 0.70%)
Hmean mb/sec-256 14762.37 ( 0.00%) 14905.69 ( 0.97%)
Hmean mb/sec-512 14999.88 ( 0.00%) 15086.94 ( 0.58%)
Hmean mb/sec-1024 14095.00 ( 0.00%) 14218.66 ( 0.88%)
Hmean mb/sec-2048 13043.98 ( 0.00%) 13499.61 ( 3.49%)Borderline but small gains.
hackbench-pipes
4.4.0 4.4.0
vanilla nostats-v1
Amean 1 0.0753 ( 0.00%) 0.0817 ( -8.54%)
Amean 4 0.1214 ( 0.00%) 0.1247 ( -2.71%)
Amean 7 0.1766 ( 0.00%) 0.1787 ( -1.21%)
Amean 12 0.2940 ( 0.00%) 0.2637 ( 10.30%)
Amean 21 0.3799 ( 0.00%) 0.2926 ( 22.98%)
Amean 30 0.3570 ( 0.00%) 0.3294 ( 7.72%)
Amean 48 0.5830 ( 0.00%) 0.5307 ( 8.97%)
Amean 79 0.9131 ( 0.00%) 0.8671 ( 5.04%)
Amean 110 1.3851 ( 0.00%) 1.3239 ( 4.42%)
Amean 141 1.9411 ( 0.00%) 1.7483 ( 9.94%)
Amean 172 2.3360 ( 0.00%) 2.2880 ( 2.05%)
Amean 192 2.5974 ( 0.00%) 2.4211 ( 6.79%)This showed a mix but some of the gains were large enough to be interesting.
Even though the gain is not universal and some workloads simply do not care, it stands to reason that doing less work within the scheduler is a good thing assuming that the user is ok with enabling the stats if required.
--- Documentation/kernel-parameters.txt | 5 ++ Documentation/sysctl/kernel.txt | 8 +++ include/linux/sched/sysctl.h | 4 ++ kernel/sched/core.c | 55 ++++++++++++++++++ kernel/sched/debug.c | 110 +++++++++++++++++++----------------- kernel/sched/fair.c | 6 +- kernel/sched/sched.h | 1 + kernel/sched/stats.h | 6 +- kernel/sysctl.c | 11 ++++ 9 files changed, 149 insertions(+), 57 deletions(-)
Documentation/kernel-parameters.txt +5 -0
@@ -3523,6 +3523,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted. sched_debug [KNL] Enables verbose scheduler debug messages. + schedstats= [KNL,X86] Enable or disable scheduled statistics. + Allowed values are enable and disable. This feature + incurs a small amount of overhead in the scheduler + but is useful for debugging and performance tuning. + skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate xtime_lock contention on larger systems, and/or RCU lock contention on all systems with CONFIG_MAXSMP set.
Documentation/sysctl/kernel.txt +8 -0
@@ -760,6 +760,14 @@ rtsig-nr shows the number of RT signals currently queued. ============================================================== +schedstats: + +Enables/disables scheduler statistics. Enabling this feature +incurs a small amount of overhead in the scheduler but is +useful for debugging and performance tuning. + +============================================================== + sg-big-buff: This file shows the size of the generic SCSI (sg) buffer.
include/linux/sched/sysctl.h +4 -0
@@ -95,4 +95,8 @@ extern int sysctl_numa_balancing(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos); +extern int sysctl_schedstats (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +#endif /* _SCHED_SYSCTL_H */
kernel/sched/core.c +55 -0
61 lines not on this page · raw message
kernel/sched/debug.c +58 -52
146 lines not on this page · raw message
kernel/sched/fair.c +4 -2
@@ -3110,7 +3110,8 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) }update_stats_enqueue (cfs_rq, se); -check_spread (cfs_rq, se); +if (static_branch_unlikely (&sched_schedstats)) +check_spread (cfs_rq, se);if (se != cfs_rq->curr)__enqueue_entity (cfs_rq, se); se->on_rq =1 ;
@@ -3359,7 +3360,8 @@ static void put_prev_entity(struct cfs_rq *cfs_rq, struct sched_entity *prev)/* throttle cfs_rqs exceeding runtime */ check_cfs_rq_runtime (cfs_rq); -check_spread (cfs_rq, prev); +if (static_branch_unlikely (&sched_schedstats)) +check_spread (cfs_rq, prev);if (prev->on_rq) {update_stats_wait_start (cfs_rq, prev);/* Put 'current' back into the tree. */
kernel/sched/sched.h +1 -0
@@ -1022,6 +1022,7 @@ extern struct static_key sched_feat_keys[__SCHED_FEAT_NR];#endif /* SCHED_DEBUG && HAVE_JUMP_LABEL */ extern struct static_key_false sched_numa_balancing; +extern struct static_key_false sched_schedstats;static inline u64 global_rt_period (void ) {
kernel/sched/stats.h +3 -3
@@ -29,9 +29,9 @@ rq_sched_info_dequeued(struct rq *rq, unsigned long long delta)if (rq) rq->rq_sched_info.run_delay += delta; } -# define schedstat_inc (rq, field) do { (rq)->field++; } while (0) -# define schedstat_add (rq, field, amt) do { (rq)->field += (amt); } while (0) -# define schedstat_set (var, val) do { var = (val); } while (0) +# define schedstat_inc (rq, field) do { if (static_branch_unlikely(&sched_schedstats)) { (rq)->field++; } } while (0) +# define schedstat_add (rq, field, amt) do { if (static_branch_unlikely(&sched_schedstats)) { (rq)->field += (amt); } } while (0) +# define schedstat_set (var, val) do { if (static_branch_unlikely(&sched_schedstats)) { var = (val); } } while (0)#else /* !CONFIG_SCHEDSTATS */ static inline void rq_sched_info_arrive (struct rq *rq,unsigned long long delta)
kernel/sysctl.c +11 -0
@@ -350,6 +350,17 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, +#ifdef CONFIG_SCHEDSTATS + { + .procname = "sched_schedstats", + .data = NULL, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = sysctl_schedstats, + .extra1 = &zero, + .extra2 = &one, + }, +#endif /* CONFIG_SCHEDSTATS */ #endif /* CONFIG_SMP */ #ifdef CONFIG_NUMA_BALANCING {
Signature · 1 line
2.6.4
Peter Zijlstra
maintainerQuoted 6 lines · Mel Gorman
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
So the reason its often enabled in distro configs is (IIRC) that it enables trace_sched_stat_{wait,sleep,iowait,blocked}().
I've not looked at the details of this patch, but I suspect this patch would make these tracepoints available but non-functional unless you poke the magic button.
Quoted 8 lines · Peter Zijlstra
Quoted 6 lines · Mel Gorman
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
Quoted 7 lines
So the reason its often enabled in distro configs is (IIRC) that it enables trace_sched_stat_{wait,sleep,iowait,blocked}().
I've not looked at the details of this patch, but I suspect this patch would make these tracepoints available but non-functional unless you poke the magic button.
It's potentially slightly worse than that. The tracepoints are available, functional but produce garbage unless the magic button is poked and do a lot of useful work producing that garbage. I missed a few hunks that are included below. With this, the tracepoints will exist but unless the magic button is poked, they'll never fire. Considering the paths affected, this will require retesting but if it's ok, would you be ok in general with a patch like this that forces a button to be pushed if the user is doing performance analysis?
kernel/sched/fair.c +9 -1
@@ -755,7 +755,12 @@ static void update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se) { struct task_struct *p; -u64 delta =rq_clock (rq_of (cfs_rq)) - se->statistics.wait_start; +u64 delta; + +if (static_branch_unlikely (&sched_schedstats)) +return ; + + delta =rq_clock (rq_of (cfs_rq)) - se->statistics.wait_start;if (entity_is_task (se)) { p =task_of (se);
@@ -2982,6 +2987,9 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)#ifdef CONFIG_SCHEDSTATS struct task_struct *tsk =NULL ; +if (static_branch_unlikely (&sched_schedstats)) +return ; +if (entity_is_task (se)) tsk =task_of (se);
Signature · 2 lines
Mel Gorman SUSE Labs
Peter Zijlstra
maintainerQuoted 17 lines · Mel Gorman
Quoted 8 lines · Peter Zijlstra
Quoted 6 lines · Mel Gorman
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
Quoted 7 lines
So the reason its often enabled in distro configs is (IIRC) that it enables trace_sched_stat_{wait,sleep,iowait,blocked}().
I've not looked at the details of this patch, but I suspect this patch would make these tracepoints available but non-functional unless you poke the magic button.
Quoted 8 lines
It's potentially slightly worse than that. The tracepoints are available, functional but produce garbage unless the magic button is poked and do a lot of useful work producing that garbage. I missed a few hunks that are included below. With this, the tracepoints will exist but unless the magic button is poked, they'll never fire. Considering the paths affected, this will require retesting but if it's ok, would you be ok in general with a patch like this that forces a button to be pushed if the user is doing performance analysis?
Its rather unintuitive and error prone semantics :/
Ideally we'd auto-magically enable the magic knob if any of these affected tracepoints become active. Or alternatively fail to enable the tracepoints (which would then get us people going: 'WTF this used to work').
One of the things on my TODO is look at how much of sched_stat is required for these tracepoints and see if we can enable just that (hopefully) little bit, while not doing the rest of the accounting.
Of course, it'll be our luck that tracking the data for these tracepoints is the most expensive part of schedstats ...
Ingo?
Quoted 34 lines · Peter Zijlstra
Quoted 17 lines · Mel Gorman
Quoted 8 lines · Peter Zijlstra
Quoted 6 lines · Mel Gorman
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
Quoted 7 lines
So the reason its often enabled in distro configs is (IIRC) that it enables trace_sched_stat_{wait,sleep,iowait,blocked}().
I've not looked at the details of this patch, but I suspect this patch would make these tracepoints available but non-functional unless you poke the magic button.
Quoted 8 lines
It's potentially slightly worse than that. The tracepoints are available, functional but produce garbage unless the magic button is poked and do a lot of useful work producing that garbage. I missed a few hunks that are included below. With this, the tracepoints will exist but unless the magic button is poked, they'll never fire. Considering the paths affected, this will require retesting but if it's ok, would you be ok in general with a patch like this that forces a button to be pushed if the user is doing performance analysis?
Its rather unintuitive and error prone semantics :/
Ideally we'd auto-magically enable the magic knob if any of these affected tracepoints become active. Or alternatively fail to enable the tracepoints (which would then get us people going: 'WTF this used to work').
Quoted 8 lines
One of the things on my TODO is look at how much of
sched_statis required for these tracepoints and see if we can enable just that (hopefully) little bit, while not doing the rest of the accounting.Of course, it'll be our luck that tracking the data for these tracepoints is the most expensive part of schedstats ...
Ingo?
IIRC it needed only a small subset of schedstats to make those tracepoints work.
We already have too much overhead in the scheduler as-is - and the extra cache footprint does not even show on the typically cache-rich enterprise CPUs most of the scalability testing goes on.
My minimum requirement for such runtime enablement would be to make it entirely static-branch patched and triggered at the call sites as well - not hidden inside schedstat functions.
Thanks,
Ingo
Quoted 7 lines · Ingo Molnar
Quoted 4 lines
Of course, it'll be our luck that tracking the data for these tracepoints is the most expensive part of schedstats ...
Ingo?
IIRC it needed only a small subset of schedstats to make those tracepoints work.
Quoted 8 lines
We already have too much overhead in the scheduler as-is - and the extra cache footprint does not even show on the typically cache-rich enterprise CPUs most of the scalability testing goes on.
My minimum requirement for such runtime enablement would be to make it entirely static-branch patched and triggered at the call sites as well - not hidden inside schedstat functions.
As it is, it's static-branch patched but I'm struggling to see why they cannot be hidden in the schedstat_* functions which are just preprocessor macros. The checks could be put in the callsites but it's a lot of updates and I don't think the end result would be very nice to read.
Signature · 2 lines
Mel Gorman SUSE Labs
Quoted 17 lines · Mel Gorman
Quoted 7 lines · Ingo Molnar
Quoted 4 lines
Of course, it'll be our luck that tracking the data for these tracepoints is the most expensive part of schedstats ...
Ingo?
IIRC it needed only a small subset of schedstats to make those tracepoints work.
Quoted 8 lines
We already have too much overhead in the scheduler as-is - and the extra cache footprint does not even show on the typically cache-rich enterprise CPUs most of the scalability testing goes on.
My minimum requirement for such runtime enablement would be to make it entirely static-branch patched and triggered at the call sites as well - not hidden inside schedstat functions.
Quoted 4 lines
As it is, it's static-branch patched but I'm struggling to see why they cannot be hidden in the schedstat_* functions which are just preprocessor macros. The checks could be put in the callsites but it's a lot of updates and I don't think the end result would be very nice to read.
So I was judging by:
@@ -755,7 +755,12 @@ static void
update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
struct task_struct *p;- u64 delta = rq_clock(rq_of(cfs_rq)) - se->statistics.wait_start;
+ u64 delta;
+
+ if (static_branch_unlikely(&sched_schedstats))
+ return;
+
which puts a static branch inside a real function, not preprocessor macros.
Thanks,
Ingo
Quoted 38 lines · Ingo Molnar
Quoted 17 lines · Mel Gorman
Quoted 7 lines · Ingo Molnar
Quoted 4 lines
Of course, it'll be our luck that tracking the data for these tracepoints is the most expensive part of schedstats ...
Ingo?
IIRC it needed only a small subset of schedstats to make those tracepoints work.
Quoted 8 lines
We already have too much overhead in the scheduler as-is - and the extra cache footprint does not even show on the typically cache-rich enterprise CPUs most of the scalability testing goes on.
My minimum requirement for such runtime enablement would be to make it entirely static-branch patched and triggered at the call sites as well - not hidden inside schedstat functions.
Quoted 4 lines
As it is, it's static-branch patched but I'm struggling to see why they cannot be hidden in the schedstat_* functions which are just preprocessor macros. The checks could be put in the callsites but it's a lot of updates and I don't think the end result would be very nice to read.
So I was judging by:
kernel/sched/fair.c +5
-1@@ -755,7 +755,12 @@ static void update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se) { struct task_struct *p; -u64 delta =rq_clock (rq_of (cfs_rq)) - se->statistics.wait_start; +u64 delta; + +if (static_branch_unlikely (&sched_schedstats)) +return ; +
Quoted 2 lines
which puts a static branch inside a real function, not preprocessor macros.
Ok, I see your point, thanks.
The vast majority of the checks are in the schedstat_[inc|dec|set) helpers. update_stats_wait_end() is an oddity in that it's a large function that only exists in schedstat and does a number of calculations. Ideally update_stats_wait would be updated too. In the next revision, I'll create a schedstats_enabled() helper that is an alias of static_branch_unlikely() and returns 0 if stats are not configured in for use at the call-site of large functions like this. That has the added benefit of avoiding any function call overhead.
I'm less concerned with the exact coding style at the moment. I'm more concerned about whether people are ok with the dead tracepoints dead and hidden stats when schedstat is disabled at runtime by default.
Signature · 2 lines
Mel Gorman SUSE Labs
Quoted 9 lines · Mel Gorman
The vast majority of the checks are in the schedstat_[inc|dec|set) helpers.
update_stats_wait_end()is an oddity in that it's a large function that only exists in schedstat and does a number of calculations. Ideallyupdate_stats_waitwould be updated too. In the next revision, I'll create aschedstats_enabled()helper that is an alias ofstatic_branch_unlikely()and returns 0 if stats are not configured in for use at the call-site of large functions like this. That has the added benefit of avoiding any function call overhead.
Not even build tested but this is the general direction I'm thinking. It adds the schedstat_enabled() helper and disables more schedstat-only code.
Documentation/kernel-parameters.txt +5 -0
@@ -3523,6 +3523,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted. sched_debug [KNL] Enables verbose scheduler debug messages. + schedstats= [KNL,X86] Enable or disable scheduled statistics. + Allowed values are enable and disable. This feature + incurs a small amount of overhead in the scheduler + but is useful for debugging and performance tuning. + skew_tick= [KNL] Offset the periodic timer tick per cpu to mitigate xtime_lock contention on larger systems, and/or RCU lock contention on all systems with CONFIG_MAXSMP set.
Documentation/sysctl/kernel.txt +8 -0
@@ -760,6 +760,14 @@ rtsig-nr shows the number of RT signals currently queued. ============================================================== +schedstats: + +Enables/disables scheduler statistics. Enabling this feature +incurs a small amount of overhead in the scheduler but is +useful for debugging and performance tuning. + +============================================================== + sg-big-buff: This file shows the size of the generic SCSI (sg) buffer.
include/linux/sched/sysctl.h +4 -0
@@ -95,4 +95,8 @@ extern int sysctl_numa_balancing(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos); +extern int sysctl_schedstats (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +#endif /* _SCHED_SYSCTL_H */
kernel/sched/core.c +60 -2
86 lines not on this page · raw message
kernel/sched/debug.c +58 -52
146 lines not on this page · raw message
kernel/sched/fair.c +55 -35
152 lines not on this page · raw message
kernel/sched/sched.h +1 -0
@@ -1022,6 +1022,7 @@ extern struct static_key sched_feat_keys[__SCHED_FEAT_NR];#endif /* SCHED_DEBUG && HAVE_JUMP_LABEL */ extern struct static_key_false sched_numa_balancing; +extern struct static_key_false sched_schedstats;static inline u64 global_rt_period (void ) {
kernel/sched/stats.h +5 -3
@@ -29,9 +29,10 @@ rq_sched_info_dequeued(struct rq *rq, unsigned long long delta)if (rq) rq->rq_sched_info.run_delay += delta; } -# define schedstat_inc (rq, field) do { (rq)->field++; } while (0) -# define schedstat_add (rq, field, amt) do { (rq)->field += (amt); } while (0) -# define schedstat_set (var, val) do { var = (val); } while (0) +# define schedstat_enabled () static_branch_unlikely(&sched_schedstats) +# define schedstat_inc (rq, field) do { if (schedstat_enabled()) { (rq)->field++; } } while (0) +# define schedstat_add (rq, field, amt) do { if (schedstat_enabled()) { (rq)->field += (amt); } } while (0) +# define schedstat_set (var, val) do { if (schedstat_enabled()) { var = (val); } } while (0)#else /* !CONFIG_SCHEDSTATS */ static inline void rq_sched_info_arrive (struct rq *rq,unsigned long long delta)
@@ -42,6 +43,7 @@ rq_sched_info_dequeued(struct rq *rq, unsigned long long delta)static inline void rq_sched_info_depart (struct rq *rq,unsigned long long delta) {} +# define schedstat_enabled () 0# define schedstat_inc (rq, field) do { } while (0)# define schedstat_add (rq, field, amt) do { } while (0)# define schedstat_set (var, val) do { } while (0)
kernel/sysctl.c +11 -0
@@ -350,6 +350,17 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, +#ifdef CONFIG_SCHEDSTATS + { + .procname = "sched_schedstats", + .data = NULL, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = sysctl_schedstats, + .extra1 = &zero, + .extra2 = &one, + }, +#endif /* CONFIG_SCHEDSTATS */ #endif /* CONFIG_SMP */ #ifdef CONFIG_NUMA_BALANCING {
Signature · 2 lines
Mel Gorman SUSE Labs
kernel/sched/core.c static void try_to_wake_up_local(struct task_struct *p) · line 2146
Quoted 3 lines · Mel Gorman
kernel/sched/core.c +2
-1-ttwu_stat (p,smp_processor_id (),0 ); +if (schedstat_enabled ()) +ttwu_stat (p,smp_processor_id (),0 );
Yeah. I actually like this for the cleanup factor as well: your patch makes it a _lot_ more obvious what is a statistics slowpath and what is not.
We tried to achieve that effect via the _stat() naming, but in hindsight that was a failure.
Thanks,
Ingo
Quoted 27 lines · Peter Zijlstra
Quoted 17 lines · Mel Gorman
Quoted 8 lines · Peter Zijlstra
Quoted 6 lines · Mel Gorman
schedstats is very useful during debugging and performance tuning but it incurs overhead. As such, even though it can be disabled at build time, it is often enabled as the information is useful. This patch adds a kernel command-line and sysctl tunable to enable or disable schedstats on demand. It is disabled by default as someone who knows they need it can also learn to enable it when necessary.
Quoted 7 lines
So the reason its often enabled in distro configs is (IIRC) that it enables trace_sched_stat_{wait,sleep,iowait,blocked}().
I've not looked at the details of this patch, but I suspect this patch would make these tracepoints available but non-functional unless you poke the magic button.
Quoted 8 lines
It's potentially slightly worse than that. The tracepoints are available, functional but produce garbage unless the magic button is poked and do a lot of useful work producing that garbage. I missed a few hunks that are included below. With this, the tracepoints will exist but unless the magic button is poked, they'll never fire. Considering the paths affected, this will require retesting but if it's ok, would you be ok in general with a patch like this that forces a button to be pushed if the user is doing performance analysis?
Quoted 4 lines
Its rather unintuitive and error prone semantics :/
Ideally we'd auto-magically enable the magic knob if any of these affected tracepoints become active.
This would also be misleading. Once enabled, the stats start being updated. An already sleeping process will not have wait_start set so the trace information for wakeups will initially be completely bogus.
Quoted 4 lines
Or alternatively fail to enable the
tracepoints (which would then get us people going: 'WTF this used to work').
Each option is at least visible to some extent so there would be a period of time of wtf for analysing scheduler performance. I'm not sure there is a way of failing to set a tracepoint but I'll check it out.
Quoted 4 lines
One of the things on my TODO is look at how much of
sched_statis required for these tracepoints and see if we can enable just that (hopefully) little bit, while not doing the rest of the accounting.
I don't think many are required but some of them are expensive to keep track of. Look at enqueue_sleeper as an example of the amount of work required just to have the tracepoint available.
Signature · 2 lines
Mel Gorman SUSE Labs
Quoted 7 lines · Mel Gorman
kernel/sched/core.c +7
-0+static int __init setup_schedstats (char *str) +{ +int ret =0 ; +if (!str) + goto out; + +if (!strcmp (str,"enable" )) {
kernel/sched/core.c int sysctl_numa_balancing(struct ctl_table *table, int write, · line 2311
Quoted 10 lines
kernel/sched/core.c +10
-0+set_schedstats (true); + ret =1 ; + }else if (!strcmp (str,"disable" )) { +set_schedstats (false); + ret =1 ; + } +out: +if (!ret) +pr_warn ("Unable to parse numa_balancing=\n" ); +
Copy+paste error?
Quoted 12 lines · Matt Fleming
Quoted 11 lines · Mel Gorman
kernel/sched/core.c +11
-0+static int __init setup_schedstats (char *str) +{ +int ret =0 ; +if (!str) + goto out; + +if (!strcmp (str,"enable" )) { +set_schedstats (true); + ret =1 ; + }else if (!strcmp (str,"disable" )) { +set_schedstats (false);
Quoted 8 lines
kernel/sched/core.c int sysctl_numa_balancing(struct ctl_table *table, int write, · line 2311
Quoted 6 lines
kernel/sched/core.c +6
-0+ ret =1 ; + } +out: +if (!ret) +pr_warn ("Unable to parse numa_balancing=\n" ); +Copy+paste error?
Yes.
Signature · 2 lines
Mel Gorman SUSE Labs