linux 查看io 进程,如何查看具体进程的IO情况?

本文介绍在Linux环境下如何监控特定进程的输入输出(IO)活动。主要通过两种方法实现:一是利用/proc/pid/io文件获取进程的IO信息;二是启用内核参数vm.block_dump并借助dmesg命令收集进程的块读写数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.前言

linux下有大量的系统命令vmstat、iostat等可以反映系统的总体io情况,但是不能监测具体进程的io情况,本文将介绍两种方法:

1.如果内核版本大于2.6.20,通过 /proc/pid/io 便可以获取进程的io信息。

2.通过echo 1 > /proc/sys/vm/block_dump ,来把 block 读写(WRITE/READ/DIRTY)状况 dump 到日志里,通过 dmesg 命令来查看。

二.  /proc/pid/io

(详细解释:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/proc.txt;hb=HEAD)

示例:

test:/tmp# dd if=/dev/zero of=/tmp/test.dat &

[1] 3828

test:/tmp # cat /proc/3828/io

rchar: 323934931           // 读出的总字节数,read或者pread()中的长度参数总和(pagecache中统计而来,不代表实际磁盘的读入)

wchar: 323929600           // 写入的总字节数,write或者pwrite中的长度参数总和

syscr: 632687              // read()或者pread()总的调用次数

syscw: 632675              // write()或者pwrite()总的调用次数

read_bytes: 0              // 实际从磁盘中读取的字节总数   (这里if=/dev/zero 所以没有实际的读入字节数)

write_bytes: 323932160     // 实际写入到磁盘中的字节总数

cancelled_write_bytes: 0   // 由于截断pagecache导致应该发生而没有发生的写入字节数(可能为负数)

检测工具dstat ( ) 的top_io 模块就是利用此功能实现。dstat的详细说明可以到这里

三.block_dump具体操作步骤是:#sysctl vm.block_dump=1

or

# echo 1 > /proc/sys/vm/block_dump

然后就可以通过 dmesg 就可以观察到各个进程 IO 活动的状况了:

#dmesg -c

kjournald(542): WRITE block 222528 on dm-0

kjournald(542): WRITE block 222552 on dm-0

bash(18498): dirtied inode 5892488 (ld-linux-x86-64.so.2) on dm-0

bash(18498): dirtied inode 5892482 (ld-2.5.so) on dm-0

dmesg(18498): dirtied inode 11262038 (ld.so.cache) on dm-0

dmesg(18498): dirtied inode 5892496 (libc.so.6) on dm-0

dmesg(18498): dirtied inode 5892489 (libc-2.5.so) on dm-0

通过一些脚本分析这些数据就可以得到各个进程的IO情况。下文便描述了这种方法(不同版本的linux下这里dmesg日志格式可能不同)

How to find per-process I/O statistics on Linux

Newer Linux kernels have per-process I/O accounting and you can use the iotop tool to find out what’s performing I/O, but in many cases I’m trying to find the source of an I/O problem in an older kernel. I found sort of a hack-ish way to do that today, while trying to figure out why a system was basically unresponsive.

I founda post on Stack Overflowthat showed a way you can get per process I/O statistics from the kernel even in older kernels. I adapted this to my needs, and wrote a little script.

Here’s how you use it. First, get it:

wget

Then turn on kernel messages about I/O:

echo 1 > /proc/sys/vm/block_dump

This makes the kernel start writing messages about every I/O operation that takes place. Now all you have to do is get those messages and feed them into my script:

while true; do sleep 1; dmesg -c; done | perl iodump

Wait a little while, then cancel the script. The results should look something like the following:

:~# while true; do sleep 1; dmesg -c; done | perl iodump

^C# Caught SIGINT.

TASK                   PID      TOTAL       READ      WRITE      DIRTY DEVICES

firefox               4450       4538        251       4287          0 sda4, sda3

kjournald             2100        551          0        551          0 sda4

firefox              28452        185        185          0          0 sda4

kjournald              782         59          0         59          0 sda3

pdflush                 31         30          0         30          0 sda4, sda3

syslogd               2485          2          0          2          0 sda3

firefox              28414          2          2          0          0 sda4, sda3

firefox              28413          1          1          0          0 sda4

firefox              28410          1          1          0          0 sda4

firefox              28307          1          1          0          0 sda4

firefox              28451          1          1          0          0 sda4

I deliberately generated a bunch

of I/O by deleting my Firefox history and cache.

这里还有个网上找的脚本分析dmesg 的输出的:

#!/bin/bash

#/etc/init.d/rsyslog stop

/etc/init.d/syslog stop

echo 1 > /proc/sys/vm/block_dump

dmesg -c >/dev/null

sleep 60

