背景
日常工作中对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*
测试案例
判断此工具是否有效的最简单方法是写文件、删除缓存、读取文件以将内容放入缓存。
- 使用dd命令生成一个10M大小的文件
[root@felixzh pkg]# dd if=/dev/urandom of=testfile bs=1M count=10
- 查看该文件 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
- 然后,手动触发删除PageCache。
[root@felixzh pkg]# echo 1 |sudo tee /proc/sys/vm/drop_caches
1
- 再次查看testfile文件的缓存情况
[root@felixzh pkg]# ./pcstat testfile
可以看出,testfile文件缓存内容已经清空。
总结
经过实测验证,pcstat工具方便易用,直接下载go 可执行文件 即可,对于Kafka性能问题排查帮助很大。