零、需求介绍
须要使用PAPI得到硬件级的数据,即与微指令相关的数据,比如L1/L2cachemiss、TLBmiss、Cycle等,而PAPI须要perfctr(Performance-monitoringcounterssupport)模块的支持,而Linux内核当中默认没有perfctr模块,但是perfctr只在个别内核上被支持,它实际上是内核的一个补丁,须要重新编译内核,打上补丁能够在内核上运行perfctr模块。更多信息参考papi和perfctr的INSTALL文件。
一、环境介绍
Intel(R)Xeon(R)CPU,X86_64平台;
化学机
CentOSrelease5.4(Final)
内核版本是2.6.18-164.el5-x86_64
查看内核、平台等信息#uname-aLinuxgc04vm132.6.18-164.el5#1SMPThuSep303:28:30EDT2009x86_64x86_64x86_64GNU/Linux查看操作系统版本#cat/etc/issueCentOSrelease5.4(Final)查看CPU信息cat/proc/cpuinfo|grepname|cut-f2-d:|uniq-c1Intel(R)Xeon(R)CPUE5520@2.27GHz
二、准备工作
(i)下载papi,可以在上下载各个版本的papi,这儿下载papi-3.6.0。
papi中包含了perfctr,用户不须要单独下载perfctr,(其实也可以单独下载,网址是~mikpe/linux/perfctr),这儿选择2.6版本的perfctr。
解压papi,阅读papi-3.6.0/src/perfctr-2.6.x目录下的INSTALL文件,上面提到“该版本的perfctr适用于如下版本的Linux内核:在papi-3.6.0/src/perfctr-2.6.x/patches目录下,若存在patch-kernel-*补丁,说明适用于*版本的Linux内核,我们选择2.6.19版本的linux内核。
注意:PERFCTR的版本并不是和linux内核版本相对应的,例如ompi自带的perfctr-2.6.x可适用于好多版本的linux内核,比如2.4.26版本的内核。
(ii)下载linux-2.6.19.tar.bz2,在网站上可以下载任何版本的linux内核。
通常情况下,当前内核版本是x.y.***版本的话,编译的新内核版本最好也是x.y.***版本,比如不要从2.4.x升级到2.6.x,由于二者差别比较大,通常[主].[次]版本号相同的内核可以顺利升级。
(iii)认真看完perfctr的INSTALL文件,上面详尽说明了安装步骤和测试。
三、安装步骤
(1)解压内核
bzip2-dlinux-2.6.19.tar.bz2
tarxvflinux-2.6.19.tar
生成linux-2.6.19目录
(2)复制内核到/usr/src目录下
cp-rlinux-2.6.19/usr/src/
(3)解压papi到目录/opt下,
tarzxvfpapi-3.6.0.tar.gz
cppapi-3.6.0/opt/
(4)
cd/usr/src/linux-2.6.19
makemrproper
(5)在内核目录下执行update-kernel
cd/usr/src/linux-2.6.19
/opt/papi-3.6.0/src/perfctr-2.6.x/update-kernel
若内核版本有问题则出现如下信息
Error:nosuitablepatchfoundforkernel2.6.19zkl-perfctr
Seeperfctr-2.6.x/patches/forsupportedkernelversions,
可以查看perfctr-2.6.x/patches/下支持的内核版本。
(6)该步骤可以跳过,也可以这样做
拷贝原有内核的.config到当前内核目录下
cd/usr/src/linux-2.6.19
cp/usr/src/kernels/2.6.18-164.el5-x86_64/.config.
(7)配置选择内核模块
cd/usr/src/linux-2.6.19
makemenuconfig
选择模块:
查看perfctr-2.6.x目录下的INSTALL文件,它有如下这种内容,其意思是说必须选择这样几个模块:
(i)Loadablemodulesupport选项下linux开发培训,通常默认即可,这个模块的功能是帮助系统可以动态加载模块。
(ii)Processortypeandfeatures选项下的Performance-monitoringcounterssupport(即PERFCTR),
这个必须选择,笔者做实验认为应当将PERFCTR选择为(M),其子项均选择为*,将它编译成可动态加载的模块,请按如下方法选择。
注意:
我在做实验时,最开始将PERFCTR选择为*,将其编译进内核,最后安装完毕,仍然不能执行perfectr的实例,查看系统目录/lib/modules/'uname-r'/drivers下也没有perfectr模块,使用lsmod不能查看到perfctr模块,既然编译进了内核,应当能看见的,不知啥缘由?更不能使用命令modprobeperfctr加载模块(由于不是以动态加载模块的方式加载的),可能与没有将PERFCTR模块设置为M有关。
内核模块选择操作方法:
选择模块是按Y会出现*,按M会出现M,按N可以取消选择。也可以按空格键从*切换到无,为小写M(键下小写M)表示编译成可动态加载的模块,*表示编译步入内核。
(iii)内核支持APIC
据悉必须保证内核支持APIC(AdvancedProgrammableInterruptController中级可编程中断控制器),这是由于前面papi要使用linux系统镜像下载,所以请保证选中了APIC相关项,可以按"/",之后键入APIClinux内核版本 选择,搜索以下与之相关的模块是否选择了,这个模块实际上在在Processortypeandfeatures选项下,模块选择完毕,可以使用命令grepPIC/usr/src/linux-2.6.19/.config查看apic是否选择,选择了的话应当显示CONFIG_X86_GOOD_APIC=y等字样,papi的INSTALL文件中说到“SMP(多核,对称多处理器)上默认选择了该项,然而UP(单处理器)上默认没选择”。
----------------------------------------------------------------------------------------
以下摘自perfctr的INSTALL文件
Youshouldeitherconfigurewithmodules(CONFIG_MODULES=y)ANDmodule
versions(CONFIG_MODVERSIONS=y),orcompletelywithoutmodules
(CONFIG_MODULES=n).Moduleswithoutmoduleversionsisaninherently
unsafeconfigurationwhichisnotrecommended.
Loadablemodulesupport选项
YoushouldalsoenableatleastCONFIG_PERFCTR,CONFIG_PERFCTR_VIRTUAL,
andCONFIG_PERFCTR_GLOBAL.
Processortypeandfeatures选项下的Performance-monitoringcounterssupport(即PERFCTR)选项下的所有选项都选中
YoumayalsoselectCONFIG_PERFCTR=mtobuildthebulkofthedriver(或则设为M,编译成动态加载的模块)
asaloadablekernelmodule;themodulewillbenamed`perfctr'.
Note:Theperfctrkernelpatchaddsonewordtothe`thread_struct'
type,whichmakesthepatchedkernelbinaryincompatiblewithan
unpatchedone.Thisiswhyitisimportanttodistinguishthepatched
kernelviaEXTRAVERSIONandCONFIG_MODVERSIONS.
----------------------------------------------------------------------------------------
(7)更改/usr/src/linux-2.6.19/Makefile,加上扩充版本号,对该内核给一个标记,
EXTRAVERSION=-zkl-perfctr
这样做以后,您编译内核完成后,你的内核版本就是linux-2.6.19-zkl-perfctr
(8)编译内核
第一种做法=================================================================================
#makeclean
#makevmlinuxmodules动作完成后在/usr/src/linux-2.6.19/下生成了模块相关文件,比如在drivers中有好多相关文件
#makemodules_install安装模块,此命令会借助里面在/usr/src/linux-2.6.19/下生成的模块相关文件,对它们进行编译,在系统目录/lib/modules/2.6.19-zkl-perfctr下生成模块,比如可以在drivers中见到perfctr模块
#makebzImage编译生成内核文件,/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
#makeinstall执行此命令必须保证之前生成了内核文件bzImage
sh/usr/src/linux-2.6.19/arch/x86_64/boot/install.sh2.6.19-zkl-perfctrarch/x86_64/boot/bzImageSystem.map"/boot"
此命令等同于第二种方式中的(e),只不过使用makeinstall命令会手动完成e中的几种动作,实现内核多重启动
=====================================================================================
或则
第二种做法
===============================================================================
(a)makeclean将之前生成的.o文件删掉掉,这样不会形成新旧版本的偏差
(b)makebzImage
命令执行成功将提示如下信息,在/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
Rootdeviceis(8,3)
Bootsector512bytes.
Setupis7252bytes.
Systemis1794kB
Kernel:arch/x86_64/boot/bzImageisready(#1)
(c)makemodules制做出模块相关的文件
(d)makemodules_install安装模块
(e)实现内核多重启动
cp/usr/src/linux-2.6.19/arch/x86_64/boot/bzImage(表示一条命令太长了,换行)
>/boot/vmlinux-2.6.19-zkl-perfctr
cp/usr/src/linux-2.6.19/System.map
>/boot/System.map-2.6.19-zkl-perfctr
自动生成initrd-2.6.19-zkl-perfctr.img文件到/boot目录下:
cd/usr/src/linux-2.6.19
[root@gc04vm13linux-2.6.19]#mkinitrd/boot/initrd-2.6.19zkl-perfctr.img2.6.19-zkl-perfctr(注意内核是2.6.19-zkl-perfctr,这是由于上面更改了Makefile中的版本扩充号,该命令将在/boot目录下生成initrd-2.6.19zkl-perfctr.img文件)
编辑系统内核启动文件
vim/boot/grub/menu.lst
#grub.confgeneratedbyanaconda
#
#Notethatyoudonothavetorerungrubaftermakingchangestothisfile
#NOTICE:Youhavea/bootpartition.Thismeansthat
#allkernelandinitrdpathsarerelativeto/boot/,eg.
#root(hd0,0)
#kernel/vmlinuz-versionroroot=/dev/VolGroup00/LogVol00
#initrd/initrd-version.img
#boot=/dev/sda
default=0#对应到第一个title
timeout=10#系统内核选择时的延后
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
titleCentOS(2.6.18-164.el5)
root(hd0,0)
kernel/vmlinuz-2.6.18-164.el5roroot=/dev/VolGroup00/LogVol00
initrd/initrd-2.6.18-164.el5.img
##加上以下启动新内核的句子
titleCentOS(2.6.19-zkl-perfctr)
root(hd0,0)
kernel/vmlinuz-2.6.19-zkl-perfctrroroot=/dev/VolGroup00/LogVol00#这是表示内核文件是/boot/vmlinux-2.6.19-zkl-perfctr
initrd/initrd-2.6.19-zkl-perfctr.img#这是上面生成的文件/boot/initrd-2.6.19zkl-perfctr.img
=================================================================================
(10)重新启动系统,
在启动菜单上将会出现两个内核选项,使用上下按键选择新内核启动
或则
将新内核设置为默认启动内核,即更改里面文件中default=1
(11)系统重启后,可以使用命令查看perfctr模块是否安装上,
#modprobeperfctr加载模块
lsmod显示模块
rmmodperfctr移除模块
若perfctr模块安装成功后,你将见到perfctr模块,但是你可以在/lib/modules/2.6.19-zkl-perfctr/kernel/drivers/perfctr中见到perfctr模块perfctr.ko
(12)编译安装perfctr,
#cd/opt/papi-3.6.0/src/perfctr-2.6.x
#make
#mknod/dev/perfctrc10108
#chmod644/dev/perfctr
#makePREFIX=/usr/localinstall
至此,安装全部完成,perfctr相关文件安装再/usr/local下的bin、include、lib下
(13)测试
测试perfctr-2.6.x下边的事例,出现结果,证明安装perfctr安装成功
[root@gc04vm13perfctr-2.6.x]#examples/global/global
PerfCtrInfo:
abi_version0x05010501
driver_version2.6.32DEBUG
cpu_type5(?)
cpu_features0x7(rdpmc,rdtsc,pcint)
cpu_khz2259879
tsc_to_cpu_mult1
cpu_nrctrs0
cpus[0],total:1
cpus_forbidden[],total:0
cputype5(?)notsupported
不支持,这是由于以上步骤我是在VMware虚拟机中完成的,换成化学机就没问题linux内核版本 选择,正常情况下是运行后每隔5秒刷现一次
viewplaincopytoclipboardprint?
涉及的命令:cp-rpapi-3.6.0/opt/cplinux-2.6.20.tar.gz/usr/src/kernelscd/usr/src/kernelstarzxvflinux-2.6.20.tar.gzcdlinux-2.6.20#makeclean#makemrproper/opt/papi-3.6.0/src/perfctr-2.6.x/update-kernelcp当前内核目录/.config.makemenuconfig做如下选择:(1)Processortypeandfeatures选项下的Performance-monitoringcounterssupport,即要支持硬件计数器(2)搜索APIC选项,查看是否早已选上y,没有则选上(也可以在退出menuconfig后使用grepAPIC.config查询APIC相关选项是否是y)退出menuconfig,保存。makemodulesmakemodules_installmakebzImagemakeinstall完毕后选择新内核重新启动新内核启动后modprobeperfctrlsmod|grepperfctrcd/opt/papi-3.6.0/src/perfctr-2.6.x/makeexamples/perfex-iexamples/global/global检查perfctr是否能正常运行,若出现错误,重启系统mknod/dev/perfctrc10108chmod644/dev/perfctrmakePREFIX=/usr/localinstall将perfctr的头文件、库、可执行命令安装到/usr/local下