有没有办法在Linux中获取块设备的Cache Hit / Miss比率?

是否有可能在Linux中看到有多less来自用户空间的读取和写入请求最终导致caching命中和未命中块设备?

您可以开发自己的SystemTap脚本。 您需要考虑以下两个子系统:

  • VFS:这代表缓冲区caching之前的所有I / O请求(即绝对每个I / O请求); 检查“vfs.read”,“vfs.write”和“kernel.function(”vfs_ *“)”探针; 您需要通过各自的主+次号码过滤出要监视的块设备。
  • 块:这代表在I / O调度器之前发送到块设备的所有I / O请求(其也合并+重新sortingI / O请求); 在这里我们知道哪些请求被缓冲区caching遗漏; 查看“ioblock.request”探针。

SystemTap开发需要一些时间来学习。 如果你是一个中等程度的开发人员,对Linux有很好的了解,那么你应该在3-4天内完成。 是的,学习需要时间,但结果会让你非常满意–SystemTap让你有机会(安全地)将探测器放在Linux内核的任何地方。

请注意,您的内核必须支持加载和卸载内核模块。 现在大多数股票内核都支持这一点。 您还需要安装内核的debugging符号。 对于我的Ubuntu系统,这就像下载一个几百MB的.deb文件一样简单,Ubuntu内核开发团队为我编译。 例如,在SystemtapOnUbuntu Wiki页面中对此进行了解释。

PS只有在没有其他解决scheme的情况下,才能采用SystemTap方法,因为这是一个全新的框架,您必须学习,这样会花费时间/金钱,有时会感到沮丧。

我继续为此写了一个stap脚本。 在systemtap wiki上有一个,但它似乎不正确。 在基本testing中,这看起来相当准确,但是YMMV。

#! /usr/bin/env stap global total_bytes, disk_bytes, counter probe vfs.read.return { if (bytes_read>0) { if (devname=="N/A") { } else { total_bytes += bytes_read } } } probe ioblock.request { if (rw == 0 && size > 0) { if (devname=="N/A") { } else { disk_bytes += size } } } # print VFS hits and misses every 5 second, plus the hit rate in % probe timer.s(5) { if (counter%15 == 0) { printf ("\n%18s %18s %10s %10s\n", "Cache Reads (KB)", "Disk Reads (KB)", "Miss Rate", "Hit Rate") } cache_bytes = total_bytes - disk_bytes if (cache_bytes < 0) cache_bytes = 0 counter++ hitrate = 10000 * cache_bytes / (cache_bytes+disk_bytes) missrate = 10000 * disk_bytes / (cache_bytes+disk_bytes) printf ("%18d %18d %6d.%02d%% %6d.%02d%%\n", cache_bytes/1024, disk_bytes/1024, missrate/100, missrate%100, hitrate/100, hitrate%100) total_bytes = 0 disk_bytes = 0 } 

/ proc / slabinfo是一个很好的开始,但并不能给你提供很多你想要的信息(不要被多核和统计启用的系统中的命中率错过百分比所迷惑;这些是别的)。 据我所知,没有办法将特定的信息从内核中提取出来,尽pipe编写一些代码不是非常困难。

编辑: http : //www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html

现在有来自perf-tools包的cachestat 工具 。

作者还列出了一些(可能更为粗略的)人们使用的替代scheme:

A)通过使用iostat(1)来监视磁盘读取,并假设这些是caching未命中,而不是例如O_DIRECT,研究页面caching未命中率。 缺失率通常比比率更重要,因为失误与应用程序痛苦成正比。 也可以使用free(1)查看caching大小。

B)删除页面caching(echo 1> / proc / sys / vm / drop_caches),并测量性能会变差多less! 我喜欢使用一个负面的实验,但这当然是一个痛苦的方式来阐明caching使用情况。

C)使用sar(1)并研究轻微和重大缺陷。 我不认为这有效(例如,常规的I / O)。

D)使用cache-hit-rate.stp SystemTap脚本,这是InternetsearchLinux页面caching命中率中的第二个。 它在VFS接口中将堆栈中的高速caching访​​问设置为高,以便可以看到对任何文件系统或存储设备的读取。 caching未命中通过磁盘I / O进行测量。 这也错过了一些工作量types(有些在该页面的“课程”中提到),并且调用比率“率”。

如果您对特定进程的IO命中/未命中比率感兴趣,一个简单但非常有效的方法是读取/proc/<pid>/io文件。

在这里你会发现4个关键值:

  • rchar :从应用程序的angular度来看读取字节的总数(即:从物理存储而不是从caching中读取的读取之间没有区别)
  • wchar :如上所述,但写入字节
  • read_bytes真正从存储子系统读取的字节
  • write_bytes真正写入存储子系统的字节

说一个过程有以下值:

 rchar: 1000000 read_bytes: 200000 

读caching失败率(以字节为单位)为100*200000/1000000 = 20% ,命中率为100-20 = 80%

但是有一个问题: rchar值包括tty IO,所以对于从pipe道读取/写入很多的进程,上面的计算会产生偏斜,报告的命中率比有效的高。