网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

如何分析磁盘IO高的问题排查过程

这期内容当中小编将会给大家带来有关如何分析磁盘IO高的问题排查过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

成都创新互联公司服务项目包括兰陵网站建设、兰陵网站制作、兰陵网页制作以及兰陵网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,兰陵网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到兰陵省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

我们服务器搭建了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
mkdir -p /data/logs/iostat
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" ))  {flag = 1;}}'`

add $idle_percent

#求5次查询IO占用率的平均值

avg=`echo $sum/5|bc`

if [[ $avg -ge 70 ]];then
echo 1 > /proc/sys/vm/block_dump
echo "-----------------------------------------------" >> $dmesg_log
echo `date "+%Y-%m-%d %H:%M:%S"` >> $dmesg_log
python /data/dmesg_io.py >> $dmesg_log

echo "-----------------------------------------------" >> $dstat_log
echo `date "+%Y-%m-%d %H:%M:%S"` >> $dstat_log
dstat -d --top-bio 1 10 >> $dstat_log
echo 0 > /proc/sys/vm/block_dump
 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 __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0

def main():
argc = len(sys.argv)
if argc != 1:
print "usage: ./iotop"
sys.exit(0)

if os.getuid() != 0:
print "must be run as root"
sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_dump')
print "TASK  PID  READ  WRITE"
#  while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(\
'^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print "%-10s s d d" % \
(item.pname, item.pid, item.reads, item.writes)

def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_dump')
sys.exit(0)

if __name__=="__main__":
main()

发现在3:20-3:35的日志如下(仅列出部分):

[root@localhost iostat]# cat dmesg.log

-----------------------------------------------

2013-08-22 03:23:06
TASK  PID  READ  WRITE
updatedb  18661  2951  0
kjournald  804  0  525
kjournald  1826  0  576

-----------------------------------------------
2013-08-22 03:24:05
TASK  PID  READ  WRITE
updatedb  18661  3007  0
kjournald  804  0  238
kjournald  1826  0  112
flush-8:0  11687  0  18
-----------------------------------------------
2013-08-22 03:25:05
TASK  PID  READ  WRITE
updatedb  18661  2689  0
kjournald  804  0  229
kjournald  1826  0  44

说明是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/
当然如果你服务器用不着建立索引,也可以直接移除

上述就是小编为大家分享的如何分析磁盘IO高的问题排查过程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


文章名称:如何分析磁盘IO高的问题排查过程
文章出自:http://bjjierui.cn/article/gppdcp.html

其他资讯