The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH V2 0/2] sched: Reduce the default slice to avoid tasks getting an extra tick
@ 2025-02-07  6:09 zihan zhou
  2025-02-07  6:14 ` [PATCH V2 1/2] " zihan zhou
  2025-02-07  6:24 ` [PATCH V2 2/2] " zihan zhou
  0 siblings, 2 replies; 7+ messages in thread
From: zihan zhou @ 2025-02-07  6:09 UTC (permalink / raw)
  To: mingo, peterz, juri.lelli, vincent.guittot, dietmar.eggemann,
	rostedt, bsegall, mgorman, vschneid
  Cc: linux-kernel, zihan zhou

The old default value for slice is 0.75 msec * (1 + ilog(ncpus)) which
means that we have a default slice of
0.75 for 1 cpu
1.50 up to 3 cpus
2.25 up to 7 cpus
3.00 for 8 cpus and above.

For HZ=250 and HZ=100, because of the tick accuracy, the runtime of
tasks is far higher than their slice.
For HZ=1000 with 8 cpus or more, the accuracy of tick is already
satisfactory, but there is still an issue that tasks will get an extra
tick because the tick often arrives a little faster than expected. In this
case, the task can only wait until the next tick to consider that it has
reached its deadline, and will run 1ms longer.

vruntime + sysctl_sched_base_slice =     deadline
        |-----------|-----------|-----------|-----------|
             1ms          1ms         1ms         1ms
                   ^           ^           ^           ^
                 tick1       tick2       tick3       tick4(nearly 4ms)

There are two reasons for tick error: clockevent precision and the
CONFIG_IRQ_TIME_ACCOUNTING/CONFIG_PARAVIRT_TIME_ACCOUNTING.
with CONFIG_IRQ_TIME_ACCOUNTING every tick will be less than 1ms, but
even
without it, because of clockevent precision, tick still often less than
1ms.

In order to make scheduling more precise, we changed 0.75 to 0.70,
Using 0.70 instead of 0.75 should not change much for other configs
and would fix this issue:
0.70 for 1 cpu
1.40 up to 3 cpus
2.10 up to 7 cpus
2.8 for 8 cpus and above.

This does not guarantee that tasks can run the slice time accurately
every
time, but occasionally running an extra tick has little impact.

Changes from v1:
  - update sysctl_sched_base_slice with debugfs, limit its value and
    update normalized_sysctl_sched_base_slice.

zihan zhou (2):
  sched/fair: reduce the default slice.
  sched/debug: update sysctl_sched_base_slice with debugfs.

 kernel/sched/debug.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
 kernel/sched/fair.c  | 47 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 93 insertions(+), 5 deletions(-)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH V2 1/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07  6:09 [PATCH V2 0/2] sched: Reduce the default slice to avoid tasks getting an extra tick zihan zhou
