Chinaunix首页 | 论坛 | 博客
  • 博客访问: 795139
  • 博文数量: 142
  • 博客积分: 3505
  • 博客等级: 中校
  • 技术积分: 1501
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-30 19:30
文章分类

全部博文(142)

文章存档

2012年(33)

2011年(109)

分类: LINUX

2011-10-15 13:11:09

    Linux的高速缓存pagecache对性能的影响至关重要,但是实际系统中我们的利用率如何呢,特别是具体到每个设备的利用情况。

    从下图我们可以很清楚的看到:

     

    我们知道IO请求由vfs发起,经过pagecache缓存,挡不住的就落实到io设备去,那么统计这个利用率就很简单。 我们只要知道挡不住的IO的比例就好了。

    我写了个systemtap脚本来解决这个问题:

$ uname -r

2.6.18-164.el5


$ sudo rpm -i kernel-debuginfo-common-2.6.18-164.el5.x86_64.rpm

$ sudo rpm -i kernel-debuginfo-2.6.18-164.el5.x86_64.rpm  


$ cat >pcmr.stp

global io_stat, blk_stat


global RD_CNT=2, WR_CNT=3


probe vfs.read.return {

  if ($return>0 && devname!="N/A") {

      io_stat[devname, 0] += $return

      io_stat[devname, RD_CNT] ++;

  }

}


probe ioblock.request {

  blk_stat[devname, rw] += size

  blk_stat[devname, rw+RD_CNT] ++;


probe vfs.write.return {

  if ($return>0 && devname!="N/A") {

      io_stat[devname, 1] += $return

      io_stat[devname, WR_CNT] ++;

  }

}


global _io,_blk


probe timer.ms(5000) { 


foreach ([devname, action] in io_stat)

{

        _io[action] += io_stat[devname, action];

        _blk[action] += blk_stat[devname, action]

}


  if (_io[0] + _io[1]) {


    printf("\\n%-25s, %s%db/%d, %s%db/%d, %s%db/%d, %s%db/%d, %s%d%%\\n\\n",

           ctime(gettimeofday_s()),

           "IO Read:", _io[0], _io[RD_CNT],

           "IO Write:", _io[1],_io[WR_CNT],

           "Blk Read:", _blk[0], _blk[RD_CNT],

           "Blk Write:", _blk[1],_blk[WR_CNT],

           "PCMR:", (_blk[0]+_blk[1]) * 100 / (_io[0] + _io[1]))


        delete _io

        delete _blk


    /* print header */

    printf("%8s %2s %19s %19s %5s\\n",

           "DEVICE","T", "IO", "BLK", "PCMR")

  }


  /* print top ten I/O */

  foreach ([devname, action] in io_stat- limit 10)

     if(action < RD_CNT)

        printf("%8s %2s %11db/%6d %11db/%6d %4d%%\\n",

           devname, action?"W":"R",

           io_stat[devname, action],io_stat[devname, action+RD_CNT],

           blk_stat[devname, action],blk_stat[devname, action+RD_CNT],

           (blk_stat[devname, action] * 100) / io_stat[devname, action]

           )


  /* clear data */

  delete io_stat

  delete blk_stat

}


probe begin

{

println("::");

}

CTRL+D

我们来演示下:


$ sudo stap pcmr.stp

::

...

Wed Jun  1 09:16:16 2011 , IO Read:551320328b/124024, IO Write:0b/0, Blk Read:103219200b/17536, Blk Write:0b/0, PCMR:18%


  DEVICE  T                  IO                 BLK  PCMR

    fioa  R   493284566b/119460   103219200b/ 17536   20%

    sda2  R    41100816b/   624           0b/     0    0%

    sda5  R    16934946b/  3940           0b/     0    0%


Wed Jun  1 09:16:21 2011 , IO Read:554808170b/123568, IO Write:2295b/9, Blk Read:101883904b/17296, Blk Write:135168b/33, PCMR:18%


  DEVICE  T                  IO                 BLK  PCMR

    fioa  R   491003095b/118908   101543936b/ 17259   20%

    sda3  R    42119596b/   136           0b/     0    0%

    sda5  R    17730097b/  4061      163840b/    18    0%

    sda1  R     2399374b/    33           0b/     0    0%

    sda2  R     1543938b/   424      176128b/    19   11%

    sda6  R       12070b/     6           0b/     0    0%

    sda3  W        2295b/     9      135168b/    33 5889%

...

参数我们来解释下:

IO Read: vfs层面看到的IO读/次数

IO Write: vfs层面看到的IO写/次数

Blk Read: 块层面看到的IO读/次数

Blk Write: 块层面看到的IO写/次数

PCMR: pagecache miss rate =100 * blk / io, 由于文件读写是以page为单位,所以可能>100%

第一行是汇总统计,每隔5秒打印一次。

总结: PCMR越小越好,说明高速缓存利用率高。

阅读(1550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~