2.6.32 的 scheduler 变化

引用:http://lwn.net/Articles/352863/

"kernel 2.6.32 前瞻"里提到过,在和 BFS 进行了对比测试后,程序员们将在 2.6.32 里修复原来 CFS 的一些问题,这里都有些什么呢??

首先是 NEW_FAIR_SLEEPERS 特性缺省会被禁止掉。这个功能是当一个进程结束睡眠返回运行队列的时候,gives it a small runtime credit。现在看起来这个东东实现得有些问题,未来解决后也许会重新打开。

该特性实际上现在就可以关掉。CFS scheduler 提供了 15 个 bool 值来控制其运行(原文是说它有32768种组合),我们只需要简单的

echo NO_NEW_FAIR_SLEEPERS > /debug/sched_features

或许你的桌面就运转如飞了。

还有一个变化就是 Child-runs-first。【虽然我们在操作系统课里学到,fork() 之后的代码段究竟是 parent or child 首先执行是不可知的,但实际上操作系统的行为绝对不是完全随机的,我猜在 CPU 不那么多的系统上更是如此。】最近 Linux 的实现里,子进程会被安排优先执行,从概念上来说这样设计是对滴,因为通常意义上子进程的工作更重要;但这个有可能影响性能:在此时父进程的上下文信息被当前CPU、TLB保持,立即切换到子进程会有些延迟。在 kernel build 测试里,Parent-runs-first 性能有了显著提高。

有人提出质疑,说这样的变动可能导致那些假设子进程会首先运行的程序异常。尽管我觉得那些不按理论规范只凭经验写程序的人碰到麻烦是咎由自取,2.6.32里还是很厚道的留下一个kernel.sched_child_runs_first sysctl调用去向前兼容。

最后是 cpuidle,为了社会和谐,现代高功耗的 CPU 都有这个 idle 功能。一方面是在低功耗模式下,切换到普通模式由于本身这个操作是相当耗能的,所以在低功耗状态下会执行得很慢;另外这种切换有一个性能损失造成延迟...甚至 BFS 也没有解决这个问题。有人已经弄出一个 patch 解决问题(具体算法去看 LWN 原文),有可能会被合并到 2.6.32 里。

Topic: 技术