@ 2025-02-07  6:14 ` zihan zhou
  2025-02-07 13:46   ` Vincent Guittot
  2025-02-07  6:24 ` [PATCH V2 2/2] " zihan zhou
  1 sibling, 1 reply; 7+ messages in thread
From: zihan zhou @ 2025-02-07  6:14 UTC (permalink / raw)
  To: 15645113830zzh
  Cc: bsegall, dietmar.eggemann, juri.lelli, linux-kernel, mgorman,
	mingo, peterz, rostedt, vincent.guittot, vschneid

Reduce the default slice, add a comment explaining why this modification
was made.

Signed-off-by: zihan zhou <15645113830zzh@gmail.com>
---
 kernel/sched/fair.c | 47 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 26958431deb7..754b0785eaa0 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -71,10 +71,49 @@ unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_LOG;
 /*
  * Minimal preemption granularity for CPU-bound tasks:
  *
- * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds)
- */
-unsigned int sysctl_sched_base_slice			= 750000ULL;
-static unsigned int normalized_sysctl_sched_base_slice	= 750000ULL;
+ * (default: 0.70 msec * (1 + ilog(ncpus)), units: nanoseconds)
+ *
+ * The old default value for slice is 0.75 msec * (1 + ilog(ncpus)) which
+ * means that we have a default slice of
+ * 0.75 for 1 cpu
+ * 1.50 up to 3 cpus
+ * 2.25 up to 7 cpus
+ * 3.00 for 8 cpus and above.
+ *
+ * For HZ=250 and HZ=100, because of the tick accuracy, the runtime of tasks
+ * is far higher than their slice.
+ * For HZ=1000 with 8 cpus or more, the accuracy of tick is already
+ * satisfactory, but there is still an issue that tasks will get an extra
+ * tick because the tick often arrives a little faster than expected. In this
+ * case, the task can only wait until the next tick to consider that it has
+ * reached its deadline, and will run 1ms longer.
+ *
+ * vruntime + sysctl_sched_base_slice =     deadline
+ *         |-----------|-----------|-----------|-----------|
+ *              1ms          1ms         1ms         1ms
+ *                    ^           ^           ^           ^
+ *                  tick1       tick2       tick3       tick4(nearly 4ms)
+ *
+ * There are two reasons for tick error: clockevent precision and the
+ * CONFIG_IRQ_TIME_ACCOUNTING/CONFIG_PARAVIRT_TIME_ACCOUNTING.
+ * with CONFIG_IRQ_TIME_ACCOUNTING every tick will be less than 1ms, but even
+ * without it, because of clockevent precision, tick still often less than
+ * 1ms.
+ *
+ * In order to make scheduling more precise, we changed 0.75 to 0.70,
+ * Using 0.70 instead of 0.75 should not change much for other configs
+ * and would fix this issue:
+ * 0.70 for 1 cpu
+ * 1.40 up to 3 cpus
+ * 2.10 up to 7 cpus
+ * 2.8 for 8 cpus and above.
+ *
+ * This does not guarantee that tasks can run the slice time accurately every
+ * time, but occasionally running an extra tick has little impact.
+ *
+ */
+unsigned int sysctl_sched_base_slice			= 700000ULL;
+static unsigned int normalized_sysctl_sched_base_slice	= 700000ULL;
 
 const_debug unsigned int sysctl_sched_migration_cost	= 500000UL;
 
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH V2 2/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07  6:09 [PATCH V2 0/2] sched: Reduce the default slice to avoid tasks getting an extra tick zihan zhou
  2025-02-07  6:14 ` [PATCH V2 1/2] " zihan zhou
