技术解析
作为 Gentoo 用户,闲着没事就是编译系统。 但是编译一些大包的时候比如 chromium/web-kit 这种,CPU 全满,桌面应用就开始有卡顿情况。如果再开个 Android Studio 跑个模拟器就更明显,模拟器里面滚动掉帧明显。
这时候就想找个办法解决这个问题。 make.conf 的 PORTAGE_NICENESS=10,没什么用处。 尝试使用 cgroup 限制 portage 编译使用的 CPU 资源,也不是很满意。 按照下文配置,基本没觉出什么限制效果,可能是我配置的还不对。 https://gist.github.com/moschlar/70d9a8375b86cd4d83dd
因为一直使用的是官方的 gentoo-sources,然后想起好久没用 ck-sources 了。为桌面系统设计的内核调度器,N 年前用的时候,还不算稳定。 作者 Con Kolivas 是澳大利亚的一个麻醉医师,曾经是 Linux 内核团队一员,后来发生内讧,自己退团做调度器,怒称自己调度器为为脑残调度器 (BFS, Brain Fuck Scheduler) https://zh.wikipedia.org/zh-cn/%E5%BA%B7%E6%81%A9%C2%B7%E7%A7%91%E9%87%8C%E7%93%A6%E6%96%AF
看了下最新的 CPU 调度器已经进化为 MuQSS,IO 调度器为 BFQ。
安装配置参考各发行版文档,不说了。配置完成后,确认下自己的调度器已经生效。 注意 4.10 版的 ck-sources 有 bug,直接用 4.11 或者以上的吧。
$ dmesg | grep -i muqss
...
MuQSS CPU scheduler v0.120 by Con Kolivas.
cat /sys/block/sda/queue/scheduler
最后说下最重要的,就是使用效果,我认为是 99%的完美。
在绝大多数场景下,系统非常流畅。没什么负载的时候,和其它内核没什么差别。 重点是在大负载编译场景下,桌面应用比如浏览器操作、Android 模拟器,反应迅速,跟空闲时差不多,比官方内核改进非常显著。
说下 1%不完美的时候,有时负载达到极限的时候,系统会出现严重的卡顿,鼠标不动,键盘也没反映。我碰到的几次场景都是一边编译一边用 Android Studio 和模拟器(基于 kvm ),没有死机,等待几秒,系统会自行恢复。运行 dmesg,会输出很多与 kvm 相关的错误信息。至于啥情况会触发,是不是只有用 kvm 功能的时候才出现,我也说不准。
可能是 MuQSS 跟 kvm 用到的 cgroup cpu limit 功能有冲突?
MuQSS patched kernels and systemd It is a common mistake to think that MuQSS does not support cgroups. It does but not all the cgroup features (e.g. CPU limiting will not work).
结论,如果你是 Linux 桌面用户,特别有大负载操作影响桌面流畅度的情况,ck-sources 非常值得尝试一下。