Linux内核定制优化配置.docx
《Linux内核定制优化配置.docx》由会员分享,可在线阅读,更多相关《Linux内核定制优化配置.docx(45页珍藏版)》请在冰豆网上搜索。
Linux内核定制优化配置
五、Linux内核裁减
(1)安装module-init-tools-3.0.tar.gz:
#tar-zxvfmodule-init-tools-3.0.tar.gz
#cdmodule-init-tools-3.0
#./configure--prefix=/sbin
#make
#makeinstall
#./generate-modprobe.conf/etc/modprobe.conf
这个脚本程序会读取原配置文件modules.conf的内容,经过格式转化后,生成新的配置文件/etc/modprobe.conf。
不知道为什么,我用module-init-tools-3.1时make出错。
如果改用3.0的就没事了。
(2)安装modutils-2.4.25-8.9.i386.rpm:
#rpm-Uvihmodutils-2.4.25-8.9.i386.rpm
对modutils进行升级。
-U,--upgrade=+upgradepackage(s)
(3)安装新内核:
将新内核copy到/usr/src下,
#tarxzvflinux-2.6.38.4.tar.gz-----解压缩.
II.将名为linux的符号链接删掉,这是旧版本内核的符号链接.
#ln-slinux-2.6.38.4linux------建立linux-2.6.38.4的符号链接linux.
(4)设置内核.
#cd/usr/src/linux
#makemrproper-----删除不必要的文件和目录.
#makemenuconfig生成一个.config文件
Linux内核的裁剪与编译看上去是个挺简单的过程。
只是对配置菜单的简单选择。
但是内核配置菜单本身结构庞大,内容复杂。
具体如何选择却难住了不少人。
因此熟悉与了解该菜单的各项具体含义就显得比较重要。
我们现在就对其作一些必要介绍:
Linux内核的编译菜单有好几个版本,运行:
1)makeconfig:
进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍。
2)makemenuconfig:
进入我们熟悉的menuconfig菜单,相信很多人对此都不陌生。
3)makexconfig:
在2.4.X以及以前版本中xconfig菜单是基于TCL/TK的图形库的。
所有内核配置菜单都是通过Config.in经由不同脚本解释器产生.config。
而目前刚刚推出的2.6.X内核用QT图形库。
由KConfig经由脚本解释器产生。
这两版本差别还挺大。
从我
个人角度就是爱用新东西。
2.6.X的xconfig菜单结构清晰,使用也更方便。
但基于目前2.4.X版本比较成熟,稳定,用的最多。
所以这里我还是以2.4.X版本为基础介绍相关裁剪内容。
同时因为xconfig界面比较友好,大家容易掌握。
但它却没有menuconfig菜单稳定。
有些人机器跑不起来。
所以考虑最大众化角度,我们以较稳定,且不够友好的menuconfig为主进行介绍,它会用了,Xconfig就没问题。
2.4.X版本xconfig配置菜单,2.4.X版本menuconfig配置菜单,2.6.X版本xconfig配置菜单分别如图4.1.4,4.1.5,4.1.6所示:
图4.1.42.4.menuconfig配置菜单
在选择相应的配置时,有三种选择方式,它们分别代表的含义如下:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
如果你是使用的是makexconfig,那使用鼠标就可以选择对应的选项。
这里使用的是make
menuconfig,所以需要使用空格键进行选取。
在每一个选项前都有一个括号,有的是中括
号有的是尖括号,还有圆括号。
用空格键选择时可以发现,中括号里要么是空,要么是"*",
而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者
则多一样选择,可以编译成模块。
而圆括号的内容是要你在所提供的几个选项中选择一项。
(注:
其中有不少选项是目标板开发人员加的,对于陌生选项,自己不知道该选什么时建议
使用默认值)
下面我们来看看具体配置菜单,进入内核所在目录,键入makemenuconfig你就会看到配
置菜单具有如下一些项:
内核编译选项
1、Generalsetup
代码成熟度选项,它又有子项:
1.1、promptfordevelopmentand/orincompletecode/drivers
该选项是对那些还在测试阶段的代码,驱动模块等的支持。
一般应该选这个选项,除非你只是想使用LINUX中已经完全稳定的东西。
但这样有时对系统性能影响挺大。
1.2、Cross-compilertoolprefix
交叉编译工具前缀,例如:
Cross-compilertoolprefix值为:
(arm-linux-)
1.3、Localversion-appendtokernelrelease
内核显示的版本信息,填入64字符以内的字符串,你在这里填上的字符口串可以用uname-a命令看到。
1.4、 Automaticallyappendversioninformationtotheversionstring
自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持
1.5、Kernelcompressionmode(Gzip)--->
有四个选项,这个选项是说内核镜像要用的压缩模式,回车一下,可以看到gzip,bzip2,lzma,lxo,一般可以按默认的gzip,如果要用bzip2,lzma,lxo要先装上支持
1.6、Supportforpagingofanonymousmemory(swap)
使用交换分区或交换文件来做为虚拟内存,一定要选上。
1.7、SystemVIPC
表示系统的进程间通信InterProcessCommunication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,必选。
1.8、POSIXMessageQueues
POSIX标准的消息队列,它同样是一种IPC。
建议你最好将它选上
1.9、BSDProcessAccounting
用户进程访问内核时将进程信息写入文件中。
通常主要包括进程的创建时间/创建者/内存占用等信息。
建议最好选上。
BSDProcessAccountingversion3fileformat
使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式。
1.11、Exporttask/processstatisticsthroughnetlink(EXPERIMENTAL)
通过netlink接口向用户空间导出任务/进程的统计信息,与BSDProcessAccounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的
Enableper-taskdelayaccounting(EXPERIMENTAL)
在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间
Enableextendedaccountingovertaskstats(EXPERIMENTAL)
在统计信息中包含扩展进程所花费的时间
1.12、Auditingsupport
审记支持,用于和内核的某些子模块同时工作,例如SecurityEnhancedLinux。
只有选择此项及它的子项,才能调用有关审记的系统调用。
1.13、Enablesystem-callauditingsupport
支持对系统调用的审计
1.14、IRQsubsystem--->
中断子系统
Supportsparseirqnumbering
<===支持稀有的中断编号,关闭
1.15、RCUSubsystem--->
非对称读写锁系统是一种高性能的kernel锁机制,适用于读多写少环境
RCUImplementation(Tree-basedhierarchicalRCU) --->
RCU实现机制Tree(X)Tree-basedhierarchicalRCU基本数按等级划分
EnabletracingforRCU
激活跟踪
(32)Tree-basedhierarchicalRCUfanoutvalue
基本数按等级划分分列值
Disabletree-basedhierarchicalRCUauto-balancing
1.16、<>Kernel.configsupport
这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中
1.17、(17)Kernellogbuffersize(16=>64KB,17=>128KB)
1.18、[]ControlGroupsupport--->
cgroups支持,文档资料,cgroups主要作用是给进程分组,并可以动态调控进程组的CPU占用率。
比如A进程分到apple组,给予20%CPU占用率,E进程分easy组,给予50%CPU占用率,最高100%。
我目前没有此类应用场景,用到时会选择将其编译进去。
1.19、-*-Namespacessupport--->
命名空间支持,允许服务器为不同的用户信息提供不同的用户名空间服务
[*]UTSnamespace
通用终端系统的命名空间。
它允许容器,比如Vservers利用UTS命名空间来为不同的服务器提供不同的UTS。
如果不清楚,选N。
[*]IPCnamespace
IPC命名空间,不确定可以不选
[*]Usernamespace(EXPERIMENTAL)
User命名空间,不确定可以不选
[*]PIDNamespaces
PID命名空间,不确定可以不选
[*]Networknamespace
1.20、Automaticprocessgroupscheduling
1.21、[]enabledeprecatedsysfsfeaturestosupportolduserspacetools
1.22、-*-Kernel->userspacerelaysupport(formerlyrelayfs)
在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口,我目前没有此类应用场景
1.23、[*]InitialRAMfilesystemandRAMdisk(initramfs/initrd)support
用于在真正内核装载前,做一些操作(俗称两阶段启动),比如加载module,mount一些非root分区,提供灾难恢复shell环境等,资料,我是期望直接从kernelimage直接启动,所以没选它
1.24、Initramfssourcefile(s)
initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白
1.25、Optimizeforsize
这个选项将在GCC命令后用“-Os”代替“-O2″参数,这样可以得到更小的内核。
没必要选。
选上了有时会产生错误的二进制代码。
1.26、[]Configurestandardkernelfeatures(forsmallsystems) --->
这个选项可以让内核的基本选项和设置无效或者扭曲。
这是用于特定环境中的,它允许“非标准”内核。
你要是选它,你一定要明白自己在干什么。
这是为了编译某些特殊用途的内核使用的,例如引导盘系统。
配置标准的内核特性(为小型系统)
1.27、[]Embeddedsystem
1.28、-*-Loadallsymbolsfordebugging/ksymoops
装载所有的调试符号表信息,仅供调试时选择
1.29、[]Includeallsymbolsinkallsyms
在kallsyms中包含内核知道的所有符号,内核将会增大300K
1.30、[*]Doanextrakallsymspass
除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项
1.31、-*-Kernelperformanceeventsandcounters//CPU性能监听器,包括CPU同一时间执行指令数,cachemiss数,分支预测失败次数(Branchmisprediction)。
调优其他程序时或许会用到,比如JVM
[]Debug:
usevmalloctobackperfmmap()buffers<===调试特性关闭
[]Kernelperformancecounters(oldconfigoption)
1.32、[*]Disableheaprandomization
禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它的实现方式有多种,可以由OS实现,也可以由运行库实现,如果你愿意,你也可以在一个栈中来实现一个堆)
1.33、ChooseSLABallocator(SLAB)--->
选择内存分配管理器(强烈推荐使用SLUB)
1.34、[*]Profilingsupport
不选
剖面支持,用一个工具来扫描和提供计算机的剖面图。
支持系统评测(对于大多数用户来说并不是必须的)
1.34、OProfilesystemprofiling
OProfile评测和性能监控工具
1.35、[]OProfilemultiplexingsupport(EXPERIMENTAL)
1.36、Kprobes
调试内核除非开发人员,否则不选
1.37、Optimizetracepointcallsites
1.38、GCOV-basedkernelprofiling
[]Enablegcov-basedkernelprofiling
2、[*]Enableloadablemodulesupport--->
[]Forcedmoduleloading
允许强制加载模块
[*]Moduleunloading
允许卸载已经加载的模块
[]Forcedmoduleunloading
允许强制卸载正在使用中的模块(比较危险)这个选项允许你强行卸除模块,即使内核认为这不安全。
内核将会立即移除模块,而不管是否有人在使用它(用rmmod-f命令)。
这主要是针对开发者和冲动的用户提供的功能。
如果不清楚,选N。
[*]Moduleversioningsupport
有时候,你需要编译模块。
选这项会添加一些版本信息,来给编译的模块提供独立的特性,以使不同的内核在使用同一模块时区别于它原有的模块。
这有时可能会有点用。
如果不清楚,选N。
允许使用其他内核版本的模块(可能会出问题)
[*]Sourcechecksumforallmodules
为所有的模块校验源码,如果你不是自己编写内核模块就不需要它
这个功能是为了防止你在编译模块时不小心更改了内核模块的源代码但忘记更改版本号而造成版本冲突。
如果不清楚,选N。
3、-*-Enabletheblocklayer--->
块设备支持,使用硬盘/USB/SCSI设备者必选这选项使得块设备可以从内核移除。
如果不选,那么blockdev文件将不可用,一些文件系统比如ext3将不可用。
这个选项会禁止SCSI字符设备和USB储存设备,如果它们使用不同的块设备。
选Y,除非你知道你不需要挂载硬盘和其他类似的设备。
不过此项无可选项
[*]Supportforlarge(2TB+)blockdevicesandfiles
仅在使用大于2TB的块设备时需要
-*-BlocklayerSGsupportv4
通用scsi块设备第4版支持
[]Blocklayerdataintegritysupport
块设备数据完整性支持
IOSchedulers--->
IO调度器I/O是输入输出带宽控制,主要针对硬盘,是核心的必须的东西。
这里提供了三个IO调度器。
<*>DeadlineI/Oscheduler
使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取
较多的环境(比如数据库)DeadlineI/O调度器简单而又紧密,在性能上和抢先式调度器不相上下,在一些数据调入时工作得更好。
至于在单进程I/O磁盘调度上,它的工作方式几乎和抢先式调度器相同,因此也是一个好的选择。
<*>CFQI/Oscheduler
使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以
认为是上述两种调度器的折中.适用于有大量进程的多用户系统CFQ调度器尝试为所有进程提供相同的带宽。
它将提供平等的工作环境,对于桌面系统很合适。
DefaultI/Oscheduler(CFQ)--->
默认IO调度器我这样理解上面三个IO调度器:
抢先式是传统的,它的原理是一有响应,就优先考虑调度。
如果你的硬盘此时在运行一项工作,它也会暂停下来先响应用户。
期限式则是:
所有的工作都有最终期限,在这之前必须完成。
当用户有响应时,它会根据自己的工作能否完成,来决定是否响应用户。
CFQ则是平均分配资源,不管你的响应多急,也不管它的工作量是多少,它都是平均分配,一视同仁的。
()Deadline
(X)CFQ
()No-op
4、Processortypeandfeatures--->
4.1.1、[]TicklessSystem(DynamicTicks)
非固定频率系统,这项技术能让新内核运行的更有效率,并且更省电
4.1.2、[]HighResolutionTimerSupport
支持高频率时间发生器,如果硬件不兼容,则这个选项只会增大内核(大多数个人PC并没有这个)
4.1.3、[*]Symmetricmulti-processingsupport
对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时 "EnhancedReal
TimeClockSupport"选项必须开启,"AdvancedPowerManagement"选项必须关闭
如果你选N,内核将会在单个或者多个CPU的机器上运行,但是只会使用一个CPU。
如果你选Y,内核可以在很多(但不是所有)单CPU的机器上运行,在这样的机器,你选N会使内核运行得更快。
注意如果你选Y,然后在Processorfamily选项中选择“586〃or“Pentium”,内核将不能运行在486构架的机器上。
同样的,多CPU的运行于PPro构架上的内核也无法在Pentium系列的板上运行。
4.1.4、EnableMPStable
mps多处理器规范,不选
4.15、[]SupportforbigSMPsystemswithmorethan8CPUs
4.16、[*]Supportforextended(non-PC)x86platforms
支持非pc,不选
4.17、[]AMDElan
4.18、[]MoorestownMIDplatform
4.19、RDCR-321xSoC
嵌入式相关
4.20、[]Supportnon-standard32-bitSMParchitectures
4.21、<>Eurobraille/Irispoweroffmodule
4.22.、[*]Single-depthWCHANoutput
跟proc相关的最好不要关
4.23、[]Paravirtualizedguestsupport--->
虚拟化客户端支持
4.24、[]Memtest
内存测试
4.25、Processorfamily(Pentium-Pro) --->
处理器系列,请按照你实际使用的CPU选择这里是处理器的类型。
这里的信息主要目的是用来优化。
为了让内核能够在所有X86构架的CPU上运行(虽然不是最佳速度),在这你可以选386。
内核不会运行在比你选的构架还要老的机器上。
比如,你选了Pentium构架来优化内核,它将不能在486构架上运行。
如果你不清楚,选386。
()386
()486
()586/K5/5x86/6x86/6x86MX
()Pentium-Classic
()Pentium-MMX
(X)Pentium-Pro
()Pentium-II/Celeron(pre-Coppermine)
()Pentium-III/Celeron(Coppermine)/Pentium-IIIXeon
()PentiumM
()Pentium-4/Celeron(P4-based)/Pentium-4M/olderXeon
()K6/K6-II/K6-III
()Athlon/Duron/K7
()Opteron/Athlon64/Hammer/K8
()Crusoe
()Efficeon
()Winchip-C6
()Winchip-2/Winchip-2A/Winchip-3
()GeodeGX1
()GeodeGX/LX
()CyrixIII/VIA-C3
()VIAC3-2(Nehemiah)
()VIAC7
()Core2/newerXeon
()IntelAtom
4.26、[*]Genericx86support不选
这一选项针对x86系列的CPU使用更多的常规优化。
如果你在上面一项选的是i386、i586
之类的才选这个通用x86支持,如果你的CPU能够在上述"Processorfamily"中找到就别选
除了对上面你选择的X86CPU进行优化,它还对更多类型X86CPU的进行优化。
这将会使内核在其他的X86CPU上运行得更好。
这个选项提供了对X86系列CPU最大的兼容性,用来支持一些少见的x86构架的CPU。
如果你的CPU能够在上面的列表中找到,就里就不用选了。
4.27、[*]HPETTimerSuppor