Linux虚拟内存、buffer、cache、缓存命中率、缓存文件大小
cachetop

跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命 中情况。具体到每一个指标,这里的 HITS、MISSES 和 DIRTIES ,跟 cachestat 里的含义 一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。而 READ_HIT 和 WRITE_HIT ,分别表示读和写的缓存命中率。
指标–文件在内存中的缓存大小
pcstat
使用 pcstat 这个工具,来查看文件在内存中的缓存大小以及缓存比例。pcstat 是一个基于 Go 语言开发的工具,所以安装它之前,你首先应该安装 Go 语言

展示了 /bin/ls 这个文件的缓存情况:Cached 就是 /bin/ls 在缓存中的大小,而 Percent 则是缓存的百分比。你看 到它们都是 0,这说明 /bin/ls 并不在缓存中。

ls 命令,再运行相同的命令来查看的话,就会发现 /bin/ls 都在缓 存中了

实验
新建文件–第一个终端

确认刚刚生成的文件不在缓存中。如果一切正常, 你会看到 Cached 和 Percent 都是 0


读文件–第二个终端
运行 dd 命令测试文件的读取速度:

这个文件的读性能是 33.4 MB/s。由于在 dd 命令运行前我们已经 清理了缓存,所以 dd 命令读取数据时,肯定要通过文件系统从磁盘中读取。
查看第一个终端 缓存命中情况:
cachetop

从 cachetop 的结果可以发现,并不是所有的读都落到了磁盘上,事实上读请求的缓存命中 率只有 50% 。
先切换到第二个终端,再次执行刚才的 dd 命令:

磁盘的读性能居然变成了 4.5 GB/s,比第一次的结果 明显高了太多。
回到第一个终端,看看 cachetop 的情况:这次的读的缓存命中率是 100.0%,也 就是说这次的 dd 命令全部命中了缓存,所以才会看到那么高的性能。

回到第二个终端,再次执行 pcstat 查看文件 file 的缓存情况:

测试文件 file 已经被全部缓存了起来,这跟刚才观察到的缓 存命中率 100% 是一致的。
总结
Buffers 和 Cache 都是操作系统来管理的,应用程序并不能直接控制这些缓 存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升 性能。
比如,程序内部可以使用堆或者栈明确声明内存空间,来存储需要缓存的数据。再或者,使 用 Redis 这类外部缓存服务,优化数据的访问效率。