定位linux进程硬盘使用率问题

  • 定位linux进程硬盘使用率问题已关闭评论
  • 115,130 views
  • A+
所属分类:系统知识 系统运维

linux下查看硬盘用到最多的命令应该就是iostat了,如下:

如上,我们能看出sdb正在使用中,那么我最关心的是到底是哪个进程在用呢,不然不好定位问题,其实我们可以直接查出来的,直接查看所有进程使用情况cat /proc/*/io,然后根据输出内容分析:

rchar: xxxx //sendfile等系统调用中读取的字节数
wchar: xxxx    //sendfile等系统调用中写入的字节数
syscr: xxxx    //sendfile等系统调用的次数
syscw: xxxx     //sendfile等系统调用的次数
read_bytes: xxxx //进程读取的物理I/O字节数,包括mmap pagein,在submit_bio()中统计的
write_bytes: xx    //进程写出的物理I/O字节数,包括mmap pageout,在submit_bio()中统计的
cancelled_write_bytes: xx//如果进程截短了cache中的文件,事实上就减少了原本要发生的写I/O

另外就是,如果想看实时变换,用pidstat即可,如:pidstat -d 2 5,但是这命令定位不到是哪一块硬盘
网上之前给过一个脚本,执行脚本,输入设备号就可以查询,脚本如下:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /usr/bin/env stap
global device_of_interest
probe begin {
  device_of_interest = $1
  printf ("device of interest: 0x%x\n", device_of_interest)
}
probe kernel.function("submit_bio")
{
  dev = $bio->bi_bdev->bd_dev
  if (dev == device_of_interest)
    printf ("[%s](%d) dev:0x%x rw:%d size:%d\n",
            execname(), pid(), dev, $rw, $bio->bi_size)
}

 

这个脚本需要输入设备号,设备号的查询命令如下:

ll  /dev/sdb

brw-rw----. 1 root disk 10, 20 Oct 24 15:52 /dev/sdb
Major number(12-bit):  8 i.e. 0x8
Minor number(20-bit): 16 i.e. 0x00010
合在一起得到设备号: 0x800010

执行脚本如下:
# ./dev_task_io.stp 0x800010
device of interest: 0x800010
[dd](31202) dev:0x800010 rw:0 size:512
[dd](31202) dev:0x800010 rw:0 size:512
[dd](31202) dev:0x800010 rw:0 size:512
[dd](31202) dev:0x800010 rw:0 size:512
[dd](31202) dev:0x800010 rw:0 size:512
然后就能查看出31202的进程在sdb上的使用情况

 

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar