IO相关

ioblock.request--没有参数,当产生IO请求时出发

ioblock.end--没有参数,在1个IO块请求transfer后出发

ioblock_trace.request--对bio产生一个IO请求时触发

ioblock_trace.end--IO块传输完毕后触发

vfs.read

vfs.write

例1

io/eatmydata.stp

禁止fsync/fdatasync调用

# stap -g eatmydata.stp -c 'strace ls || true'

global dummy_fd =1 #stdout,也可通过stap -G dummy_fd=xxx覆盖此设置

global guilt,agony,piety

probe syscall.fsync, syscall.fdatasync {

#实际上我们无法禁止调用这两个函数,但可以通过改变其fd间接达到这一效果

if( pid() == target()) {

try {

$fd = dummy_fd

guilt ++

} catch {

agnoy ++

}

}

else

piety ++

}

probe syscall.fsync.return, syscall.fdatasync.return {

#在函数调用返回时覆盖其返回状态

if (pid() == target())

try {$return =0} catch{}

}

probe begin {

printf("redirecting f*sync by pid %d to fd %d\n", target(), dummy_fd)

}

probe error,end {

printf("redirected  f*sync by pid %d to fd %d, success %d times, failed %d times.\n", target(),dummy_fd,guilt,agnoy)

printf("preserved f*sync by other processes %d times.\n", piety)

}

注:target()用于返回进程id,通常和-x PID或-c CMD一起使用

例2

io/inodewatch.stp

检测设备的读写

stap inodewatch.stp 0x08 0x01 100 -c "sleep 0.2"

#! /usr/bin/env stap

probe vfs.write, vfs.read

{

# dev and ino are defined by vfs.write and vfs.read

if (dev == MKDEV($1,$2)  && ino == $3)

printf ("%s(%d) %s 0x%x/%u\n", execname(), pid(), probefunc(), dev, ino)

}

例3

io/iodevstats.stp

按读写数据量列举设备名

# stap iodevstats.stp -c "sleep 0.2"

#! /usr/bin/env stap

global reads, writes, totals

global vfs.read.return {

if($return > 0) {

reads[execname(),dev] <<

totals[execname(),dev] += $retrun

}

}

global vfs.write.return {

if($return > 0) {

writes[execname(),dev] <<

totals[execname(),dev] += $return

}

}

probe end {

printf("\n%16s %8s %8s %8s %8s %8s %8s %8s\n","", "", "", "read", "read", "", "write", "write")

printf("%16s %8s %8s %8s %8s %8s %8s %8s\n","name", "device", "read", "KB tot", "B avg", "write", "KB tot", "B avg")

foreach([name,dev] in totals- limit 20) {

printf("%16s %3d, %4d %8d %8d %8d %8d %8d %8d\n",name, MAJOR(dev), MINOR(dev),

@count(reads[name,dev]),(@count(reads[name,dev]) ? @sum(reads[name,dev])>>10 : 0 ),(@count(reads[name,dev]) ? @avg(reads[name,dev]) : 0 ),

@count(writes[name,dev]),(@count(writes[name,dev]) ? @sum(writes[name,dev])>>10 : 0 ),(@count(writes[name,dev]) ? @avg(writes[name,dev]) : 0 ))

}

}

例4

io/ioblktime.stp

IO请求在队列的等待时间,如果系统当前IO过于繁忙可能会超过maxmapentries设置,调用时可指定参数-DMAXMAPENTRIES=10000

# stap ioblktime.stp -c "sleep 0.2"

#! /usr/bin/env stap

global req_time, etimes

probe ioblock.request {

req_time[$bio] = gettimeofday_us()

}

probe ioblock.end {

t = gettimeofday_us()

s = req_time[$bio]

delete req_time[$bio] --如果系统IO繁忙则req_time数组会很大,因此每次处理完都将其释放

if (s) {

etimes[devname, bio_rw_str(rw)] <

}

}

/* for time being delete things that get merged with others */

probe kernel.trace("block_bio_frontmerge"),kernel.trace("block_bio_backmerge")

{

delete req_time[$bio]

}

probe timer.s(10), end {

ansi_clear_screen()

printf("%10s %3s %10s %10s %10s\n","device", "rw", "total (us)", "count", "avg (us)")

foreach ([dev,rw] in etimes - limit 20) {

printf("%10s %3s %10d %10d %10d\n", dev, rw, @sum(etimes[dev,rw]), @count(etimes[dev,rw]), @avg(etimes[dev,rw]))

}

delete etimes

}

例5

io/disktop.stp

每5秒总结IO读写信息,包括平均每秒读写KB数量以及调用次数排名前10的进程

# stap disktop.stp -c "sleep 0.2"

global readbytes,writebytes

global io_stat,device

probe vfs.read.return {

if ($return > 0) {

if (devname != "N/A" ) { /* 跳过cache read */

io_stat[pid(),execname(),uid(),ppid(),"R"] += $return

device[pid(),execname(),uid(),ppid(),"R"] = devname

readbytes += $return

}

}

}

--vfs.write.return处理逻辑类似

probe vfs.write.return {

if($return > 0) {

if(devname != "N/A") {/*跳过cache write*/

io_stat[pid(),execname(),uid(),ppid(),"W"] += $return

device[pid(),execname(),uid(),ppid(),"W"] += devname

writebytes += $return

}

}

}

