哪些进程这在对写?试试iotop。但是有时候并不方便安装部署iotop,而且iotop的输出也容易进一步分析处理。
那么,有没有其他方式方便做到这一点呢?有。在说出答案前,我们先看看一个实际/proc/<pid>/io文件的内容
rchar: 951610978
wchar: 1180044763
syscr: 133011
syscw: 120643
read_bytes: 77246464
write_bytes: 735604736
cancelled_write_bytes: 98304
根据内核文档,rchar和wchar即是进程已经提交但还没有完成的的读写操作要处理的内容。因此逐一遍历进程,即可计数正在读写的进程并且予以适当排序。
比如,列出正在发起读操作的前20个进程,我们可以这样办理
for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \
if [ -e /proc/${pid} ];then \
num=$(cat /proc/${pid}/io | grep -E '^rchar:' | cut -d ' ' -f 2);\
echo "${num} ${pid}";\
fi;\
done | sort -n -r | head -20
当然,上面的命令稍加改动就可以用到正在写的进程上
for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \
if [ -e /proc/${pid} ];then \
num=$(cat /proc/${pid}/io | grep -E '^wchar:' | cut -d ' ' -f 2);\
echo "${num} ${pid}";\
fi;\
done | sort -n -r | head -20
以上两个命令的执行示例如下
root@demo:~# for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \
> if [ -e /proc/${pid} ];then \
> num=$(cat /proc/${pid}/io | grep -E '^rchar:' | cut -d ' ' -f 2);\
> echo "${num} ${pid}";\
> fi;\
> done | sort -n -r | head -20
28908475231 1
5022495635 1309
3647776277 906
1537484053 1806
1091171589 1388
955070588 31283
445533142 1458
325857806 920
148582179 893
75633008 9729
75169817 2068
74541144 2038
74355216 2067
73356682 2085
70308680 2073
50819715 1873
48753553 2080
48556521 1436
47121818 1709
41993240 29162
root@demo:~# for pid in $(cd /proc;ls | perl -nE 'chomp;next if (!/^\d+$/);say');do \
> if [ -e /proc/${pid} ];then \
> num=$(cat /proc/${pid}/io | grep -E '^wchar:' | cut -d ' ' -f 2);\
> echo "${num} ${pid}";\
> fi;\
> done | sort -n -r | head -20
1180115284 31283
502324828 1
488319291 906
94696438 1309
61642095 1458
41535896 893
39210225 29162
15680109 1359
9482873 2068
5626696 1756
5545914 1709
4047538 1677
2944955 478
2602756 19648
2065398 22388
2060970 22389
1816383 19644
1687956 1307
1548644 19647
1545858 19645
root@demo:~#