Linux下IO监控分析详解:系统层+进程层+业务层+文件层IO看~下面经典图片来自LinuxPerformanceandTuningGuidelines.pdf各种IO监控工具在LinuxIO架构中的位置1、系统级IO监控1.1、iostatiostat-xdm1#个人习惯%util代表磁盘的繁忙程度.100%表示磁盘忙,0%表示磁盘空闲。但请注意,磁盘繁忙并不意味着磁盘(带宽)利用率高。argrq-sz向驱动层提交的IO请求大小一般不小于4K,不大于max(readahead_kb,max_sectors_kb),可以用来判断当前IO模式,尤其是磁盘繁忙的时候,值越大代表顺序,值越小代表一个随机svctmIO请求的服务时间。对于单个磁盘,完全随机读取时,基本在7ms左右,即seek+rotationdelaytime1.2,每次统计关系volume%util=(r/s+w/s)*svctm/1000#排队长度=到达率*平均服务时间avgrq-sz=(rMB/s+wMB/s)*2048/(r/s+w/s)#2048为1M/5121.3。iostat统计的汇总是通用块层合并后直接提交给设备的IO数据(rrqm/s,wrqm/s),可以反映系统整体的IO状态,但是它有以下两个缺点:远离业务层,不对应代码中的write和read(由于系统预读+pagecache+IO调度算法等因素,也很难对应)是系统层面的,也没有办法准确到流程。比如它只能告诉你磁盘很忙,但是没有办法告诉你谁在忙,什么在忙?2、进程级IO监控2.1、iotop和pidstat(仅限rhel6u系列)iotop,顾名思义,io版本的toppidstat,顾名思义,统计进程的stat(pid),自然就是进程的stat包括进程IO状态两条命令,这两条命令都可以按进程统计IO状态,所以可以知道:1)当前系统中有哪些进程在占用IO,百分比是多少?2)Occupation是IO进程读?还是写作?读写量是多少?pidstat参数有很多,介绍几个比较常用的:pidstat-d1#OnlydisplayIOpidstat-u-r-d-t1#-dIOinformation,#-rPagemissingandMemoryinformation#-uCPUusage#-t以thread为统计单位#1每1秒统计一次iotop很简单,输入命令2.2即可,block_dump、iodump、iotop和pidstat都依赖于/proc/pid/io文件导出的统计信息,这个不适用于较旧的内核,例如rhel5u2。所以,我们只好改用上面两条命令:echo1>/proc/sys/vm/block_dump#Enableblock_dump,此时io信息会输入到dmesg中#dmesgwatch-n1"dmesg-c|grep-oP"w+(d+):(WRITE|READ)"|sort|uniq-c"#Non-stopdmesg-cecho0>/proc/sys/vm/block_dump#不使用时关闭2.3.总结从进程级IO监控我们可以看出:系统级IO监控无法回答的两个问题,离业务层比较近(比如可以统计进程的读写量),但是有没办法和业务层的读写对接。同时粒度比较粗,没办法知道当前进程读写了哪些文件?耗时?尺寸?3、业务级IO监控3.1、ioprofileioprofile命令本质上就是lsof+strace,ioprofile可以解决以下三个问题:文件(读、写)?读写次数是多少?(读取、写入调用)读取和写入了多少数据?(读、写字节)3.2。Example假设某个行为会触发程序的一个IO动作,例如:"AclickonapageleadstoreadingA,B,andCfilesinthebackground"./io_event#假设模拟一个IO行为,readA文件一次,B文件500次,C文件500次ioprofile-p`pidofio_event`-ccount#读写次数ioprofile-p`pidofio_event`-ctimes#读写耗时ioprofile-p`pidofio_event`-csizes#读写大小注意:ioprofile只支持多线程程序,不支持单线程程序。对于单线程程序的IO业务层面的分析,strace就足够了。3.3.总结ioprofile本质上是strace,可以看到read和write的调用痕迹,可以在业务层做io分析。4、文件级IO监控文件级IO监控可以配合/补充“业务级和进程级”的IO分析。文件级IO分析主要针对单个文件,检查当前有哪些进程在对文件进行读写操作。lsoforls/proc/pid/fdinodewatch.stp4.1,lsof查看当前文件是哪些进程打开的lsof../io#io目录当前是bash和lsof两个进程打开的lsof命令只能查看静态信息,而"open"不一定是"reading",对于cat和echo这样的命令,opening和reading是瞬时的,lsof很难抓到4.2,inodewatch.stp可以用inodewatch.stp补stapinodewatch.stpmajorminorinode#majordevicenumber,auxiliaryDevicenumber,文件inode节点号stapinodewatch.stp0xfd0x00523170#主设备号,次设备号,inode号,可以通过stat命令获取