@ 2025-02-07  6:24 ` zihan zhou
  2025-02-08  1:04   ` kernel test robot
  2025-02-08  5:59   ` kernel test robot
  1 sibling, 2 replies; 7+ messages in thread
From: zihan zhou @ 2025-02-07  6:24 UTC (permalink / raw)
  To: 15645113830zzh
  Cc: bsegall, dietmar.eggemann, juri.lelli, linux-kernel, mgorman,
	mingo, peterz, rostedt, vincent.guittot, vschneid

update sysctl_sched_base_slice with debugfs, limit its value and
update normalized_sysctl_sched_base_slice.

Signed-off-by: zihan zhou <15645113830zzh@gmail.com>
---
 kernel/sched/debug.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index fd7e85220715..70dda949a69a 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -166,6 +166,55 @@ static const struct file_operations sched_feat_fops = {
 	.release	= single_release,
 };
 
+
+static ssize_t sched_base_slice_write(struct file *filp, const char __user *ubuf,
+				   size_t cnt, loff_t *ppos)
+{
+	char buf[16];
+	unsigned int base_slice;
+
+	if (cnt > 15)
+		cnt = 15;
+
+	if (copy_from_user(&buf, ubuf, cnt))
+		return -EFAULT;
+	buf[cnt] = '\0';
+
+	if (kstrtouint(buf, 10, &base_slice))
+		return -EINVAL;
+
+
+	base_slice = clamp_t(u64, base_slice,
+					NSEC_PER_MSEC/10,   /* HZ=1000 * 10 */
+					NSEC_PER_MSEC*100); /* HZ=100  / 10 */
+
+	sysctl_sched_base_slice = base_slice;
+
+	sched_update_scaling();
+
+	*ppos += cnt;
+	return cnt;
+}
+
+static int sched_base_slice_show(struct seq_file *m, void *v)
+{
+	seq_printf(m, "%d\n", sysctl_sched_base_slice);
+	return 0;
+}
+
+static int sched_base_slice_open(struct inode *inode, struct file *filp)
+{
+	return single_open(filp, sched_base_slice_show, NULL);
+}
+
+static const struct file_operations sched_base_slice_fops = {
+	.open		= sched_base_slice_open,
+	.write		= sched_base_slice_write,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
 #ifdef CONFIG_SMP
 
 static ssize_t sched_scaling_write(struct file *filp, const char __user *ubuf,
@@ -505,7 +554,7 @@ static __init int sched_init_debug(void)
 	debugfs_create_file("preempt", 0644, debugfs_sched, NULL, &sched_dynamic_fops);
 #endif
 
-	debugfs_create_u32("base_slice_ns", 0644, debugfs_sched, &sysctl_sched_base_slice);
+	debugfs_create_file("base_slice_ns", 0644, debugfs_sched, NULL, &sched_base_slice_fops);
 
 	debugfs_create_u32("latency_warn_ms", 0644, debugfs_sched, &sysctl_resched_latency_warn_ms);
 	debugfs_create_u32("latency_warn_once", 0644, debugfs_sched, &sysctl_resched_latency_warn_once);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH V2 1/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07  6:14 ` [PATCH V2 1/2] " zihan zhou
@ 2025-02-07 13:46   ` Vincent Guittot
  2025-02-08  8:51     ` zihan zhou
  0 siblings, 1 reply; 7+ messages in thread
From: Vincent Guittot @ 2025-02-07 13:46 UTC (permalink / raw)
  To: zihan zhou
  Cc: bsegall, dietmar.eggemann, juri.lelli, linux-kernel, mgorman,
	mingo, peterz, rostedt, vschneid

On Fri, 7 Feb 2025 at 07:15, zihan zhou <15645113830zzh@gmail.com> wrote:
>
> Reduce the default slice, add a comment explaining why this modification
> was made.
>
> Signed-off-by: zihan zhou <15645113830zzh@gmail.com>
> ---
>  kernel/sched/fair.c | 47 +++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 43 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 26958431deb7..754b0785eaa0 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -71,10 +71,49 @@ unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_LOG;
>  /*
>   * Minimal preemption granularity for CPU-bound tasks:
>   *
> - * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds)
> - */
> -unsigned int sysctl_sched_base_slice                   = 750000ULL;
> -static unsigned int normalized_sysctl_sched_base_slice = 750000ULL;
> + * (default: 0.70 msec * (1 + ilog(ncpus)), units: nanoseconds)
> + *
> + * The old default value for slice is 0.75 msec * (1 + ilog(ncpus)) which
> + * means that we have a default slice of
> + * 0.75 for 1 cpu
> + * 1.50 up to 3 cpus
> + * 2.25 up to 7 cpus
> + * 3.00 for 8 cpus and above.
> + *
> + * For HZ=250 and HZ=100, because of the tick accuracy, the runtime of tasks
> + * is far higher than their slice.
> + * For HZ=1000 with 8 cpus or more, the accuracy of tick is already
> + * satisfactory, but there is still an issue that tasks will get an extra
> + * tick because the tick often arrives a little faster than expected. In this
> + * case, the task can only wait until the next tick to consider that it has
> + * reached its deadline, and will run 1ms longer.
> + *
> + * vruntime + sysctl_sched_base_slice =     deadline
> + *         |-----------|-----------|-----------|-----------|
> + *              1ms          1ms         1ms         1ms
> + *                    ^           ^           ^           ^
> + *                  tick1       tick2       tick3       tick4(nearly 4ms)
> + *
> + * There are two reasons for tick error: clockevent precision and the
> + * CONFIG_IRQ_TIME_ACCOUNTING/CONFIG_PARAVIRT_TIME_ACCOUNTING.
> + * with CONFIG_IRQ_TIME_ACCOUNTING every tick will be less than 1ms, but even
> + * without it, because of clockevent precision, tick still often less than
> + * 1ms.
> + *
> + * In order to make scheduling more precise, we changed 0.75 to 0.70,
> + * Using 0.70 instead of 0.75 should not change much for other configs
> + * and would fix this issue:
> + * 0.70 for 1 cpu
> + * 1.40 up to 3 cpus
> + * 2.10 up to 7 cpus
> + * 2.8 for 8 cpus and above.
> + *
> + * This does not guarantee that tasks can run the slice time accurately every
> + * time, but occasionally running an extra tick has little impact.

