+ -
当前位置:首页 → 问答吧 → 玩命式编译内核

玩命式编译内核

时间:2008-11-19

来源:互联网

常言影响系统效能最大的主要是四方面:

1. kernel
2. glibc
3. Xorg 自身
4. X 的桌面环境

当中以内核最见效,可是 kernel developer 为求稳定,默认是用 -O2 来编译的,也可以选择用 -Os 来取得较少的体积,大家可有想过用 -O3 来怎样呢?

其实是可以的,不过要分两个步骤进行:

1. 按照正常方式编译及安装内核一次,把所有相关的东西(包括模组)如常安装便行

2. 清空源码树重新再来一次,但要用 -O3,必需在 make 之前修改 Makefile。可是完全用 -O3 编译是无法完成的,因为模组的建立不能继续下去
PHP 代码:
  CC      arch/x86/boot/video.o
  CC      arch/x86/boot/video-mode.o
  CC      arch/x86/boot/version.o
  CC      arch/x86/boot/apm.o
  CC      arch/x86/boot/video-vga.o
  CC      arch/x86/boot/video-vesa.o
  CC      arch/x86/boot/video-bios.o
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  OBJCOPY arch/x86/boot/vmlinux.bin
  HOSTCC  arch/x86/boot/tools/build
  BUILD   arch/x86/boot/bzImage
Root device is (8, 6)
Setup is 11676 bytes (padded to 11776 bytes).
System is 2302 kB
CRC 3ffd8126
Kernel: arch/x86/boot/bzImage is ready  (#1)
  Building modules, stage 2.
  MODPOST 558 modules
ERROR: "__bad_udelay" [drivers/net/tokenring/tms380tr.ko] undefined!
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2

real    25m0.900s
user    22m28.258s
sys     1m26.889s
d00m3d@BlackMesa:~/BLFS-sources/linux-2.6.27.6$ 
但这不要紧,因为模组在前面经已装好,最重要是这句话
代码:
Kernel: arch/x86/boot/bzImage is ready (#1)
说明内核的映像已准备好了,那麽只要跳过 make modules_install 一步,把按手册方式把它及 System.map 再拷一次到 /boot 里便行。也就是说,系统内核是由 -O3 编译出来的,模组却是第一次正常编译由 -O2 得出来的

现在有了 kexec-tools,http://www.linuxsir.org/bbs/thread335331.html

连重启都不用,马上可以测试新内核了。如无意外,应该一切正常"起动",模块加载也不会出问题,我不知用哪些软件做 benchmarking 好,但改用 -O3 为我带来的只有喜悦,系统突然精神数倍,反应奇佳,太棒了!

吾为求提升系统效能,不择手段,牺牲稳定性在所不计,(其实系统已运作多天也未见任何不稳定),不喜者请勿仿效!

作者: d00m3d   发布时间: 2008-11-19

试一下 openoffice 和 mplayer 吧。

作者: linux001   发布时间: 2008-11-19

Mark一下,等我 LFS 好了再试一下.

作者: qufo   发布时间: 2008-11-19

d00m3d 斑竹您确定采用-O3能提速?

个人在您的提示下尝试清空源码树修改Makefile,将其中的-O2改为-O3
可以编译模块,没有提示错误(或许这个在28内核中改进了没出错?)

察看了bzImage体积增大了点(原先用-Os出来的是1.3M,用-O3出来的是1.7M)
可速度方面好像没什么提升

或许我感觉不对

作者: goodstarting   发布时间: 2008-11-26

如果真的在意性能,可以用icc(Intel® C++ Compiler) 來做lfs 或者用icc 來編譯内核來提升性能
http://www.linuxfromscratch.org/hint...c-compiler.txt

作者: RTL   发布时间: 2008-11-26

引用:
作者: RTL
如果真的在意性能,可以用icc(Intel® C++ Compiler) 來做lfs 或者用icc 來編譯内核來提升性能
http://www.linuxfromscratch.org/hint...c-compiler.txt
可是 icc 再牛都是无法将俺的 CPU 潜能尽量发挥,俺用的是 Sempron64 及 Athlon64。。。。

作者: d00m3d   发布时间: 2008-11-26

引用:
作者: goodstarting
d00m3d 斑竹您确定采用-O3能提速?

个人在您的提示下尝试清空源码树修改Makefile,将其中的-O2改为-O3
可以编译模块,没有提示错误(或许这个在28内核中改进了没出错?)

察看了bzImage体积增大了点(原先用-Os出来的是1.3M,用-O3出来的是1.7M)
可速度方面好像没什么提升

或许我感觉不对
没数据说话就是说不清,编译 lmbench 死活通不过,linpack 又没有 Fortran 来跑,Java 版又只有源码,系统却没有 JDK。。。唉!

最近看这个 http://www.phoronix-test-suite.com/,似乎不错。

作者: d00m3d   发布时间: 2008-11-26

引用:
作者: RTL
如果真的在意性能,可以用icc(Intel® C++ Compiler) 來做lfs 或者用icc 來編譯内核來提升性能
http://www.linuxfromscratch.org/hint...c-compiler.txt

看了一下,要钱的。。。
我一穷学生,400美元还是消费不起。。。

作者: goodstarting   发布时间: 2008-11-26

引用:
作者: d00m3d
没数据说话就是说不清,编译 lmbench 死活通不过,linpack 又没有 Fortran 来跑,Java 版又只有源码,系统却没有 JDK。。。唉!

最近看这个 http://www.phoronix-test-suite.com/,似乎不错。

d00m3d版主加油
等待您的数据

作者: goodstarting   发布时间: 2008-11-26

引用:
作者: d00m3d
可是 icc 再牛都是无法将俺的 CPU 潜能尽量发挥,俺用的是 Sempron64 及 Athlon64。。。。
自己写驱动程序来优化内核算了。Linux下的驱动并不很难写,不过要有硬件手册做对照:)

作者: ti8er   发布时间: 2008-11-26

引用:
作者: ti8er
自己写驱动程序来优化内核算了。Linux下的驱动并不很难写,不过要有硬件手册做对照:)
如何写?愿闻其详。。。

