(2)用systemTap定位bug
systemtap 属于probe类的定位工具,它能对内核或用户代码的指定位置进行probe,当执行到指定位置或访问指定位置的数据时,用户定义的probe函数自动执行,可打印出该位置的调用堆栈,参数值,变量值等信息。 systemtap选择进行probe的位置很灵活,这是systemtap的强大功能所在。Systemtap的probe点可包括如下几个方面:
- 内核中全部系统调用,内核及模块中全部函数的入口或出口点
- 自定义的定时器probe点
- 内核中任意指定的代码或数据访问位置
- 特定用户进程中任意制定的代码或数据访问位置
- 各个功能子系统预先设置的若干probe点,如tcp,udp,nfs,signal各子系统都预先设置了很多探测点
systemTap的脚本用stap脚本语言来编写,脚本代码中调用stap提供的API进行统计,打印数据等工作,关于stap语言提供的API函数,参考 “#> man stapfuncs”。 关于systemTap的功能和使用可参考 “#> man stap”, “#> man stapprobes”
(3)ftrace
ftrace 是linux内核中利用tracepoints基础设施实现的事件追踪机制,它的作用在于能比较清楚的给出在一定时间内系统或进程所执行的活动,如函数调用路径,进程切换流等。Ftrace可用于观察系统各部分的latency,以便进行实时应用的优化;它也可以通过记录一段时间内的内核活动来帮助故障定位。如用以下方法可trace某个进程在一端时间的函数调用情况
#>echo “function”>/sys/kernel/debug/tracing/current_tracer
#>echo “xxx”>/sys/kernel/debug/tracing/set_ftrace_pid
#>echo 1>/sys/kernel/debug/tracing/tracing_enabled
除tracing函数调用外,ftrace还可tracing系统的进程切换,唤醒,块设备访问,内核数据结构分配等活动。注意,tracing和profile是不同的,tracing记录的是一段时间内的全部活动,而不是统计信息,用户可以通过/sys/kernel/debug/tracing下的buffer_size_kb设置缓冲区的大小,以记录更长时间的数据。
关于ftrace的具体使用可参考内核源码Documenation/trace下的内容
(4)oprofile 和 perf
oprofile和perf都是对系统进行profile(抽样,统计)的工具,它们主要用来解决系统和应用的性能问题。perf功能更强大,更全面,同时perf的用户空间工具和内核源码一起维护和发布,让用户能及时的享受perf内核新增加的特征。Perf 是在RHEL6中才有,RHEL5中没有Perf。Oprofile和perf 都使用现代CPU中具有的硬件计数器进行统计工作,但perf还可以使用内核中定义的 “software counter”及 “trace points”, 所以能做更多的工作。Oprofile的抽样工作利用 CPU的NMI中断来进行,而perf既可以利用NMI中断也可利用硬件计数器提供的周期性中断。用户能很容易用perf来oprofile一个进程或系统的执行时间分布,如
#>perf top -f 1000 -p
还可以利用系统定义的 “software counter”和各子系统的 “trace points” 对子系统进行分析,如
#>perf stat -a -e kmem:mm_page_alloc -e kmem:mm_page_free_direct -e kmem:mm_pagevec_free sleep 6
能统计6秒内kmem子系统的活动(这一点实际是利用ftrace提供的tracepoints来实现)
我认为有了perf,用户就没必要使用oprofile了
5、用kdump工具内核故障定位实例
A)部署Kdump
部署 kdump 收集故障信息的步骤如下:
(1)设置好相关的内核启动参数
在 /boot/grub/menu.lst 中加入如下内容
crashkernel=128M@16Mnmi_watchdog=1