IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Linux高速缓存使用率调查

Erlang非业余研究 2011-06-01 23:38:35 累计浏览 3,178 次
本机暂存
    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. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  2. 我的 RHCA 之路 (累计阅读 14,014)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,232)
  4. 给程序员新手的一些建议 (累计阅读 13,090)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,013)
  6. 关于linux内存free的一些事情 (累计阅读 12,871)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,691)
  8. Google怎么用linux (累计阅读 12,583)
  9. Linux Used内存到底哪里去了? (累计阅读 11,868)
  10. find命令的一点注意事项 (累计阅读 11,867)