“不服跑个分”已经沦为手机行业的调侃用语,但是实话实说,在操作系统领域“跑分”确实是最重要的评价方式之一。比如 Linux 内核社区常常以跑分软件得分,来评价一个优化补丁的价值。甚至还有 phoronix 这样专注于 Linux 跑分的媒体。而且今天我还想说一点,让软件跑分高,这是实力的体现,是建立在对内核的深刻理解基础上的。本文的故事就源于一次日常的性能优化分析。我们在评估自动化性能调优软件 tuned 的时候,发现它在服务器场景,对 Linux 内核调度器相关的参数做了一些微小的修改,但是这些修改却很大程度改善了 hackbench 这款跑分软件的性能。是不是很有意思?让我们一起来一探究竟。
本文将从几个方面展开,并重点介绍黑体字部分:
2.1 CFS调度器
Linux 中大部分(可以粗略认为是实时任务之外的所有)线程/进程,都由一个叫 CFS(完全公平调度器)的调度器进行调度,它是 Linux 最核心的组件之一。(在Linux中,线程和进程只有细微差别,下文统一用进程表述)
CFS 的核心是红黑树,用于管理系统中进程的运行时间,作为选择下一个将要运行的进程的依据。此外,它还支持优先级、组调度(基于我们熟知的 cgroup 实现)、限流等功能,满足各种高级需求。CFS 的详细介绍。
2.2 hackbench
hackbench 是一个针对 Linux 内核调度器的压力测试工具,它的主要工作是创建指定数量的调度实体对(线程/进程),并让它们通过 sockets/pipe 进行数据传输,最后统计整个运行过程的时间开销。
2.3 CFS 调度器参数
本文重点关注以下两个参数,这两个参数也是影响 hackbench 跑分性能的重要因素。系统管理员可以使用 sysctl 命令来进行设置。
通过修改 kernel.sched_min_granularity_ns,可以影响 CFS 调度周期(sched period)的时间长短。例如:设置kernel.sched_min_granularity_ns = m,当系统中存在大量可运行进程时,m 越大,CFS 调度周期就越长。
如图 1 所示,每个进程都能够在 CPU 上运行且时间各有长短,sched_min_granularity_ns 保证了每个进程的最小运行时间(优先级相同的情况下),sched_min_granularity_ns 越大每个进程单次可运行的时间就越长。
kernel.sched_wakeup_granularity_ns 保证了重新唤醒的进程不会频繁抢占正在运行的进程,kernel.sched_wakeup_granularity_ns 越大,唤醒进程进行抢占的频率就越小。
如图 2 所示,有 process-{1,2,3} 三个进程被唤醒,因为 process-3 的运行时间大于 curr(正在 CPU 上运行的进程)无法抢占运行,而 process-2 运行时间小于 curr 但其差值小于 sched_wakeup_granularity_ns 也无法抢占运行,只有 process-1 能够抢占 curr 运行,因此 sched_wakeup_granularity_ns 越小,进程被唤醒后的响应时间就越快(等待运行时间越短)。
hackbench 工作模式分为 process mode 和 thread mode,主要区别就是以创建 process 还是 thread 为基础来进行测试,下面以 thread 来进行介绍。
通过上面 hackbench 模型分析,可以得知同一个 group 中的 thread/process 主要是 I/O 密集型,不同 group 之间的 thread/process 主要是 CPU 密集型。
主动上下文切换:
因此,系统中"主动上下文切换"是很多的,但同时也存在“被动上下文切换”。后者会受到接下来我们将要介绍的参数影响。
在hackbench-socket 测试中,tuned修改了 CFS 的 sched_min_granularity_ns 和 sched_wakeup_granularity_ns 两个参数,导致了性能的显著区别。具体如下:
接下来我们调整这两个调度参数来进行进一步的深入分析。
注:为了简介表达下面会以 m 表示 kernel.sched_min_granularity_ns,w 表示 kernel.sched_wakeup_granularity_ns
为了探索双参数对于调度器的影响,我们选择每次固定一个参数,研究另一个参数变化对于性能的影响,并使用系统知识来解释这种现象背后的原理。
5.1 固定 sched_wakeup_granularity_ns
在上图中我们固定了参数 w 并根据参数 m 变化趋势其划分为三个部分:区域A(1ms~4ms),区域B(4ms~17ms),区域C(17ms~30ms)。在区域A中四条曲线均呈现一个极速下降的趋势,而在区域B中四条曲线都处于一种震荡状态,波动较大,最后在区域C中四条曲线都趋于稳定。
在第二节相关知识中可以知道 m 影响着进程的运行时间,同时也意味着它影响着进程的“被动上下文切换”。
5.2 固定 sched_min_granularity_ns
在上图中我们固定了参数 m,同样划分了三个区域:
5.3 性能趋势总览
下面是一个实验数据的热力总览图,来直观展示 m 和 w 之间的制约关系,以供需要的同学参考分析。三个区域和图 4、图 5 的区域会略有不同。
5.4 最优双参数(对于 hackbench )
何惟禹(百奎),阿里云操作系统团队实习生,北京邮电大学在读研究生。
吴一昊(丁缓),17 年加入阿里云操作系统团队,主要经历有资源隔离、热升级、调度器SLI等。
原文链接:http://click.aliyun.com/m/1000289775/
本文为阿里云原创内容,未经允许不得转载。