当前位置: 首页 > 科技观察

一篇排查IO问题

时间:2023-03-19 19:08:51 科技观察

和后台IO性能检测的文章,只要工具齐全,按照套路排查还是比较容易的。2.一般步骤2.1预览IO性能是否有问题。首先使用top命令查看wa的CPU占用率是否高。如果高,则需要查看是哪个进程导致了IO问题,是否合理。一般来说,习惯上使用df-h和df-ih来查看磁盘空间是否已满,inode节点是否已满。iostat执行一般的磁盘性能观察,如下:[root@localhost~]#iostat-x-d1Linux4.18.0-348.2.1.el8_5.x86_64(localhost.localdomain)December07,2021_x86_64_(8CPU)Devicer/sw/srkB/swkB/srrqm/swrqm/s%rrqm%wrqmr_awaitw_awaitaqu-szrareq-szwareq-szsvctm%utilsda5.811.22309.14101.030.080.371.3923.4519.393.880.1253.2182.554.623.25scd00.030.000.700.000.000.000.000.009.970.000.0026.240.0010.150.03scd10.010.000.000.000.000.000.000.000.220.000.000.170.000.890.00dm-05.561.53290.2377.200.000.000.000.0019.871.720.1152.1650.334.513.20dm-10.070.001.490.000.000.000.000.000.880.000.0022.650.000.890.01解释:r/s:每秒发送到这个磁盘的合并读请求数w/s:每秒发送到这个磁盘的合并写请求数。rkB/s:每秒从磁盘读取的数据量,以KB为单位。wkB/s:每秒写入此磁盘的数据量,单位为KB。rrqm/s:每秒合并的读请求数;加上%标识合并的读取请求的百分比。wrqm/s:每秒合并的写请求数;加上%标识合并的写入请求的百分比。r_await:每次读请求的平均处理时间,单位ms,包括排队时间和磁盘实际处理时间。w_await:每次写请求的平均处理时间,单位ms,包括排队时间和磁盘实际处理时间。aqu-sz:平均请求队列长度rareq-sz:平均读请求大小,单位为KB。wareq-sz:平均写入请求大小,以KB为单位。svctm:处理IO请求的平均时间,不包括等待时间,不靠谱,比较尴尬。%util:向设备发送I/O请求所花费的时间百分比(设备的带宽利用率)。当设置这个值时,设备饱和,串口服务设备接近100%。对于并行请求,它不反映磁盘设备限制。其实maniostat还是比较清楚的,记录下来,只是为了再记一遍,加深印象。解释:r/s+w/s为IOPS;%util就是我们前面提到的磁盘I/O使用情况;rkB/s+wkB/s为吞吐量;r_await+w_await是响应时间。2.2定位IO较大的具体任务iostat查看整体性能是否达到瓶颈,我们需要查看具体哪个程序占用IO较多,使用pidstat命令:[root@localhost~]#pidstat-d1Linux4.18.0-305.3.1.el8.x86_64(localhost.localdomain)12/07/2021_x86_64_(56CPU)09:46:06PMUIDPIDkB_rd/skB_wr/skB_ccwr/siodelayCommand09:46:07PM045970.001502.910.000xxxx解释:UID:用户IDPID:进程IDkB_rd/s:每秒读取数据的单位是KB。kB_wr/s:每秒写入的数据大小。单位是KB。kB_ccwr/s:每秒取消的写请求数,单位为KB。iodelay:blockIO延迟,包括同步blockIO和block-in时间,以时钟周期为单位。还可以通过iotop查看IO使用率排名,非常方便:08:59:08TotalDISKREAD:0.00B/s|总磁盘写入:0.00B/s08:59:08实际磁盘读取:0.00B/s|实际磁盘写入:0.00B/sTIMETIDPRIOUSERDISKREADDISKWRITESWAPINIOCOMMANDb'08:59:081be/4root0.00B/s0.00B/s0.00%0.00%systemd--switched-root--system--deserialize18'b'08:59:082be/4root0.00B/s0.00B/s0.00%0.00%[kthreadd]'centos部分版本需要单独安装:yuminstalliotop2.3strace跟踪strace就是跟踪进程在用户空间的系统调用和信号传输,非常强大。#更简单的方法,-f将跟踪fork或其线程。strace-pfpid#更强大的strace-tt-T-v-f-etrace=file-o/data/log/strace.log-s1024-p23489-tt显示毫秒时间-T显示每次调用Spend-v打印调用环境变量,-f跟踪目标进程包括所有子进程-e控制跟踪的事件和行为文件文件行为,process跟踪进程管理相关的进程和系统调用,ipc跟踪系统ipc通信的调用;networktrace网络相关的系统调用;signaltrace信号处理相关的系统调用;desc跟踪文件描述符相关的系统调用-o输出到文件-s参数最长字符串,10242.4强大的filetoplinux内核在4.1及以上版本支持bcc工具集,这个工具集非常好用,比如这个filetop,查看IO大小具体文件如下:[root@localhosttools]#./filetop-CTracing...每1秒输出一次。按Ctrl-C到end09:39:02loadavg:0.070.060.011/28010779TIDCOMM读写R_KbW_KbTFILE10779filetop20150Rloadavg10779filetop1040Rtype10779filetop1041top02R7retpro00R_bootlocale.cpython-36.pyc对应:tid线程id,comm线程命令行,READSWRITES读写次数,R_KbW_Kb读写大小,T文件类型FILE:文件名。centos安装:yuminstallbcc-toolsexportPATH=$PATH:/usr/share/bcc/tools三个额外的bcc工具3.1execsnoop这也是bcc工具集合中的一个工具,实时监控进程的exec()行为通过ftrace,并输出一个短时进程的基本信息,对于发现一些奇怪的短时进程很有帮助。[root@localhost工具]#./execsnoopPCOMMPIDPPIDRETARGSdmsetup1139117870/usr/sbin/dmsetupstatus--targetthin-poolpmie_check1140610/usr/libexec/pcp/bin/pmie_check-Csed11408114070/usr/bin/sed-es/"//g/etc/pcp.confawk11409114070/usr/bin/awk-F=\n/^PCP_/&&NF==2{\nexports=exports""$1\nprintf"%s=${%s:-\"%s\"}\n",$1,$1,$2\n}\nEND{print"export",exports}3.2opensnoopopensnoop跟踪open()系统call显示试图打开文件的进程,可用于定位配置文件或日志文件,在某些场合相当好用。[root@localhost工具]#./opensnoopPIDCOMMFDERRPATH1075调整210/proc/11378/cmdline1075调整210/proc/11378/stat1023irqbalance60/proc/interrupts1023irqbalance60/proc/stat1023irqbalance60/proc/irq/15/smp_affinity1023irqbalance60/proc/irq/15/smp_affinity1685pmdaproc70/proc1685pmdaproc70/proc/11375/cmdline