如何查看Linux下进程的IO活动状况 00 Hey,Linux

如何查看Linux下进程的IO活动状况 00 Hey,Linux,第1张

前段时间,几台测试服务器的Web应用响应速度非常慢,系统负载也比较高,>10, 但CPU和内存却很闲,于是怀疑是磁盘的性能瓶颈,通过vmstat和iostat看到IO的读写量非常大,尤其是用iostat -x 1命令可以很直观的看到IO的使用率一直在100%。

但究竟是什么进程导致的高IO呢,由于每台服务器上都有JBoss和MySQL的存在,JBoss会不停的产生很多小的数据文件和生成文本数据库的数据,而MySQL则会不停的从Master同步新的数据。因此我们怀疑是这两个进程导致的高IO,通过停止了JBoss和MySQL之后,IO立刻降为0%. 但我们还是不能确定谁是主因,于是寻找可以查看特定进程IO的方法。

最后,找到了两个方法可以查看进程IO的活动状况。

1. 第一个方法是通过一个python脚本来实现。

方法是将以下内容另存为一个叫io.py的脚本中,然后直接以root身份执行脚本,就可以看到如下图所示的信息(由于我们已经通过升级到SSD硬盘解决了MySQL的IO问题,所以不能提供关于MySQL的截图了),其中出现次数最多,数据最大的进程,就是导致高IO的主因。不过比较遗憾的是这个脚本并不能显示进程在每一秒的准确的IO读写。

# vim io.py

# chmod +x io.py

# ./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 %10s %10d %10d" % \

(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()

2. 另一个方法是将Linux的内核升级到 >=2.6.20,然后安装一个iotop软件来实现。

不过这种改动并不适用于生产环境,因为在RHEL5.6和5.7上,内核都在 2.6.20以下。但是它所显示的结果是非常准确的,所以对于新上线的机器以及测试环境,非常值得一试,具体方法如下:

下载和升级新内核(>=2.6.20),编译时打开 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 选项。

解压内核后进入配置界面:

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz

# tar jxvf linux-2.6.39.tar.gz

# mv linux-2.6.39 /usr/src/

# cd /usr/src/linux-2.6.39

# make oldconfig //使用make oldconfig可以继承老的kernel的配置,为自己的配置省去很多麻烦。

# make menuconfig

把General setup - Enable per-task storage I/O accounting这个选项选上。

# vim .config

将#CONFIG_SYSFS_DEPRECATED_V2 is not set的注释去掉的,将其改为y,即修改为CONFIG_SYSFS_DEPRECATED_V2=y。

保存内核后编译内核:

# make

# make modules

# make modules_install

# make install

修改默认以新的内核启动:

# vi /boot/grub/grub.conf

default=0

将新的内核配置文件复制到/boot目录:

# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39

重启服务器:

# reboot

# uname –r

2.6.39

重启完成后确认内核版本是否正确。

源码安装iotop所需的Python 2.7.2(>= 2.5):

# wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz

# tar xzvf Python-2.7.2.tgz

# cd Python-2.7.2

# ./configure

# makemake install

下载并安装iotop:

# wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.bz2

# tar -xjvf iotop-0.4.4.tar.bz2

# cd iotop-0.4.4

# python setup.py build

# python setup.py install

然后就可以使用iotop看到如下图所示的信息:

top命令的其他参数代表的含义详见top命令详解

sar 命令是分析系统瓶颈的神器,可以用来查看 CPU 、内存、磁盘、网络等性能。

sar 命令查看当前磁盘性能的命令为:

sar -n DEV

不带其他参数 看当天的网络IO 缺省取样时间为1秒,间隔为10分钟

加 -f /var/log/sa/saxx可察看某日的历史,xx为当月或上月的日期(day of the month)前提是改文件存在

察看即时IO用sar -n DEV 1 999 表示取样间隔为1秒,取样999次

具体字段的含义我就不醉赘述了


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7217149.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存