SystemTap 是一种新颖的 Linux 内核确诊东西,供给了一种从运转中的 Linux 内核快速和安全地获取信息的才干。SystemTap 是内核开发人员和体系管理员的福音,由于这使得他们能够经过编写或许重用简略的脚原本搜集内核的实时数据,而不需求再忍耐修正源码、编译内核、重启体系的绵长折磨。本文介绍了 SystemTap 的装置、运用和根本原理,并用一些风趣的比如提醒了 SystemTap 供给的强壮才干。
在 SystemTap 呈现之前,关于 Linux 程序员或许体系管理员而言,调试内核往往是一场噩梦。例如,你置疑传递给体系调用 read 的参数 fd 出了问题,想把它打印出来,你需求做的是:首要得到一份内核源码,找到 sys_read() 的函数体中刺进 printk() 句子,接下来从头编译内核,然后用新的内核从头发动体系。谢天谢地,你总算看到了你想要看到的东西,不过你立刻会发现遇到了一个新的费事:除非从头发动体系到原本的内核,printk() 会无休止地打印下去。
SystemTap 的意图便是要把人们从这种泥潭中解救出来。SystemTap 供给了一个简略的指令行接口和强壮的脚本言语,一起预界说了丰厚的脚本库。根据内核中的 kprobe,SystemTap答应你自由地从运转中的内核无害地搜集调试信息和功用数据,来用于之后的剖析和处理。你能够随时开端或许间断这种搜集进程,而无需绵长的修正代码、编译内核和重启体系的凄惨循环。SystemTap 使得上面的问题变得简略了,简略得只需求一条指令就能够做到:
stap -e ‘probe syscall.read { printf(fd = %d\n,fd) }
SystemTap的功用和Sun的DTrace和IBM的dprobe东西类似。可是和它们不同的是, SystemTap是遵从GPL的开源软件项目。它的呈现使得Linux社区也具有了功用强壮而且易于运用的动态内核调试东西。现在,SystemTap 的首要开发成员来自于RedHat、IBM、Intel和Hitachi,其间还包含来自IBM我国开发中心的工程师。
装置SystemTap
在装置SystemTap之前,需求保证体系中现已装置了其它两个软件包:
kernel-debuginfo RPM:SystemTap需求经过内核调试信息来定位内核函数和变量的方位。关于一般的发行版,并没有装置kernel-debuginfo RPM,咱们能够到发行版的下载站点下载。关于我的ThinkPad上的Fedora Core 6,这个地址是: http://download.fedora.redhat.com/pub/fedora/linux/core/6/i386/debug/
elfutils RPM:SystemTap需求elfutils软件包供给的库函数来剖析调试信息。现在的SystemTap要求装置elfutils-0.123以上版别。现在最新的版别是0.124-0.1。假如需求,咱们能够从SystemTap的站点下载RPM或许源码来晋级。下载地址是: ftp://sources.redhat.com/pub/SystemTap/elfutils/i386/
接下来就能够装置SystemTap了,这有经过RPM或许源码装置两种方法:
1. 经过RPM装置 Fedora Core 6缺省情况下现已装置了systemtap。假如没有,也能够从如下的地址下载: http://download.fedora.redhat.com/pub/fedora/linux/
core/updates/testing/6/i386/SystemTap-0.5.10-1.fc6.i386.rpm
2.经过源码装置:
从SystemTap的FTP站点下载最新的源码
ftp://sources.redhat.com/pub/SystemTap/snapshots/SystemTap-20061104.tar.bz2
然后装置如下:
/root > tar -jxf SystemTap-20061104.tar.bz2/root > cd src/root/src> ./configure/root/src> make/root/src> make install
运转SystemTap
运转SystemTap首要需求root权限。
运转SystemTap有三种方式:
1. 从文件(一般以.stp作为文件名后缀)中读入并运转脚本:stap [选项] 文件名
2. 从规范输入中读入并运转脚本: stap [选项] –
3. 运转指令行中的脚本:stap [选项] -e 脚本
4.直接运转脚本文件(需求可执行特点而且榜首行加上#!/usr/bin/stap):./脚本文件名运用Ctrl+C间断SystemTap的运转。
systemtap的选项还在不断的扩展和更新中,其间最常用的选项包含:
-v — 打印中心信息
-p NUM — 运转完Pass Num后间断(缺省是运转到Pass 5)
-k — 运转完毕后保存临时文件不删去
-b — 运用RelayFS文件体系来将数据从内核空间传输到用户空间
-M — 仅当运用-b选项时有用,运转完毕时不兼并每个CPU的独自数据文件
-o FILE — 输出到文件,而不是输出到规范输出
-c CMD — 发动勘探后,运转CMD指令,直到指令完毕后退出
-g — 选用guru形式,答应脚本中嵌入C句子
其它更多选项请参看stap的手册。
SystemTap的语法
咱们运用一个简略的systemtap脚原本介绍一下SystemTap的语法:
#!/usr/local/bin/stapglobal countfunction report(stat) {printf(stat=%d\n, stat)}probe kernel.function(sys_read) {++count}probe end {report()}
勘探点(probe):每个systemtap脚本中至少需求界说一个勘探点,也便是指定了在内核的什么方位进行勘探。勘探点称号后边紧跟的一组大括号内界说了每次内核运转到该勘探点时需求运转的操作,这些操作完成后再回来勘探点,持续下面的指令。这儿给出了systemtap现在支撑的一切勘探点类型。
全局变量(global):用来界说全局变量。单个勘探点函数体中运用的局部变量不需求预先界说,可是假如一个变量需求在多个勘探点函数体中运用,则需求界说为全局变量。
函数(function):用来界说勘探点函数体中需求用到的函数。除了能够用脚本言语界说函数以外,还能够用C言语来界说函数,仅仅这时函数名后边的大括号对需求换成%{ %}。例如,前面的report()函数能够写成:function report(stat) %{_stp_printf(stat=%d\n, THIS->stat);%}
SystemTap的比如
了解了SystemTap的根本用法,下面让咱们来看几个风趣的比如。
计算当时体系中调用最多的前10个体系调用
在进行功用剖析的时分,咱们常常需求知道那些函数调用次数最多,才干有的放矢地打开剖析。下面这个简略的比如能够打印出在曩昔的5秒钟里调用次数最多的那些体系调用。