怎么在linux系统下面找到,对磁盘操作最多的进程,systemtap自带的例子disktop.stp,就能实现这个功能,在doc/systemtap/examples/io目录里面,运行一下看看stap -v disktop.stp,显示如下
由上图可以看出最繁忙的进程和磁盘了,贴一下代码,------后面为我写的备注
# Copyright (C) 2007 Oracle Corp.
#
# Get the status of reading/writing disk every 5 seconds,
# output top ten entries
#
# This is free software,GNU General Public License (GPL);
# either version 2, or (at your option) any later version.
#
# Usage:
# ./disktop.stp
#
global io_stat,device
global read_bytes,write_bytes
probe vfs.read.return {
if ($return>0) { ----vfs_read返回的为读取的字节书,这边表示读取的字节书大于0
if (devname!="N/A") {/*skip read from cache*/
io_stat[pid(),execname(),uid(),ppid(),"R"] += $return -----累计每个进程读取的字节数
device[pid(),execname(),uid(),ppid(),"R"] = devname
read_bytes += $return ------总的读取字节数
}
}
}
probe vfs.write.return {
if ($return>0) {
if (devname!="N/A") { /*skip update cache*/
io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
device[pid(),execname(),uid(),ppid(),"W"] = devname
write_bytes += $return
}
}
}
probe timer.ms(5000) { ----每5000ms操作一次
/* skip non-read/write disk */
if (read_bytes+write_bytes) {
printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
ctime(gettimeofday_s()),
"Average:", ((read_bytes+write_bytes)/1024)/5,
"Read:",read_bytes/1024,
"Write:",write_bytes/1024)
/* print header */
printf("%8s %8s %8s %25s %8s %4s %12s\n",
"UID","PID","PPID","CMD","DEVICE","T","BYTES")
}
/* print top ten I/O */
foreach ([process,cmd,userid,parent,action] in io_stat- limit 10) -----iostat-表示降序排序,limit表示取前10
printf("%8d %8d %8d %25s %8s %4s %12d\n",
userid,process,parent,cmd,
device[process,cmd,userid,parent,action],
action,io_stat[process,cmd,userid,parent,action])
/* clear data */
delete io_stat
delete device
read_bytes = 0
write_bytes = 0
}
probe end{
delete io_stat
delete device
delete read_bytes
delete write_bytes
}
有个疑问,上面的devname值从何而来,看一下tapset/vfs.stp,里面有一段
probe vfs.read.return = kernel.function("vfs_read").return
{
name = "vfs.read"
retstr = sprintf("%d", $return)
file = $file ---vfs_read传入的参数
pos = $pos ---vfs_read传入的参数
buf = $buf ---vfs_read传入的参数
bytes_to_read = $count ---vfs_read传入的参数
dev = __file_dev($file)
devname = __find_bdevname(dev, __file_bdev($file))
ino = __file_ino($file)
ret = $return
bytes_read = $return > 0 ? $return : 0
error = $return < 0 ? $return : 0
error_str = error ? errno_str(error) : ""
}
vfs_read函数原型ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
其实用stap -L 'kernel.function("vfs_read")就会把参数和返回值都列出来
这么简单的代码就把一个复杂的监控给实现了,systemtap真神器!
相关推荐
使用动态跟踪技术SystemTap监控Oracle和mysql性能——吕海波@美创科技.pdf
使用动态跟踪技术SystemTap监控Oracle和mysql性能——吕海波@美创科技
nginx-systemtap-toolkit 是一个基于 SystemTap 的实时 Nginx 分析和诊断工具。
systemtap是什么?如何通过systemtap对应用程序内核程序进行调试?如何编写运行systemtap脚本?
SystemTap_Beginners_Guide
很全面详细的讲解了systemtap脚本编写基础语法,很好的入门文档
systemtap script examples , cross compile from x86 to arm.
systemTap英文文档集合.7z
SystemTap_Beginners_Guide.pdf
systemtap交叉编译,运行于android平台。OMAP项目的实例,很有借鉴价值。
systemtap的入门指南,包含tracing/analysis/tapsets等,入门必备
systemtap_tutorial
Language Reference.pdf // 详细说明systemtap脚本的语法规则 Tapset Refernce Manual.pdf // 脚本库,详细说明每个function的功能 tutorial.pdf // systemtap 脚本初级教材,介绍脚本的一些用途 Beginners_Guide....
本文主要介绍在ubuntu平台 + 自定义内核上如何安装systemtap工具包及解决编译加载运行过程中的一些问题,如何利用systemtap工具监测分析内核函数,内核模块及用户态程序。
systemtap使用说明,英文版,包括简单用例,和实现方式,探测实现方式
SystemTap是一个全新的工具,但已经表现出了强大的功能和广泛的适用性。 SystemTap使得动态收集Linux内核信息和性能数据变得轻而易举,这就使人可以从繁琐的数据采集中解放出来,而专注于数据的处理和分析,这无疑 ...
学习Linux性能优化必不可少的工具sytemtap。想学习的同学可以下载。
用systemtap研究内核 用systemtap研究内核 用systemtap研究内核 用systemtap研究内核 用systemtap研究内核
linux 调试神器,linux 调试神器,linux 调试神器,linux 调试神器