作者: d00m3d   发布时间: 2008-11-26

引用:
作者: d00m3d
如何写?愿闻其详。。。
硬件驱动无非是给硬件的端口写入相应的东西,然后硬件就会工作,然后从另一个端口得到东西。

Linux下之所以驱动比Windows好编,是因为它把所有的硬件都看成文件来对待,一个fopen()函数就可以万能地读写所有的文件,也可以读写所有的硬件,非常地统一。

我以前在学校时用汇编语言和C写过一段驱动,用来让二极管和喇叭工作的,比较简单,其实可以当作是初级的显卡和声卡驱动了。不过很久没动了,都退化了。现在我只知道相关的大原理,只能纸上谈兵,自己可写不来了,呵呵。

至于CPU优化,大体上就是给内核增加相应的CPU指令,这个好像是在内核的CPU头文件那里定义的,可以在那个地方把缺的指令加上就可以了。要是熟练的话也可以自己写CPU驱动出来,然后编译到内核中。

毁灭兄那么牛,应该能搞定的。我现在不行啦

作者: ti8er   发布时间: 2008-11-27

昨天回家试了一下-O3编译,内核比-O2增加了0.1M,速度的话,因为没有测试,所以目前感觉不出来。

作者: qufo   发布时间: 2008-11-27

引用:
作者: goodstarting
d00m3d 斑竹您确定采用-O3能提速?

个人在您的提示下尝试清空源码树修改Makefile,将其中的-O2改为-O3
可以编译模块,没有提示错误(或许这个在28内核中改进了没出错?)

察看了bzImage体积增大了点(原先用-Os出来的是1.3M,用-O3出来的是1.7M)
可速度方面好像没什么提升

或许我感觉不对
gentoo上面说在gcc4.0以后o3的效果并不大。
http://www.gentoo.org/doc/en/gcc-optimization.xml

