监测Linux进程的实时IO情况.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:3 大小:28KB 金币:14 举报 版权申诉
预览加载中,请您耐心等待几秒...

监测Linux进程的实时IO情况.doc

监测Linux进程的实时IO情况.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

14 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

监测Linux进程的实时IO情况文件描述:作为系统管理员和VPS服务商,经常会碰到服务器或者VPS磁盘IO繁忙的时候,VPSee通常都会用一些工具来检测,其中一个常用的工具就是自己写的iotop脚本,可以很方便看到哪个进程在频繁IO.上周五收到一位网友的邮件和留言,问到这篇文章:如何查看进程IO读写情况?里的WRITE为什么会出现是0的情况,这是个好问题,VPSee在这里好好解释一下。首先看看我们怎么样才能实时监测不同进程的IO活动状况。block_dumpLinux内核里提供了一个block_dump参数用来把block读写(WRITE/READ)状况dump到日志里,这样可以通过dmesg命令来查看,具体操作步骤是:#sysctlvm.block_dump=1or#echo1>/proc/sys/vm/block_dump然后就可以通过dmesg就可以观察到各个进程IO活动的状况了:#dmesg-ckjournald(542):WRITEblock222528ondm-0kjournald(542):WRITEblock222552ondm-0bash(18498):dirtiedinode5892488(ld-linux-x86-64.so.2)ondm-0bash(18498):dirtiedinode5892482(ld-2.5.so)ondm-0dmesg(18498):dirtiedinode11262038(ld.so.cache)ondm-0dmesg(18498):dirtiedinode5892496(libc.so.6)ondm-0dmesg(18498):dirtiedinode5892489(libc-2.5.so)ondm-0问题一位细心的网友提到这样一个问题:为什么会有WRITEblock0的情况出现呢?VPSee跟踪了一段时间,发现确实有WRITE0的情况出现,比如:#dmesg-c...pdflush(23123):WRITEblock0onsdb1pdflush(23123):WRITEblock16onsdb1pdflush(23123):WRITEblock104onsdb1pdflush(23123):WRITEblock40884480onsdb1...答案原来我们把WRITEblock0,WRITEblock16,WRITEblock104这里面包含的数字理解错了,这些数字不是代表写了多少blocks,是代表写到哪个block,为了寻找真相,VPSee追到Linux2.6.18内核代码里,在ll_rw_blk.c里找到了答案:$vilinux-2.6.18/block/ll_rw_blk.cvoidsubmit_bio(intrw,structbio*bio){intcount=bio_sectors(bio);BIO_BUG_ON(!bio->bi_size);BIO_BUG_ON(!bio->bi_io_vec);bio->bi_rw|=rw;if(rw&WRITE)count_vm_events(PGPGOUT,count);elsecount_vm_events(PGPGIN,count);if(unlikely(block_dump)){charb[BDEVNAME_SIZE];printk(KERN_DEBUG"%s(%d):%sblock%Luon%sn",current->comm,current->pid,(rw&WRITE)?"WRITE":"READ",(unsignedlonglong)bio->bi_sector,bdevname(bio->bi_bdev,b));}generic_make_request(bio);}很明显从上面代码可以看出WRITEblock0onsdb1,这里的0是bio->bi_sector,是写到哪个sector,不是WRITE了多少blocks的意思。还有,如果block设备被分成多个区的话,这个bi_sector(sectornumber)是从这个分区开始计数,比如block0onsdb1就是sdb1分区上的第0个sector开始。