利用系统缓存优化程序的运行效率

Buffer和Cache对系统性能有很大影响,在软件开发的过程中,也可以利用这一点,来优化I/O的性能,提生应用程序的运行效率。

缓存命中率

想利用缓存来提升程序的运行效率,应该怎么评估这个效果尼句话书,有没有那个指标可以衡量缓存使用的好坏br> 缓存的命中率。所谓缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。
命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。
实际上,缓存是现在所有高并发系统必需的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提前读入到内存中。这样,下次访问时就可以直接从内存读取数据,而不需要经过硬盘,从而加快应用程序的响应速度。

这些独立的缓存模块通常会提供查询接口,方便我们随时查看缓存的命中情况。不过Linux系统中并没有直接提供这些接口,有两个工具,cachestat和cachetop,他们正是查看系统缓存命中情况的工具。

  • cachestat 提供了整个操作系统缓存的读写命中情况。
  • cachetop 提供了每个进程的缓存命中情况。

这两个工具都是bcc软件包的一部分,他们基于Linux内核的eBPF机制,来跟踪内核中管理的缓存,并输出缓存的使用和命中情况。
查看工具的使用配置
cachestat 以1秒的而时间间隔,输出了3组缓存统计数据:

指标从左到右依次表示:

  • TOTAL 表示总的I/O次数;
  • MISSES 表示未命中的次数;
  • HITS 表示命中的次数;
  • DIRTIES 表示新增到缓存中的脏页数;
  • BUFFERS_MB 表示Buffers的大小,以MB为单位;
  • CACHED_MB 表示cache的大小,以MB为单位。

cacahetop

输出和top有些类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。具体到每一个指标,这里的HITS、MISSES、DIRTIES,和cachestat里的含义一样
而READ_HIT和WRITE_HIT,分别表示读和写的缓存命中率。

指定文件的缓存大小

除了缓存的命中率外,还有一个指标,那就是指定文件在内存中的缓存大小。可以使用pcstat这个工具,来查看文件在内存中的缓存大小以及缓存比例。
pcstat是一个基于G语言开发的工具,所以安装它之前,首先应该安装Go语言
全部安装完成之后,就可以运行pcstat来查看文件的缓存情况了。
pcstat运行的示例,他展示了/bin/ls这个文件的缓存情况:

这个输出中,Cached就是/bin/ls在缓存中的大小,而 Percent则是缓存的百分比。你看到它们都是0,这说明/bin/ls并不再缓存中。
接着,如果你执行一些ls命令,再运行相同的命令来查看的话,就会发现/bin/ls都在缓存中了:

案例

使用dd命令,dd作为一个磁盘和文件的拷贝工具,经常被拿来测试磁盘或者文件系统的读写性能。
首先打开两个终端,连接到Ubuntu机器上,确保bcc已经安装配置成功。
然后,使用dd命令生成一个临时文件,用于后面的文件读取测试:

在第一个终端运行pcstat命令,确认刚刚生成的文件不再缓存中。如果一切正常,会看到Cached和Percent都是0

在第一个终端中,在运行cachetop命令:

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

从dd的记过可以看出,这个文件的读性能是33.4MB/s。由于在dd命令运行前我们已经清理了缓存,所以dd命令读取速度时,肯定要通过文件系统从磁盘中读取。
不过,这是不是意味着,dd所有的读请求都能直接发送到磁盘
在回到第一个终端,查看cachetop界面的缓存命中情况:

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

看到这次的dd结果,磁盘的读性能居然变成了4.5GB/s,比第一次的结果明显高了太多
然后再回到第一个终端,再次查看cachetop和pcstat的结果

显然,cachetop也有了不少的变化。可以发现,这次的读的缓存命中率是100%,也就是说这次的dd命令全部命中了缓存,所以才会看到这么高的性能
从pcstat的结果可以发现,测试文件file已经被全部缓存了起来,这跟刚才观察到的缓存命中率100%是一致的。
两次的结果说明,系统缓存对第二次dd操作有明显的加速效果,可以大大提高文件读取的性能。

总结

Buffers和Cache可以极大提升系统的I/O性能。通常,我们用缓存命中率,来衡量缓存的使用效率。命中率越高,表示缓存被利用的越充分,应用程序的性能也就越好。
你可以用cachestat和cachetop这两个工具,观察系统和进程的缓存命中情况。其中

  • cacahestat 提供了整个系统缓存的读写命中情况。
  • cachetop 提供了每个进程的缓存命中情况。

不过要注意,Buffers和Cache都是操作系统来管理的,应用程序并不能直接控制这些缓存的内容和生命周期。所以,在应用程序开发中,一般要用专门的缓存组件,来进一步提升性能。
比如,程序内部可以使用堆或者栈明确生命内存空间,来存储需要缓存的数据。再或者,使用Redis这类外部缓存服务,优化数据的访问效率。

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux25109 人正在系统学习中

来源:高haha

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月28日
下一篇 2022年9月28日

相关推荐