解决centos7.2中磁盘iowait过高

(一)简述

每天都收到磁盘iowait告警信息,尤其是日志服务器在进行大量的读写操作过程中,从而造成系统处于崩溃边缘,为查找磁盘iowait由于什么原因造成的以及后续的系统的优化点。centos有许多查找问题的工具,也有高级的。

I/O Wait 就是一个需要使用高级的工具来debug的问题,当然也有许多基本工具的高级用法I/O wait的问题难以定位的原因是因为我们有很多工具可以告诉你说I/O 受限了,但是并没有告诉你具体是哪些进程们引起的。

具体的思路如下:top 。查看由cpu一行浪费在iowait上的cpu百分比 =>iostat -x 2 5 查看某块磁盘正在被写入 => iotop 查找最高的磁盘I/O对应的进程 => lsof -p pid 查看通过一个进程打开所有文件或打开一个文件的所有进程。


(二)具体步骤如下:

(1)通过top命令来确认是否是I/O导致系统缓慢。

[root@iZ23iod5vslZ~]#top
top-15:38:32up40days,5:59,3users,loadaverage:0.00,0.01,0.05
Tasks:128total,1running,127sleeping,0stopped,0zombie
%cpu(s):0.4us,0.2sy,0.0ni,99.2id,98wa,0.0hi,0.0si,0.1st
KiBMem:32520424total,31492136used,1028288free,412772buffers
KiBSwap:0total,0used,0free.25902892cachedMem
PIDUSERPRNIVIRTRESSHRS%cpu%MEMTIME+COMMAND
18988root20011.647g3.611g7896S2.711.6507:57.30java
28root200000S0.30.06:43.31rcuos/3
1root2004955634121912S0.00.00:14.60systemd
2root200000S0.00.00:00.01kthreadd
3root200000S0.00.00:48.28ksoftirqd/0
5root0-20000S0.00.00:00.00kworker/0:0H
7rootrt0000S0.00.00:00.83migration/0
8root200000S0.00.00:00.00rcu_bh
9root200000S0.00.00:00.00rcuob/0
10root200000S0.00.00:00.00rcuob/1
11root200000S0.00.00:00.00rcuob/2
12root200000S0.00.00:00.00rcuob/3
13root200000S0.00.00:00.00rcuob/4
14root200000S0.00.00:00.00rcuob/5
15root200000S0.00.00:00.00rcuob/6
16root200000S0.00.00:00.00rcuob/7

cpu一行我们可以看到浪费在I/O Wait上的cpu百分比;这个数字越高说明越多的cpu资源在等待I/O权限.具体的解释如下:

0.4% us 用户空间占用cpu的百分比。

0.2% sy 内核空间占用cpu的百分比。

0.0% ni 改变过优先级的进程占用cpu的百分比

2% id 空闲cpu百分比

98% wa IO等待占用cpu的百分比

0.0% hi 硬中断(Hardware IRQ)占用cpu的百分比

0.0% si 软中断(Software Interrupts)占用cpu的百分比

在这里cpu的使用比率和windows概念不同,如果你不理解用户空间和内核空间,需要充充电了


(2)通过iostat -x 3 3 查看那块磁盘正在被写入。

[root@iZ23iod5vslZ~]#iostat-x33
Linux3.10.0-123.9.3.el7.x86_64(iZ23iod5vslZ)08/14/2017_x86_64_(4cpu)
avg-cpu:%user%nice%system%iowait%steal%idle
0.700.000.160.750.0598.34
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitr_awaitw_awaitsvctm%util
xvda0.0021.180.3218.339.94195.0621.980.084.1111.443.981.542.88
xvdb0.0015.211.231.9838.4168.7666.700.0825.483.5939.101.090.35
xvdc0.000.070.000.910.0036.2579.430.10106.8812.53106.921.330.12
avg-cpu:%user%nice%system%iowait%steal%idle
0.750.000.170.080.0898.91
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitr_awaitw_awaitsvctm%util
xvda0.002.330.000.670.0012.0036.000.005.500.005.505.500.37
xvdb0.000.000.000.000.000.000.000.000.000.000.000.000.00
xvdc0.000.000.000.000.000.000.000.000.000.000.000.000.00
avg-cpu:%user%nice%system%iowait%steal%idle
0.750.000.170.000.0099.08
Device:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitr_awaitw_awaitsvctm%util
xvda0.003.330.001.670.0034.6741.600.013.000.003.001.60100.27
xvdb0.009.000.001.670.0042.6751.200.015.400.005.401.800.30
xvdc0.000.330.000.670.004.0012.000.002.000.002.002.000.13

