IT技术博客大学习 共学习 共进步

Linux高速缓存使用率调查

Erlang非业余研究 2011-06-01 23:38:35 浏览 3,103 次
    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越小越好,说明高速缓存利用率高。

建议继续学习

  1. 浅析http协议、cookies和session机制、浏览器缓存 (阅读 17,205)
  2. 分布式缓存系统 Memcached 入门 (阅读 16,044)
  3. 强制刷新本地 DNS 缓存记录 (阅读 10,642)
  4. php缓存与加速分析与汇总 (阅读 7,723)
  5. Web应用的缓存设计模式 (阅读 7,304)
  6. 浏览器缓存机制 (阅读 7,104)
  7. 使用memc-nginx和srcache-nginx构建高效透明的缓存机制 (阅读 6,943)
  8. 谈冷热数据 (阅读 6,884)
  9. 缓存设计的一些思考 (阅读 6,823)
  10. 系统架构的一些思考 (阅读 6,683)