The explanation above about why you change sysctl_sched_base_slice
from 0.75 to 0.70 should be put in commit message instead of the code

With this change:

Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

> + *
> + */
> +unsigned int sysctl_sched_base_slice                   = 700000ULL;
> +static unsigned int normalized_sysctl_sched_base_slice = 700000ULL;
>
>  const_debug unsigned int sysctl_sched_migration_cost   = 500000UL;
>
> --
> 2.33.0
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V2 2/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07  6:24 ` [PATCH V2 2/2] " zihan zhou
@ 2025-02-08  1:04   ` kernel test robot
  2025-02-08  5:59   ` kernel test robot
  1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2025-02-08  1:04 UTC (permalink / raw)
  To: zihan zhou
  Cc: oe-kbuild-all, bsegall, dietmar.eggemann, juri.lelli,
	linux-kernel, mgorman, mingo, peterz, rostedt, vincent.guittot,
	vschneid

Hi zihan,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/sched/core]
[also build test ERROR on peterz-queue/sched/core linus/master v6.14-rc1 next-20250207]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/zihan-zhou/sched-Reduce-the-default-slice-to-avoid-tasks-getting-an-extra-tick/20250207-142556
base:   tip/sched/core
patch link:    https://lore.kernel.org/r/20250207062402.33725-1-15645113830zzh%40gmail.com
patch subject: [PATCH V2 2/2] sched: Reduce the default slice to avoid tasks getting an extra tick
config: i386-randconfig-141-20250208 (https://download.01.org/0day-ci/archive/20250208/202502080831.VwRnAlxo-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250208/202502080831.VwRnAlxo-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502080831.VwRnAlxo-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from kernel/sched/build_utility.c:72:
>> kernel/sched/debug.c:193:2: error: call to undeclared function 'sched_update_scaling'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     193 |         sched_update_scaling();
         |         ^
   1 error generated.


vim +/sched_update_scaling +193 kernel/sched/debug.c

   168	
   169	
   170	static ssize_t sched_base_slice_write(struct file *filp, const char __user *ubuf,
   171					   size_t cnt, loff_t *ppos)
   172	{
   173		char buf[16];
   174		unsigned int base_slice;
   175	
   176		if (cnt > 15)
   177			cnt = 15;
   178	
   179		if (copy_from_user(&buf, ubuf, cnt))
   180			return -EFAULT;
   181		buf[cnt] = '\0';
   182	
   183		if (kstrtouint(buf, 10, &base_slice))
   184			return -EINVAL;
   185	
   186	
   187		base_slice = clamp_t(u64, base_slice,
   188						NSEC_PER_MSEC/10,   /* HZ=1000 * 10 */
   189						NSEC_PER_MSEC*100); /* HZ=100  / 10 */
   190	
   191		sysctl_sched_base_slice = base_slice;
   192	
 > 193		sched_update_scaling();
   194	
   195		*ppos += cnt;
   196		return cnt;
   197	}
   198	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V2 2/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07  6:24 ` [PATCH V2 2/2] " zihan zhou
  2025-02-08  1:04   ` kernel test robot
@ 2025-02-08  5:59   ` kernel test robot
  1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2025-02-08  5:59 UTC (permalink / raw)
  To: zihan zhou
  Cc: oe-kbuild-all, bsegall, dietmar.eggemann, juri.lelli,
	linux-kernel, mgorman, mingo, peterz, rostedt, vincent.guittot,
	vschneid

