stap监控IO脚本「建议收藏」

stap监控IO脚本「建议收藏」IO相关ioblock.request–没有参数,当产生IO请求时出发ioblock.end–没有参数,在1个IO块请求transfer后出发ioblock_trace.request–对bio产生一个IO请求时触发iob…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234856.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【已解决】MySQL Connector Net 卸载不了问题?

    【已解决】MySQL Connector Net 卸载不了问题?今天mysql出现了一些问题,想要全部卸载重新安装,控制面板中右键卸载,发现MySQLConnectorNet无法卸载。百度上搜索发现回答都是复制粘贴,千篇一律,都是检查C盘文件是否删除干净,还有就是注册表是否删除干净;使用这些方法均不能完成卸载,重装mysql。不断搜索发现一方法可行进行分享:1.微软的支持里面有一个Fixproblemsthatblockprogramsfrombeinginstalledorremoved,链接https://support.micros

    2022年7月25日
    47
  • 图解springmvc 执行流程

    图解springmvc 执行流程核心对象DispatcherServlet核心控制器负责请求,响应,数据的分发。HandlerMapping处理器映射器,负责到controller中,找到对应的方法,返回给核心控制器。HandleAdapter处理适配器,将handle找到的方法执行,执行结果,即ModelAndView数据和视图返回给核心控制器。HttpMessageConvertor消息转换器,数据类型的转换,如日期…ViewResolver视图解析器,核心控制器调度视图解析器,视图解析器,返回视图。核心控制

    2022年6月28日
    28
  • 无人机指挥系统中标价_云睿智能无人机

    无人机指挥系统中标价_云睿智能无人机为什么大规模数字孪生很重要?Geopipe数据如何独特地使开发人员能够构建创新的空间产品?犹他大学的一个跨学科团队为无人机系统(UnmannedAerialSystems,UAS)…

    2022年8月15日
    3
  • 越权访问漏洞总结

    越权访问漏洞总结一、平行越权攻击者请求操作(增删改查)某条数据时,web应用程序没有判断该条数据的所属人,或者在判断数据所属人时直接从用户提交的表单参数中获取,例如用户id等,导致攻击者可以自行修改参数,操作获取不属于自己的数据。测试方法:在发送请求时观察请求参数,尝试修改用户id或者其他参数验证是否能查看不属于自己的数据,进行增删改查,若成功则存在平行越权的漏洞。 二、纵向越权和平行越权相似…

    2022年6月17日
    35
  • windows loader激活工具怎么用_ubuntu双系统开机没有选项

    windows loader激活工具怎么用_ubuntu双系统开机没有选项Readme1.Recovery2.Genuinestatus3.Questionsandanswers4.UEFImotherboards5.Checksums6.Changes7.Arguments8.Extra##################################################################…

    2022年10月12日
    0
  • 锂电池充电IC_锂电池充电器电路

    锂电池充电IC_锂电池充电器电路HE4484E是一款5VUSB适配器输入,高精度双节锂离子电池充电管理芯片。具有0V充电功能,涓流充电、恒流充电、恒压充电和自动截止、自动再充等一套完整充电循环的充电管理芯片。芯片内部特设9V抗浪涌,芯片应用更安全可靠。HE4484E标准浮充电压为8.40V,其底部带有散热片接地的ESOP8封装,极其精简的外部器件,使得HE4484E成为便携式双节锂锂电池充电应用的理想选择。HE4484E适合USB适配器或其它5V适配器工作,极大降低了外部配件成本。当输入电压(USB电源或AC适配器)被拿掉时,HE4484

    2022年10月6日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号