CFS调理参数: sched_wakeup_granularity

打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

前言

将一个处于就寝状态或者新创建的进程加入停当队列时会产生唤醒抢占检查,被唤醒的任务一样平常期望能够立刻实行,发生抢占能够满足被唤醒任务的实时性需求。CFS调理器的唤醒抢占可否乐成会受到sysctl_sched_wakeup_granularity的影响,该参数能控制唤醒抢占发生的概率。频仍的抢占据可能会造成大的上下文切换开销,影响业务吞吐,因此sysctl_sched_wakeup_granularity是调理性能优化的一个重要参数。
唤醒抢占的触发条件

CFS调理类中的每一个任务都有一个虚拟时间vruntime,虚拟时间小的进程会优先被调理,被唤醒任务se抢占当前任务curr的只必要满足虚拟时间差vdiff超过唤醒抢占粒度gran,显然可知粒度越小发生抢占的概率越大。
  1. // fair.c
  2. static int
  3. wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se)
  4. {
  5.         int ret;
  6.         s64 gran, vdiff = curr->vruntime - se->vruntime;
  7.     ...
  8.         gran = wakeup_gran(se);
  9.         if (vdiff > gran) // 超过唤醒抢占的粒度,抢占成功
  10.                 return 1;
  11.         return 0;
  12. }
复制代码
抢占粒度的影响因素

唤醒抢占粒度的计算结果受两方面影响:

  • sysctl_sched_wakeup_granularity:该参数作为基底直接影响唤醒粒度的大小,可以改变系统团体的唤醒抢占发生概率
  • 被唤醒任务的权重:抢占唤醒还必要考虑到任务之间的优先级差别,调理器会优先保障高优先级任务的实行权,换句话说如果被唤醒任务的优先级高于正在实行的任务那么抢占就会更轻易发生,反之抢占会更轻易失败。
因此calc_delta_fair()将sysctl_sched_wakeup_granularity按照被唤醒任务se的权重进行了加工,se的权重越大计算得到的唤醒抢占粒度越小。
  1. // fair.c
  2. static unsigned long wakeup_gran(struct sched_entity *se)
  3. {
  4.         unsigned long gran = sysctl_sched_wakeup_granularity;
  5.     ...
  6.         return calc_delta_fair(gran, se);
  7. }
复制代码
调整sysctl_sched_wakeup_granularity

默认情况下sysctl_sched_wakeup_granularity为1 msec * (1 + ilog(ncpus)),比如4核机器默认值为3ms。
Linux v5.13之前的版本可以通过echo X > /proc/sys/kernel/sched_wakeup_granularity或者sudo sysctl kernel.sched_wakeup_granularity_ns=X进行修改。
Linux v5.13以后参数被移动到了/sys/kernel/debug/sched/*目次下。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表