probe timer.ms(5000) {--每5秒调用一次

if ( readbytes + writebytes ) {

printf("%-25s,%4dKb/sec,%6dKb,%6dkb\n",ctime(gettimeofday_s()),(readbytes+writebytes)/5,readbytes/1024,writebytes/1024)

}

foreach ([process,cmd,userid,parent,action] in io_stat- limit 10) /* 打印前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])

--删除数组

delete io_stat

delete device

read_bytes = 0

write_bytes = 0

}

probe end{

delete io_stat

delete device

delete read_bytes

delete write_bytes

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-762765/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15480802/viewspace-762765/

stap监控IO脚本相关推荐

  1. Linux日常运维管理技巧(一)监控系统状态、监控网卡流量、监控IO性能、查看系统进程、查看网络状态、Linux下抓包tcpdump、Linux网络相关、DNS配置

    目录 监控系统状态 监控网卡流量 监控IO性能 查看系统进程 查看网络状态 Linux下抓包 Linux网络相关 监控系统状态 w/uptime查看系统负载 [root@zyshanlinux-01 ...

  2. 10.6监控io性能10.7free命令10.8ps命令10.9查看网络状态10.10linux抓包

    10.6 监控io性能 iostat -x 查看磁盘使用情况有一个非常重要的指标%util,这个值越大说明硬盘被占用的越多 iotop命令需要安装 iotop也是一个动态的显示,关注 IO这一列 10 ...

  3. 监控io性能,free命令,ps网络命令,查看网络状态,Linux下抓包

    10.6 监控io性能 磁盘的io是一个非常重要的指标,所以要更详细的查看磁盘状态,需要用到iostat命令,如果之前已经安装了sysstat包的话,在安装sysstat包时iostat命令就已经被安 ...

  4. 监控io性能, free命令, ps命令, 查看网络状态, linux下抓包

    2019独角兽企业重金招聘Python工程师标准>>> 监控io性能 free命令 ps命令 查看网络状态 linux下抓包 --- 监控io性能 查看磁盘 iostat 和sar属 ...

  5. 通用前端监控采集脚本

    https://github.com/saijs/sai.js 概述 整体上,前端监控包含很多方面,例如包括: JavaScript 异常监控 敏感信息监控 DOM 合法性检查 静态资源监控 网站监控 ...

  6. python监控进程状态_python监控进程脚本

    本文实例为大家分享了python监控进程脚本的具体代码,供大家参考,具体内容如下 原理: 监控一个指定进程,每隔5秒钟获取其CPU.内存使用量超过60%即kill掉该进程,获取其句柄数,超过300也k ...

  7. mysql主从同步监控小脚本(加强版)

    mysql主从同步监控小脚本(加强版): 新版本脚本增加了"当发现同步出现无法同步的时候"会自动提取主库的file号,以及pos,进行同步主库,脚本内容如下: #!/bin/sh ...

  8. linux 监控mysql脚本_Linux系统MySQL主从同步监控shell脚本

    操作系统:CentOS系统 目的:定时监控MySQL数据库主从是否同步,如果不同步,记录故障时间,并执行命令使主从恢复同步状态 1.创建脚本文件 vi /home/crontab/check_mysq ...

  9. Lvs别样的自动部署监控shell脚本

    Lvs别样的自动部署监控shell脚本   l 脚本功能: l 实验环境图: l 具体脚本: l 结果验证: l 参考资料: 先申明,本文现在已经在我公司的测试环境和生产测试环境使用.正式环境请用ke ...

  10. linux下怎么监控网络 io swap,监控io性能,free命令,ps命令,查看网络状态,linux下抓包...

    监控io性能 [root@localhost ~]# iostat Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月12日 _x ...

最新文章

  1. Linux系统性能分析: CPU
  2. ORACLE 体系结构知识总结
  3. JavaScript语言基础10
  4. Android 拉伸四周空白,中间内容不变的9Patch
  5. Android去掉顶部的阴影
  6. 所谓 jQuery 插件,怎样开发一个 jQuery 插件
  7. 大前端晋级系列之-策略模式
  8. 让“云”无处不在-Citrix Xenserver之三 license server
  9. python工具栏消失_[Python自学] PyQT5-菜单栏、工具栏、状态栏
  10. 微信APP支付(基于Java实现微信APP支付)
  11. SAP License:SAP Business One系统功能
  12. Linux:20个linux常用命令
  13. EasyClick 调用javaMD5加密
  14. 用HTML简单制作一个网页
  15. 美团获得小样本学习榜单FewCLUE第一!Prompt Learning+自训练实战
  16. 密度计算机公式,相对密度计算公式
  17. 只会写代码的程序员不是好程序员
  18. 5700:还钱问题(贪心+思维)
  19. 物联卡套餐该如何选择
  20. 递归算法实例应用(五)

热门文章

  1. php mysql上机题_基于PHP+MySQL的题库管理系统
  2. SQL Server 触发器
  3. 渐渐热起来的网盘搜索工具
  4. windows脱壳复习
  5. FOXIT PDF EDITOR工具分割PDF
  6. CNC数控加工中心编程好学吗
  7. 服务器自定义怪,GOM引擎自定义怪物appr代码计算方法和公式
  8. EDEM后处理导出颗粒信息
  9. 全开源!Office多人协作应用,在线编辑Word、Excel和PPT文档
  10. 用C++开发的双人对战五子棋