系统优化-内存-通过优化buffer和cache来优化程序

  • Buffer:是优化磁盘的读写
  • Cache:是优化文件的读写

    我们的程序可以通过优化Buffer和Cache来提高我们程序的运行效率。所谓工欲善其事必先利其器,我们下面介绍下如何去看我们内存的cache情况。

指标和工具

查看cache的命中情况我们主要会去查看cache的命中率。我们可以使用bcc-tools下的cachestat和cachetop

  • cachestat:统计整体内存的cache情况
  • cachetop:统计进程的内存cache情况
1
2
3
4
5
$ cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
2 0 2 1 17 279
2 0 2 1 17 279
2 0 2 1 17 279
  • TOTAL:表示总的 I/O 次数
  • MISSES:缓存未命中
  • HITS:缓存命中
  • DIRTIES:脏页
  • BUFFERS_MB:buffer的数据
  • CACHED_MB:cache的数据
1
2
3
4
5

$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%

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

还有一个缓存数据的大小的指标我们一般也会很关心,我们可以通过go语言写的pcstat查看

1
2
3
4
5
6
7

$ pcstat /bin/ls
+---------+----------------+------------+-----------+---------+
| Name | Size (bytes) | Pages | Cached | Percent |
|---------+----------------+------------+-----------+---------|
| /bin/ls | 133792 | 33 | 0 | 000.000 |
+---------+----------------+------------+-----------+---------+

这个就是/bin/ls的缓存情况

查找问题思路

我们通过cachetop找到问题的缓存命中率情况,有一种情况缓存命中率很高。但是缓存命中的数据很少【计算方式,HITS命中数*4k,因为缓存死以page为单位存的以page为4k】