#dmesg | awk '/(READ|WRITE|dirtied)/ {process[$2]++} END {for (x in process) {print process[x], x;} }' |sort -nr |awk '{print $2" "$1}' | head -n 10

dmesg | awk '/WRITE/ {process[$2]++} END {for (x in process) {print process[x], x;} }' |sort -nr |awk '{print $2" "$1}' | head -n 10

echo 0 > /proc/sys/vm/block_dump

/etc/init.d/syslog start

#/etc/init.d/rsyslog start

<think>好的,我现在需要帮助用户解决在Linux系统中查看IO相关进程信息的问题。用户可能是一位系统管理员或者开发人员,遇到了性能问题,需要监控哪些进程在进行大量的磁盘读写操作。首先,我得回忆一下自己知道的Linux工具,以及如何正确使用它们。 首先,想到常用的命令是`iotop`,它专门用来监控磁盘I/O使用情况,并且可以按进程排序。不过可能有些系统没有预装,需要安装。另外,`top`命令虽然主要看CPU和内存,但新版可能有IO的指标,比如wa(等待I/O的CPU时间百分比),但具体进程IO数据可能不够详细。然后是`dstat`,它可以提供更全面的统计,包括磁盘读写。还有`pidstat`,属于sysstat包的一部分,可以按进程报告IO数据。 接下来,用户可能需要具体的步骤,比如如何安装这些工具。例如,在Ubuntu上安装iotop可能需要`sudo apt install iotop`。另外,权限问题也很重要,比如普通用户运行这些命令是否需要sudo,或者是否有其他方式获取权限。 还需要考虑实时监控和批量记录的情况。比如,`iotop -o`可以只显示活跃IO进程,而`pidstat -d`可以定期输出数据,适合长时间监控。此外,`vmstat`和`iostat`也能提供系统级别的IO信息,但可能不如进程级别的工具直接。 用户可能还会关心如何解读输出结果,比如哪些指标比较关键,如IO等待时间、读写速度等。需要解释这些指标的含义,帮助用户判断是否存在瓶颈。另外,如果用户遇到权限问题,比如无法安装工具,可能需要指导他们使用`sudo`或者检查软件源配置。 最后,确保回答的结构清晰,分点说明不同工具的使用方法,并给出示例命令。同时,根据用户提供的引用,比如引用[1]提到top中的wa指标,可以关联到系统级别的IO等待情况,但需要结合其他工具来定位具体进程。引用[2]中的htop虽然功能丰富,但可能不支持直接查看IO信息,所以需要推荐更适合的工具如iotop。</think>在Linux系统中查看与I/O相关的进程信息,可以通过以下方法实现: ### 一、使用`iotop`工具 1. **实时监控I/O** 安装命令:`sudo apt install iotop`(Debian/Ubuntu) 运行后显示所有进程的I/O使用情况,按`左右箭头`可调整排序字段: ```bash sudo iotop ``` 支持交互操作: - `o`:仅显示正在执行I/O的进程 - `p`:显示线程级统计 2. **批处理模式** ```bash iotop -b -n 3 > io_log.txt # 每隔2秒采样一次,共3次,结果输出到文件 ``` ### 二、`pidstat`监控进程I/O 1. **安装sysstat工具包** ```bash sudo apt install sysstat # Debian/Ubuntu ``` 2. **查看实时I/O统计** ```bash pidstat -d 2 # 每隔2秒刷新进程级I/O数据 ``` 输出包含关键字段: - `kB_rd/s`:每秒读取数据量 - `kB_wr/s`:每秒写入数据量 ### 三、通过`/proc`文件系统 直接查看进程的I/O计数器: ```bash cat /proc/[PID]/io # 将[PID]替换为实际进程ID ``` 输出示例: ``` rchar: 1024000 # 读取字符总数 wchar: 204800 # 写入字符总数 read_bytes: 512000 # 实际磁盘读取字节 write_bytes: 102400 # 实际磁盘写入字节 ``` ### 四、`dstat`综合监控 ```bash dstat -tdD total 2 # 每2秒刷新,显示磁盘total设备的I/O详情 ``` 组合参数: - `-c`:CPU使用率 - `-d`:磁盘统计 - `-n`:网络流量 ### 五、系统级I/O监控 1. **iostat**(sysstat包) ```bash iostat -dx 2 # 每2秒显示设备级I/O详情 ``` 关键指标: - `%util`:设备I/O利用率(超过80%可能为瓶颈) - `await`:I/O请求平均等待时间 2. **vmstat** ```bash vmstat 1 # 每秒刷新,观察`bi`(块输入)、`bo`(块输出) ``` ### 六、结合`top`的I/O相关指标 在`top`界面按`f`添加`IO`相关字段(如`WA`表示I/O等待的CPU时间占比)[^1]。注意`top`默认不显示进程级I/O数据,需配合其他工具使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值