In 3.x, -O3 has been shown to lead to marginally faster execution times over -O2, but this is no longer the case with gcc 4.x. Compiling all your packages with -O3 will result in larger binaries that require more memory, and will significantly increase the odds of compilation failure or unexpected program behavior (including errors). The downsides outweigh the benefits; remember the principle of diminishing returns. Using -O3 is not recommended for gcc 4.x.

作者: hritian   发布时间: 2008-11-27

引用:
作者: hritian
gentoo上面说在gcc4.0以后o3的效果并不大。
http://www.gentoo.org/doc/en/gcc-optimization.xml

In 3.x, -O3 has been shown to lead to marginally faster execution times over -O2, but this is no longer the case with gcc 4.x. Compiling all your packages with -O3 will result in larger binaries that require more memory, and will significantly increase the odds of compilation failure or unexpected program behavior (including errors). The downsides outweigh the benefits; remember the principle of diminishing returns. Using -O3 is not recommended for gcc 4.x.
我的内核是 2.9M
我还以为比起 40M来说很小了,没想到还搞成 1.x M,
无所谓,我内存多,费得起。

作者: qufo   发布时间: 2008-11-27

引用:
作者: hritian
gentoo上面说在gcc4.0以后o3的效果并不大。
http://www.gentoo.org/doc/en/gcc-optimization.xml

In 3.x, -O3 has been shown to lead to marginally faster execution times over -O2, but this is no longer the case with gcc 4.x. Compiling all your packages with -O3 will result in larger binaries that require more memory, and will significantly increase the odds of compilation failure or unexpected program behavior (including errors). The downsides outweigh the benefits; remember the principle of diminishing returns. Using -O3 is not recommended for gcc 4.x.
效果的大小属个人理解而矣,近日测试 2.6.28-rc6、rc7 及 rc7-git7 都能直接通过-O3 了,可惜用 gcc-4.4 的 snapshot 仍然有问题

至於数据,我用 scimark2 对比过,-O3 的内核的确要比 -O2 快,数据待我整理好後再贴出来

作者: d00m3d   发布时间: 2008-12-14

http://gcc.gnu.org/ml/gcc/2004-03/msg00634.html

大家用这个例子试一下,O2和O3的性能差异还是比较大的,
当然,这个例子是针对浮点数的。

作者: trublemaker   发布时间: 2008-12-14

引用:
作者: d00m3d
效果的大小属个人理解而矣,近日测试 2.6.28-rc6、rc7 及 rc7-git7 都能直接通过-O3 了,可惜用 gcc-4.4 的 snapshot 仍然有问题

至於数据,我用 scimark2 对比过,-O3 的内核的确要比 -O2 快,数据待我整理好後再贴出来


相当期待测试数据。

不过我最近测服务器的数据来看,我倒是觉得glibc的编译优化效果很好,内核优化倒是没看到什么很明显的效果。

作者: hritian   发布时间: 2008-12-16

lz就好像在玩F1,速度快,过瘾,不过很容易撞车,汽车也很容易出故障~

作者: shooter   发布时间: 2008-12-19

引用:
作者: hritian
相当期待测试数据。

不过我最近测服务器的数据来看,我倒是觉得glibc的编译优化效果很好,内核优化倒是没看到什么很明显的效果。
这是 linux-2.6.28rc6 内核利用不同的优化编译後由 SciMark2 C-version 的数据,以标准测试为例,两者平均值相差大概是 1.85 MFlops(百万次浮点运算),实际运作大概於 0.1-0.2 秒之间,不容易察觉,所以跑一些比较消耗资源的软件便明显一些