每隔三秒更新一次,一共打印了三次。-x时打印出扩展选项。第一次打印的信息可以被忽略,剩下的报告,都是基于上一次间隔的时间打印出来。

上述的列子中xvda的 %util(利用率)是100.27%,有进程往磁盘中写入数据。


(3)通过iotop查找高I/O对应的进程

[root@iZ23iod5vslZ~]#iotop
TotaldisKREAD:0.00B/s|TotaldisKWRITE:15.67K/s
ActualdisKREAD:0.00B/s|ActualdisKWRITE:0.00B/s
TIDPRIoUSERdisKREADdisKWRITESWAPINIO>COMMAND
18793be/4root0.00B/s3.92K/s0.00%0.00%java-Djava.util.logging.config.file=/usr/to~porg.apache.catalina.startup.Bootstrapstart
18987be/4root0.00B/s3.92K/s0.00%0.00%cronolog/guojinbao/tomcat/logs/catalina.%Y-%m-%d.out
18796be/4root0.00B/s3.92K/s0.00%0.00%java-Djava.util.logging.config.file=/usr/to~porg.apache.catalina.startup.Bootstrapstart
13193be/4root0.00B/s3.92K/s0.00%0.00%java-Djava.util.logging.config.file=/usr/to~porg.apache.catalina.startup.Bootstrapstart
1be/4root0.00B/s0.00B/s0.00%0.00%systemd--switched-root--system--deserialize22
2be/4root0.00B/s0.00B/s0.00%0.00%[kthreadd]
3be/4root0.00B/s0.00B/s0.00%0.00%[ksoftirqd/0]
16388be/4root0.00B/s0.00B/s0.00%0.00%AliYunDun
5be/0root0.00B/s0.00B/s0.00%0.00%[kworker/0:0H]
16390be/4root0.00B/s0.00B/s0.00%0.00%AliYunDun
7rt/4root0.00B/s0.00B/s0.00%0.00%[migration/0]
8be/4root0.00B/s0.00B/s0.00%0.00%[rcu_bh]
9be/4root0.00B/s0.00B/s0.00%0.00%[rcuob/0]
10be/4root0.00B/s0.00B/s0.00%0.00%[rcuob/1]
11be/4root0.00B/s0.00B/s0.00%0.00%[rcuob/2]

从上述的例子中可以看出进程号为cronolog18987占用了大量的磁盘IO


(4)通过lsof -p pid查找由那个文件引起的IOwait

[root@iZ23iod5vslZ~]#lsof-p18987
COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAME
cronolog18987rootcwdDIR202,17204802400258/guojinbao/tomcat/logs
cronolog18987rootrtdDIR202,140962/
cronolog18987roottxtREG202,148627152798/usr/local/sbin/cronolog
cronolog18987rootmemREG202,12107600132826/usr/lib64/libc-2.17.so
cronolog18987rootmemREG202,1160240132819/usr/lib64/ld-2.17.so
cronolog18987root0rFIFO0,80t042614018pipe
cronolog18987root1wCHR1,30t01028/dev/null
cronolog18987root2uCHR136,00t03/dev/pts/0(deleted)
cronolog18987root3wREG202,1757048759792400280/guojinbao/tomcat/logs/catalina.2017-08-14.out

lsof 命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程。从这个列表中,我们可以找到具体是什么文件被写入,根据文件的大小和/proc中io文件的具体数据.

为了确认我们的怀疑,我们可以使用 /proc文件系统,每个进程目录下都有一个叫io的文件,里边保存这和iotop类似的信息

[root@iZ23iod5vslZ~]#cat/proc/18987/io
rchar:58891582418
wchar:58891579778
syscr:46556085
syscw:46556077
read_bytes:212992
write_bytes:59580235776
cancelled_write_bytes:0

read_bytes和write_bytes是这个进程从磁盘读写的字节数。这个例子中cronolog读取了212992byte(0.2M)数据,写入了59580235776bytes(55.4G)数据到磁盘上。


(5)通过df -h /guojinbao来查看服务器那块磁盘的根目录

[root@iZ23iod5vslZ~]#df-h/guojinbao/
FilesystemSizeUsedAvailUse%Mountedon
/dev/xvdb145G38G4.7G89%/guojinbao


最后,通过以上的信息我们可以放心的说lsof的结果就是我们要查找的文件

相关文章

Centos下搭建性能监控Spotlight
CentOS 6.3下Strongswan搭建IPSec VPN
在CentOS6.5上安装Skype与QQ
阿里云基于centos6.5主机VPN配置
CentOS 6.3下配置multipah
CentOS安装、配置APR和tomcat-native