Stap 程序是SystemTap 工具的前端,它接受使用脚本语言编写的探测指令(probing instructions) ,翻译成C 代码,并将C 代码编译成内核模块,接着将模块加载到内核,最后内核执行脚本里请求的系统跟踪和探测函数。你可从标准输入或命令行参数向stap 提供脚本文件。程序运行直至用户中断,或者遇到大量的软件错误,或者脚本自动调用exit() 函数。
tap 命令完成下述的工作:
翻译脚本
生成C 代码并编译成内核模块
加载模块到内核,输出到stap 的stdout
CTRL-C 卸载内核模块和终止stap
关于stap 命令的所有选项列表,请参阅stap(1) 的用户手册。
下面代码示例演示了SystemTap 探针使用。
[root@BL480-64 ~]#vi test_dir.stp
probe kernel.function("sys_mkdir").call { printf ("mkdir enter\n") }
probe kernel.function("sys_mkdir").return { printf ("mkdir exit\n") }
保存退出。
[root@BL480-64 ~]#stap test_dir.stp
重新打开一个会话窗口:
[root@BL480-64 ~]#mkdir test1
运行输出:
mkdir enter
mkdir exit
从脚本中能体现,在系统命令mkdir的入口和出口添加两个探针,只要执行mkdir命令,就会调用两个探针函数。
实际应用SystemTap脚本
1、通过监控脚本(linuxsysperl)或系统命令(top、vmstat、iostat等)检查系统状态
如果出现系统资源使用过多,进入分析流程,使用find命令举例:find / -name sys*。
2、使用topexe.stp脚本,列出linux系统5秒钟20个系统调用最高的应用
脚本如下:
[root@BL480-64 jinyz]# more topexe.stp
#! /usr/bin/env stap
#
# This script continuously lists the top 20 systemcalls in the interval
# 5 seconds
#
global syscalls_count
probe syscall.* {
syscalls_count[execname()]++
}
function print_systop () {
printf ("%25s %10s\n", "SYSCALL", "COUNT")
foreach (syscall in syscalls_count- limit 20) {
printf("%25s %10d\n", syscall, syscalls_count[syscall])
}
delete syscalls_count
}
probe timer.s(5) {
print_systop ()
printf("--------------------------------------------------------------\n")
}