刚看一下 top500,今天的超级太 BT 了,IBM 的 Roadrunner 已超越 PFlops (1000 TFlops) 之谱,偶的老机子连 GFlops 都不到 :(

Btw,中国也可以引以为敖,上海超级电脑在最新 Top500 排名现时第十位

http://www.top500.org/list/2008/11/100
上传的图像
SciMark2-Benchmarking.pdf (54.2 KB, 46 次查看)

作者: d00m3d   发布时间: 2008-12-20

引用:
作者: shooter
lz就好像在玩F1,速度快,过瘾,不过很容易撞车,汽车也很容易出故障~
现在 2.6.28-rc 已能直用 -O3 通过,已能不算玩命了,现在要用 gcc-4.4 的 snapshot 来寻找死亡快感,。。。X-Game!

作者: d00m3d   发布时间: 2008-12-20

用O3编译了之后,glxgears测显卡性能,
从3000到了3300,
默认的内核编译是Os,太保守了。

作者: trublemaker   发布时间: 2009-01-07

不如直接这样:
make HOSTCC="gcc -march=<cpu类型> -O3 -tracer " CC=" gcc -march=<cpu类型> -O3 -tracer"

作者: kangtian   发布时间: 2009-01-07

对了,,,Inel T2300的处理器在内核编译(2。6。28)的时候可以选择core2那项不?

作者: zengjingpku   发布时间: 2009-01-12

好象不行,arch/x86/Makefile 里面有说明。

好像可以先用默认的编译bzImage

然后加上优化编译modules

作者: trublemaker   发布时间: 2009-01-12

收藏,以备使用~~~~

作者: strangk   发布时间: 2009-01-12

引用:
作者: trublemaker
用O3编译了之后,glxgears测显卡性能,
从3000到了3300,
默认的内核编译是Os,太保守了。
默认是选上 optimize for size 才是 Os,否则仍是 O2 的

作者: d00m3d   发布时间: 2009-01-20

今天 gcc 更新到 gcc-4.4-20090116,内核更新为 2.6.28.1

一件令人兴奋的事终於发生了,不但 gcc-4.4 的 snapshot 能通过,而且用 -O2 及 -O3 都能通过,gcc-4.4 的效能比 gcc-4.3.2 更棒,爽死了!

作者: d00m3d   发布时间: 2009-01-20

不是吧....
还好gcc还没编译,改之...

作者: goodstarting   发布时间: 2009-01-20

引用:
作者: goodstarting
不是吧....
还好gcc还没编译,改之...
兄弟在做 LFS 系统吧,不要随便乱改啊!

原因:
1. gcc-4.4 现在还在开发阶段,bug 又多,而且也有很多软件未能通过编译

2. 我的系统里有几版 gcc,可随意切换,http://www.linuxsir.org/bbs/thread329026.html

我在玩命,兄弟请勿跟随!

作者: d00m3d   发布时间: 2009-01-20

o(∩_∩)o...我也在玩命

老大的帖子可是经常拜读的....

作者: goodstarting   发布时间: 2009-01-20

吾为求提升系统效能,不择手段,牺牲稳定性在所不计,(其实系统已运作多天也未见任何不稳定),


哈哈 喜欢这样的

作者: SuperL   发布时间: 2009-02-04

我的系统除了toolchain外都是用-o3编译的,其实就是用jhalfs中的优化选项,我全打开了,感觉还可以,没有什么速度上的特别的感觉

作者: qdog988   发布时间: 2009-02-05

老大,有空试试这个- finit, 5秒登陆到桌面,很不错。

http://helllabs.org/finit/

作者: leasor   发布时间: 2009-02-05

记号
强贴留念

在嵌入式中很有用

作者: sinanjj   发布时间: 2009-04-10

似乎还有更激进的 FLAGS 可玩,不过玩在暂时没时间钻研

作者: d00m3d   发布时间: 2009-04-10

对于64位的机子,我用的是gcc-4.4,使用-O3参数并没有报错!

作者: zpcat   发布时间: 2009-09-13

考古贴, 鉴定完毕.

装LFS6.4时, 我毫不犹豫的选择了当时最新的gcc-4.4.0, 虽然和手册不一致.

在用的过程中, 确实有一些软件需要小修一下才能编译成功.
比方说今天编译的stardict-3.0.1

不加入几个#include <stdio.h>是不能编译成功的...

作者: swordhui   发布时间: 2009-09-14

热门下载

更多