Hi zihan,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/sched/core]
[also build test ERROR on peterz-queue/sched/core linus/master v6.14-rc1 next-20250207]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/zihan-zhou/sched-Reduce-the-default-slice-to-avoid-tasks-getting-an-extra-tick/20250207-142556
base:   tip/sched/core
patch link:    https://lore.kernel.org/r/20250207062402.33725-1-15645113830zzh%40gmail.com
patch subject: [PATCH V2 2/2] sched: Reduce the default slice to avoid tasks getting an extra tick
config: x86_64-randconfig-072-20250208 (https://download.01.org/0day-ci/archive/20250208/202502081304.ujyIUca2-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250208/202502081304.ujyIUca2-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502081304.ujyIUca2-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from kernel/sched/build_utility.c:72:
   kernel/sched/debug.c: In function 'sched_base_slice_write':
>> kernel/sched/debug.c:193:9: error: implicit declaration of function 'sched_update_scaling'; did you mean 'sched_update_numa'? [-Werror=implicit-function-declaration]
     193 |         sched_update_scaling();
         |         ^~~~~~~~~~~~~~~~~~~~
         |         sched_update_numa
   cc1: some warnings being treated as errors


vim +193 kernel/sched/debug.c

   168	
   169	
   170	static ssize_t sched_base_slice_write(struct file *filp, const char __user *ubuf,
   171					   size_t cnt, loff_t *ppos)
   172	{
   173		char buf[16];
   174		unsigned int base_slice;
   175	
   176		if (cnt > 15)
   177			cnt = 15;
   178	
   179		if (copy_from_user(&buf, ubuf, cnt))
   180			return -EFAULT;
   181		buf[cnt] = '\0';
   182	
   183		if (kstrtouint(buf, 10, &base_slice))
   184			return -EINVAL;
   185	
   186	
   187		base_slice = clamp_t(u64, base_slice,
   188						NSEC_PER_MSEC/10,   /* HZ=1000 * 10 */
   189						NSEC_PER_MSEC*100); /* HZ=100  / 10 */
   190	
   191		sysctl_sched_base_slice = base_slice;
   192	
 > 193		sched_update_scaling();
   194	
   195		*ppos += cnt;
   196		return cnt;
   197	}
   198	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH V2 1/2] sched: Reduce the default slice to avoid tasks getting an extra tick
  2025-02-07 13:46   ` Vincent Guittot
@ 2025-02-08  8:51     ` zihan zhou
  0 siblings, 0 replies; 7+ messages in thread
From: zihan zhou @ 2025-02-08  8:51 UTC (permalink / raw)
  To: vincent.guittot
  Cc: 15645113830zzh, bsegall, dietmar.eggemann, juri.lelli,
	linux-kernel, mgorman, mingo, peterz, rostedt, vschneid

Thank you for your reply!

> The explanation above about why you change sysctl_sched_base_slice
> from 0.75 to 0.70 should be put in commit message instead of the code
> 
> With this change:
> 
> Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

Thank you for your guidance! I have submitted patch v3:
https://lore.kernel.org/all/20250208074821.11832-1-15645113830zzh@gmail.com/

Looking forward to your review.

Thanks!

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-02-08  8:52 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-07  6:09 [PATCH V2 0/2] sched: Reduce the default slice to avoid tasks getting an extra tick zihan zhou
2025-02-07  6:14 ` [PATCH V2 1/2] " zihan zhou
2025-02-07 13:46   ` Vincent Guittot
2025-02-08  8:51     ` zihan zhou
2025-02-07  6:24 ` [PATCH V2 2/2] " zihan zhou
2025-02-08  1:04   ` kernel test robot
2025-02-08  5:59   ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox