七叶笔记 » golang编程 » Kafka性能分析利器!Linux系统PageCache缓存命中率工具

Kafka性能分析利器!Linux系统PageCache缓存命中率工具

背景

日常工作中对IO密集型服务(如:MySql、 Kafka ElasticSearch Cassandra )进行性能调优时,一个常见的问题就是:”is Linux caching my data or not?”。缓存是现在所有高并发系统必需的核心模块,主要作用就是把经常访问的数据(也就是热点数据),提前读入到内存中。这样,下次访问时就可以直接从内存读取数据,而不需要经过硬盘,从而加快应用程序的响应速度。命中率越高,表示使用 缓存 带来的收益越高,应用程序的性能也就越好。

虽然LinuxFTools的fincore应用程序实现了相应功能,但是已被放弃且存在一些构建问题。国外有个女士Amy Tobey为了让Apache Cassandra用户能够看到ssTables是否正在被缓存,基于go语言实现了pcstat(get page cache statistics for files)。

关于Linux PageCache原理与调优,可以查看

安装方法1:编译安装PCSTAT

下载安装配置GOLANG

 [root@felixzh pkg]# wget 
[root@felixzh pkg]# tar -xvf go1.17.6.linux-amd64.tar.gz
#配置如下环境变量
 export  GOROOT=/home/pkg/go
export PATH=$GOROOT/bin:$PATH
#验证go安装配置成功
[root@felixzh pkg]# go version
go version go1.17.6 linux/amd64  

下载编译安装pcstat

 [root@felixzh pkg]#  go  get golang.org/x/sys/unix
[root@felixzh pkg]# go get github.com/tobert/pcstat/pcstat  

安装方法2:免编译安装PCSTAT

 [root@felixzh pkg]# wget 
[root@felixzh pkg]# tar -xvf pcstat-0.0.1-Linux-x86_64.tar.gz  

pcstat命令介绍

 [root@felixzh pkg]# ./pcstat
Usage of ./pcstat:
  -bname
        convert  paths to basename to narrow the output
  -histo
       print a simple histogram instead of raw data
  - json 
       return data in JSON format
  -nohdr
       omit the header from terse & text output
  -pid int
       show all open maps for the given pid
  -plain
       return data with no box characters
  -pps
        include  the per-page status in JSON output
  -sort
       sort output by cached pages desc
  -terse
       show terse output
  -unicode
       return data with unicode box characters  

使用案例

以默认格式查看 PageCache

 [root@felixzh pkg]# ./pcstat  /home/kafka-logs/d-*/000000000*.log  

以Json格式查看PageCache

 [root@felixzh pkg]# ./pcstat -json /home/kafka-logs/d-0/00000000000000000000.log|jq  

以直方图格式查看PageCache

 [root@felixzh pkg]# ./pcstat -bname -histo  /home/kafka-logs/d-*/000000000*  

测试案例

判断此工具是否有效的最简单方法是写文件、删除缓存、读取文件以将内容放入缓存。

  1. 使用dd命令生成一个10M大小的文件
 [root@felixzh pkg]# dd if=/dev/urandom of=testfile bs=1M count=10  

  1. 查看该文件 test file的缓存情况
 [ root @felixzh pkg]# ./pcstat testfile  

可以看出testfile文件大小是10485760(即10M)、占用Pages数目为2560、缓存Pages数目为2560、缓存比例100%。强调一点,上图Pages和Cached都是Page的数量,并不是文件大小。Linux操作系统默认每个Page大小(即PageSize)为4096Byte。可以看出:10485760(即10M)=2560*4096Byte。PS:可以通过命令查看每个Page大小(即PageSize)。

 [root@felixzh pkg]# getconf PAGESIZE
4096  
  1. 然后,手动触发删除PageCache。
 [root@felixzh pkg]# echo 1 |sudo tee /proc/sys/vm/drop_caches
1  
  1. 再次查看testfile文件的缓存情况​
 [root@felixzh pkg]# ./pcstat testfile  

可以看出,testfile文件缓存内容已经清空。

总结

经过实测验证,pcstat工具方便易用,直接下载go 可执行文件 即可,对于Kafka性能问题排查帮助很大。

相关文章