磁盘IO瓶颈分析

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40195432/article/details/84999788

磁盘IO瓶颈分析
https://www.w3xue.com/exp/article/201812/12432.html(iowait过高)

如果IO存在性能瓶颈,top工具中的%wa会偏高;

一、 首先分析是不是io引起的系统缓慢(top命令)
[root@coolnull ~]# top
top - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 245440k total, 241004k used, 4436k free, 496k buffers
Swap: 409596k total, 5436k used, 404160k free, 182812k cached
从CPU(s) 这行你可以看出当前CPU I/O Wait的情况;越高的wa表示越多的cpu资源在等待I/O

二、 查找哪个磁盘正在被写入(iostat命令)
[root@coolnull ~]# iostat -x 2 5
$ iostat -x 2 3
Linux 2.6.32-642.el6.x86_64 (nginx-console-prd-10-20-133-35.bj01.vivo.lan) 10/15/2018 x86_64 (32 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.08 0.00 0.20 0.01 0.00 99.71

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.13 510.12 1.67 18.81 232.08 4231.47 218.01 0.07 3.50 1.68 3.66 0.25 90.52
sdb 0.00 0.02 0.76 0.65 168.25 220.98 276.10 0.00 1.60 0.17 3.28 0.17 0.02
上述示例,sda盘的%utilized达到了90.52%。这表示引起I/O慢的进程在写入sda盘。

三、查找引起高I/O的进程(iotop命令)
查看哪个进程使用硬盘最多的最简单的方法就是使用iotop命令。
[root@coolnull ~]# iotop
Total DISK READ: 8.00 M/s | Total DISK WRITE: 20.36 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
15758 be/4 root 7.99 M/s 8.01 M/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

补充扩展:查看io占比大于0.2%的进程
iotop -b | awk -F’%’ ‘{if($(NF-1) > 0.2 && $(NF-1) ~ /[0-9]/ && 0 !   / D I S K / ) p r i n t f " T I M E : 0 !~ /DISK/)printf "TIME: %s,IO:%s%,COMMAND:%s\n",strftime("%F %T"), (NF-1),$NF}’

注: -b, --batch 非交互式模式,可以用于写日志。

四、查看高I/O进程的磁盘读写情况

方法一:通过cat /proc/pid/io 便可以获取进程的io信息

[root@coolnull ~]# cat /proc/16528/io
rchar: 48752567
wchar: 549961789
syscr: 5967
syscw: 67138
read_bytes: 49020928
write_bytes: 549961728
cancelled_write_bytes: 0

rchar: 读出的总字节数,read或者pread()中的长度参数总和(pagecache中统计而来,不代表实际磁盘的读入)
wchar: 写入的总字节数,write或者pwrite中的长度参数总和
syscr: read()或者pread()总的调用次数
syscw: write()或者pwrite()总的调用次数
read_bytes: 实际从磁盘中读取的字节总数 (这里if=/dev/zero 所以没有实际的读入字节数)
write_bytes: 实际写入到磁盘中的字节总数
cancelled_write_bytes: 由于截断pagecache导致应该发生而没有发生的写入字节数(可能为负数)

方法二:通过pidstat工具
pidstat -d -p 98536 2 10(输出io的使用情况)
Linux 2.6.32-642.el6.x86_64 (bj01.prd.saltdb01.vivo.lan) 12/13/2018 x86_64 (16 CPU)

05:43:11 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
05:43:12 PM 98536 10000.00 0.00 0.00 mysqld
05:43:13 PM 98536 10000.00 0.00 0.00 mysqld
Average: 98536 10000.00 0.00 0.00 mysqld

五、查看不可中断的进程及僵尸进程的情况
ps -eo state,pid,cmd | grep “^D” (产生D状态的原因出现uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等)
ps -eo state,pid,cmd | grep “^Z”

猜你喜欢

转载自blog.csdn.net/qq_40195432/article/details/84999788