我们服务器搭建了cacti进行监控,一次通过查看磁盘IO图像的时候,发现每天凌晨3:20-3:35的时候磁盘IO一下飙的很高,然后想知道到底是哪个进程占用那么高的IO,下面是解决方法:
写个检测脚本check_io_process.sh,当磁盘IO占用高的时候进行磁盘IO读写进程次数的检测:
#!/bin/bash
# Date: 2013/8/20
# Author: zhangkai
# Description: This script is used to check IO higher process.
# History:
iostat_log=/data/logs/iostat/iostat.log
dmesg_log=/data/logs/iostat/dmesg.log
dstat_log=/data/logs/iostat/dstat.log
if [ ! -d /data/logs/iostat ];then
fi
add(){
str=$@
sum=`echo ${str// /+}|bc -l`
}
iostat -x 1 5 > $iostat_log
idle_percent=`cat $iostat_log | awk 'BEGIN{flag=0} {if(flag ==1){print $12; flag=0;} if (index($0, "%util" ))
add $idle_percent
#求5次查询IO占用率的平均值
avg=`echo $sum/5|bc`
if [[ $avg -ge 70 ]];then
fi
其中该shell脚本调用了检测磁盘IO读写进程次数的python脚本,下面是dmesg_io.py的代码:
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com
import sys, os, time, signal, re
class DiskIO:
def main():
#
def signal_handler(signal, frame):
if __name__=="__main__":
发现在3:20-3:35的日志如下(仅列出部分):
[root@localhost iostat]# cat dmesg.log
-----------------------------------------------
2013-08-22 03:23:06
TASK
updatedb
kjournald
kjournald
-----------------------------------------------
2013-08-22 03:24:05
TASK
updatedb
kjournald
kjournald
flush-8:0
-----------------------------------------------
2013-08-22 03:25:05
TASK
updatedb
kjournald
kjournald
说明是updatedb这进程惹的祸,google查之,这个是由[cron]自动运行的更新系统数据的脚本。
其作用是为你系统里面的文件建立索引,以便于locate和whereis等查询命令的能够快速执行
而我们服务器/data/目录每天会产生大量的小文件,导致建立索引的时候占用很高的磁盘IO
服务器每天定时对硬盘上的文件进行索引,简单的说就是建立一个数据库,把所有文件目录信息存放到这个库里面,当使用whereis和locate命令搜索文件时,它直接到这个数据库中读取数据。而不是像find一样在硬盘上找文件。Whereis搜索一个文件几乎只要几秒钟就可以搞定,而find需要花费几分钟或者更长时间。updatedb.Conf使搜索的效率提高了很多倍。但是有缺点,它每天都需要索引更新,这会导致IO负载过高,因为不是时时更新,所以会出现搜索到已经删除的文件,搜不出新添加的文件,平时管理中我们很少用到。如果文件数量多而且更新平凡,我们大可把这个功能关闭
优化方法:
1.停止对/data目录进行建立索引操作
vim /etc/updatedb.conf
找到PRUNEPATHS,在后面添加上你不想让这个updatedb建立索引的目录
2.设置定时更新的工作频率从每天一次降低到每周执行一次,命令如下:
mv /etc/cron.daily/mlocate.cron /etc/cron.weekly/
当然如果你服务器用不着建立索引,也可以直接移除