最近前几天准备编译一下内核,无意中看到了《BFS 简介,Linux 桌面的极速未来?》,具体内容如下引用:
像以往一样,依然在不断编译新版 Linux kernel 内核——Linux 系统提速的必修课。和 Linux kernel BFS 的相遇充满了巧合下的必然。现在看来,BFS Kernel 是 Linux 在半年内给我的最大惊喜——系统像电视购物主持人一样充满了力量和激情!而且是人能感觉得到的快!特以此文献给系统编译狂人,桌面提速狂 Linux 控。向所有 Linux 桌面用户力顶 BFS。
最先在 Kindle 上看 xkcd 漫画,有漫画如是:
A: 经过某些人千百年的努力,最新的 Linux 补丁支持 4096 个 CPU 的电脑了!原来只能支持 1024 个!
B: 全屏 Flash 视频卡不卡啊?
A: 卡。不过谁他丫的看视频啊?而关于 BFS 的消息是最先在 Linux Magazine 上看到的;不久之后 G1 Android 手机 ROM 修改大神 CM 开始在他的测试版 CyanogenMod 使用 BFS 作为 kernel 的 Scheduler,试用之后发现手机系统速度明显加快。 用手滑动左右翻屏就像 Opera 下滚动网页那么平滑,搞得屏幕覆膜上多了好多指纹印。心痒已久,恰逢 Linux kernel 2.6.31 新版正式发布,打上 BFS Patch 编译,重启。神一样的提速再次出现在我 4 年高龄的笔记本电脑上,注入了鸡血的 KDE4 让人无比兴奋。快!快!快!
所以,BFS 是什么?
要知道 BFS 是什么最好先了解一下它的作者,传说中的澳洲猛士 CK。
CK,Con Kolivas,男, 澳大利亚中年男子,资深内核 hacker。众所周知,Linux Kernel 是聚集了一帮天才蠢才和暴君怪胎的地方,CK 貌似最适合这种地方的人。是真的貌似,一张电影里面典型高智商通缉犯的脸。
几年前编译 Linux kernel,ck 补丁集就是系统提速的代名词。当时编译内核的三部曲是下 kernel 源码,打上 ck 补丁集,编译安装。后来上游代码将 ck 补丁集稳定的部分不断吸收,它的影响力也渐渐消失。
CK 本身对任务调度有很深的造诣,他聪明而经典地实现了 fair scheduling,而实现模式被 Igor 借鉴改进最终写出了现在 kernel 用的进程调度管理器 CFS (Completely Fair Scheduler)。不得不顺便介绍一下任务调度。Kernel 的进程调度主要是将 CPU 资源分配给各种驱动、进程等等。你可能听说过,一般人的大脑使用率不足 20% 这种科学或者伪科学言论。但事实是,你电脑上的 CPU 从来就没有真正被 100% 的利用过(别跟我说你在资源管理器里面看到过 CPU 100%,我还见过 101% 呢)。如何将各种运算任务一刻不停又有条不紊的塞给 CPU 处理是一门严肃的科学,绝不是电视购物导购能解决的问题。一次塞的运算量少了,CPU 闲着,运算时间增长,电脑慢了;而一次塞的运算多了,CPU 忙不过来,运算又要在门口排队,电脑也慢了。进程调度主要是用算法解决这个问题,而现在 Linux Kernel 用的 CFS 据说非常经典,在不同情况下都可达到相当高的 CPU 利用率。而现用 CFS 也是在 2.6.23 才加入的,取代原来 O(1),直接将 Linux 桌面速度从 XX 时代带入了 XX+N 时代。
两年前,CK 淡出了内核开发,忽然从江湖中蒸发。几周前,CK 重出江湖,两年磨一剑,带来了 BFS ,全称 Brain Fuck Scheduler (只认识中间那个单词的请参考谷歌翻译),声称专为低端硬件设计(我的理解是不超过 10 个 CPU 的电脑电视手机游戏机都算低端机),说白了就是比 Kernel 默认要更加山崩地裂海枯石烂房价上涨油价飞升的快。BFS 为什么叫这个名字?为了中文用户,不能三个词让他们一个也不懂吧? 好吧,这名字有点不雅,不过算是直爽。对了,据说 CK 也是看到上面我提到的漫画才开始剑走偏锋。真正有几个人用有上千 CPU 的电脑呢?为什么要为这种扩展性牺牲桌面性能。BFS 就在其间做了取舍,仅仅支持最多 16 个 CPU ,把问题外沿做小,让算法更简单精悍高效。作为原理来讲,这足够解释速度的来源。对于其它废问题, CK 专门写了一个 FAQ。在可以预见的将来,BFS 也不会进入 mainline kernel,说白了是取向问题。
关键问题是怎么用?
下 2.6.31 的 kernel 源代码,如果你不知道在哪里下的话就不必往下看了,在当前历史时期您还是搞不定的。再去:http://ck.kolivas.org/patches/bfs/ 下第一个 patch,现在是 2.6.31 开头的,表示适用该版本。解压内核源码,打上 patch,配置以后编译安装。现在 BFS 还在测试期,没有完全成熟,但已经相当可用。编译的时候有什么需要配置的?不需要, Scheduler 这东西太底层了,打上补丁就把原来的 CFS 替换掉了,没什么选项给你选。如果你非要问的话,不就图个快么,记着把配置弄到 1000Hz,开 preempt ,禁掉 dynamic ticks。编译重启不用说了,我可以酷酷的扔下一个 have fun 然后去玩 Mac 了,反正你机器启动不了不要找我。虽然我纯净 kernel 单加 BFS Patch 编译成功启动没问题,依然有一位倒霉的推油编译以后不知道怎么折腾的无法启动。可另外被我忽悠成功的推友们反应一致:“快!人能感觉得到的快!”
到底值不值得上手 ,有没有评测?
这是某些不够剽悍的读者会挣扎到最后的问题。BFS 原理上讲,机器配置越低,感受会越明显。如果你非要评测的话,Phoronix 这个专业的 Linux 测评狂网站也出了一份。我可以提前剧透结论,区别都很小,BFS 胜出绝大部分测试,然而优势不明显。我只是补充一下绝大多数折腾过的人的感受
——快 !人能感觉到的快!
由此可见,BFS的作用还是比较大的,于是心血来潮,准备在编译内核的同时打上BFS补丁。又看到了《编译2.6.31内核兼打BFS补丁》,便决定开始编译。首先去下载了http://www.kernel.org下载了最新的Linux内核:linux-2.6.38.2(最新版已经是2.6.38.3了,Linux内核更新太快了),并到http://ck.kolivas.org/patches/bfs/下载了2.6.38.2-sched-bfs-400.patch。
结合《编译2.6.31内核兼打BFS补丁》开始编译内核:
cd ~/Desktop/ #用户应保证内核源码和BFS均在当前用户的桌面
cp linux-2.6.38.2.tar.bz2 /usr/src/kernels/ #把2.6.31内核拷贝到/usr/src/目录下
cd /usr/src/kernels/ #解压内核源码,并进入源码目录
tar -xvjf linux-2.6.38.2.tar.bz2
cd linux-2.6.38.32/
cp 2.6.38.2-sched-bfs-400.patch /usr/src/kernels/linux-2.6.38.2/ #将BFS补丁移动到源码目录
patch -p1 < 2.6.38.2-sched-bfs-400.patch #这条命令有问题,误导了我,已改正。将BFS补丁打入标准内核中,以便编译使用(如果没有patch这个命令请yum install patch)
#** 以下内容为编译内核的通用步骤,在编译其它内核时可借鉴** #
make mrproper #清除以前编译产生的文件,新下过来的可以跳过,安全期间再做一次
make menuconfig #配置内核参数
cp .config /home/config #将配置文件备份,以供后用
#make bzImage #生成内核
#make modules #生成内核模块
make #如今编译新内核以上两步已被废除,简化为make
make modules_install install #自动initrd文件,自动安装内核模块以及修改启动文件menu.lst等,
chmod 755 /boot/vmlinuz-2.6.38.2 #修改权限,使其可以被运行(使用默认权限可能导致无法启动问题)
vim /boot/grub/menu.lst #查看启动文件,确认启动配置
ls -l /boot/ #确认内核文件及权限。
之后重启,黑屏了!进入文本模式,发现配置内核时没有把ext4格式支持模块添加,导致系统提示“未知文件系统ext4”!看来配置内核时务必不能心急,而且要有充足的时间配置和检查,切记切记!换回原来的内核,发现之前安装的歪打正着的显卡驱动也停止工作!只好重装系统,规范的安装显卡驱动,再按照此方法重新编译内核,才算成功!
注:使用此内核后,请使用文本模式进入系统并安装Nvidia公版驱动,yum版在此版本内核中不可用,切记切记!
发表评论