千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这期内容当中小编将会给大家带来有关如何分析磁盘IO高的问题排查过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们服务器搭建了cacti进行监控,一次通过查看磁盘
千家信息网最后更新 2025年02月01日如何分析磁盘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高的问题排查过程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

文件 磁盘 索引 更新 分析 数据 时候 服务器 目录 脚本 进程 搜索 服务 命令 检测 过程 问题 内容 就是 数据库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 私自架设服务器多久会被查到 唐山数据库安全审计 软件开发的规模怎么写 边防网络安全教育 阿里巴巴网络技术数据报表 WIFI 网络安全认证证书 微信云开发数据库数据加密 虚拟机做数据库服务器和本机通信 数据库表字段值排序 软件开发读研有用吗 政府加强网络安全人才培养 linux下数据库初始化 x86服务器 idc报告 数据库技术与应用结业考试 福建个人软件开发电话多少 软件开发主要技术要求 刑警队辅警网络安全 天津软件开发一般在哪里工作 贵阳的网络技术中专学校哪好 金蝶专业版服务器默认用户名 国家需要网络技术人才吗 图片读取sql数据库 诛仙服务器维护 广州虎诺网络技术有限公司 武林外传连接服务器 在服务器中设置重生点怎么办 任我行网络技术股份 现军用无线传感器网络技术 取数据库表中的字段值 网络安全好还是计算机视觉好
0