cachetop

1625618193246-9f4111ed-b313-49fb-9596-0be2ddd764ef.png

跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命 中情况。具体到每一个指标,这里的 HITS、MISSES 和 DIRTIES ,跟 cachestat 里的含义 一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。而 READ_HIT 和 WRITE_HIT ,分别表示读和写的缓存命中率。

指标–文件在内存中的缓存大小

pcstat

使用 pcstat 这个工具,来查看文件在内存中的缓存大小以及缓存比例。pcstat 是一个基于 Go 语言开发的工具,所以安装它之前,你首先应该安装 Go 语言

1625618707372-4a9a3a65-3862-4650-bd48-69c48c122dd6.png

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

1625618727314-24dedff2-7884-4919-8edb-bfdfedf29d7c.png

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

1625618775127-82a3dd1e-cfaa-4b22-9224-997cf2786959.png

实验

新建文件–第一个终端

1625618909442-250b28f1-3f31-4b31-a756-3ce79f3bf7e6.png

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

1625618933976-e361048e-f228-4cb8-82c3-4c9604f8f8e9.png

1625618973650-28c362e6-5caf-403e-a834-7278cf02de7a.png

读文件–第二个终端

运行 dd 命令测试文件的读取速度:

1625619001834-4ce4d030-c03c-4c7c-a24f-4181881b2972.png

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

查看第一个终端 缓存命中情况:

cachetop

1625619126449-d7f021d6-ff56-4667-b597-0e1c536e5b44.png

从 cachetop 的结果可以发现,并不是所有的读都落到了磁盘上,事实上读请求的缓存命中 率只有 50% 。

先切换到第二个终端,再次执行刚才的 dd 命令:

1625619173943-a3b0e017-3710-4267-b408-800e469beeab.png

磁盘的读性能居然变成了 4.5 GB/s,比第一次的结果 明显高了太多。

回到第一个终端,看看 cachetop 的情况:这次的读的缓存命中率是 100.0%,也 就是说这次的 dd 命令全部命中了缓存,所以才会看到那么高的性能。

1625619195230-d90684c0-41d4-4965-a5e6-fc2f79c1b150.png

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

1625619251136-19c1f7dc-f381-4e4e-9d6b-a45580552f32.png

测试文件 file 已经被全部缓存了起来,这跟刚才观察到的缓 存命中率 100% 是一致的。

总结

Buffers 和 Cache 都是操作系统来管理的,应用程序并不能直接控制这些缓 存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升 性能。

比如,程序内部可以使用堆或者栈明确声明内存空间,来存储需要缓存的数据。再或者,使 用 Redis 这类外部缓存服务,优化数据的访问效率。