遇到一个奇怪的问题,我们的程序有时候会很慢,但无法重现,只是偶尔很慢。
后来发现是linux的文件cache引起的。linux第一次读一个文件,是从磁盘读的,速度会比较慢,后面再读,只要这个文件还在系统的cache里就会很快。
我们读的磁盘是nas的,2.3GB的文件,第一次无cache,读取平均73.2s,而后的读取就有cache了,读取平均18.7s。有cache后读取时间只有无cache读取的1/4多点。
但如果我们读的是ssd的盘,没有cache也可以很快,同样上面的2.3GB文件,无cache读取平均19.1s。仅多用了2%的时间。
因为linux的cache是有自己的调度算法,所以我们的文件过一段时间可能就不在cache里了,这个时候,再读取这些文件就很慢。
怎么测试无cache读取文件的性能呢?清cache:
sync
echo 3 > /proc/sys/vm/drop_caches
清cache前,用free -h看看,注意mem的倒数第二个参数(buff/cache)
$ free -h
total used free shared buff/cache available
Mem: 125G 12G 95G 1.2G 17G 110G
Swap: 0B 0B 0B
清完后,再free -h:
$ free -h
total used free shared buff/cache available
Mem: 125G 13G 109G 1.2G 2.1G 109G
Swap: 0B 0B 0B
可以,看到buff/cache数值的变化。
然后第一次读你需要的文件,就是无cache读的。后面再读,就是有cache了,读取很快了,如果没有其他人,你也没读其他文件,这个文件你读几百遍都一直很快。
ssd硬盘的接口有
SATA
mSATA(mini-SATA)
M.2
PCI-E
U.2
等,我上面测试的ssd是比较普通的SATA3接口,速度已经很不错了。