1.使用w命令查看系统负载,发现系统负载很高:(该服务器只有一个CPU,load average值的意义是单位时间段内CPU活动进程数,这个值越大就说明服务器压力越大,一般情况下这个值只要不超过服务器的cpu数量就没有关系)
2.使用top命令进一步确认具体是原因导致的负载过高,执行top命令后,发现CPU这一列wa的数值很高,说明CPU资源在等待I/O,由此可以判断是因为I/O的原因导致了系统负载过高,操作卡顿。
top命令从系统面大体展示了I/O Wait,但无法确定具体是哪个磁盘正在被影响;因此需要使用iostat命令进行确认
3.使用iostate命令确认具体是那个磁盘存在I/O异常,
iostate -x 2 5 # 每2秒打印报告,共打印5次;-x参数告诉iostata打印出更详尽的报告
iostat打印出的第1个报告,数值是基于最后一次系统启动的时间统计的,即每个子报告都是基于上1次的报告,因此第一个报告应该被忽略。在这个例子中,第2份报告就是从第1份报告开始后的硬盘数据,第3份报告基于第2份,依此类推。根据第2个报告的输出可以看到,vda盘的%util数值达到了103.63%,这表示引起I/O慢的进程在写入vda盘。
4.使用iotop或者ps查找导致高I/O的进程:
查看哪个进程使用硬盘最多的最简单的方法就是使用iotop命令,虽然iotop好用,但默认主流的linux发行版中是没有安装的,可以使用yum provides */iotop 查看iotop命令是由那个rpm包提供的,使用yum安装下即可。如果无法在短时间内完成iotop的安装,还可以使用ps命令来大致确定具体是那个进程导致的I/O过高。
ps命令能打印出内存,cpu的情况但没办法打印出硬盘I/O的情况。虽然ps没办法打印出I/O的情况,但可以显示出进程是否在等待I/O。等待I/O的进程通常处于uninterruptible、sleep或D状态,通过这些信息可以大致查找出处在wait状态的进程。
for x in `seq 1 10`;do ps -eo state,pid,cmd|grep "^D";echo "---";sleep 5;done
根据命令的打印结果可以看出,进程号为123424的进程每次都会出现,说明很有可能是该进程导致的I/O过高
为了进一步确认是否是该进程导致的I/O过高,可以在/proc中找到该进程,查看它的I/O
read_bytes和write_bytes就这个进程读写硬盘的字节数。可以看到123424这个进程已经读了2GB,写了235MB的数据。
接下来的操作,可以使用kill命令杀掉导致I/O飙高的进程(临时)