cachefilesd本地缓存验证及性能异常问题咨询
看起来你已经做了不少基础验证工作,但遇到了cachefilesd缓存似乎没按预期生效的困惑,我来帮你拆解下可能的原因和验证方法:
一、为什么开启cachefilesd且加网络延迟后,第二次复制还是慢?
这种情况大概率是cachefilesd的本地磁盘缓存根本没被命中,或者系统/服务器端的其他缓存机制盖过了它的作用,具体可能的原因:
Linux系统页缓存的干扰
就算你配置了cachefilesd,Linux本身会对NFS挂载的文件做内存页缓存。第一次复制后文件会存在内存里,第二次读取直接从内存拿,所以速度快。但你加延迟后第二次复制还是慢,可能是你在两次测试之间清空了页缓存(比如执行了echo 3 > /proc/sys/vm/drop_caches),这时候系统只能重新从NFS服务器取——而服务器端本身也有缓存,所以第二次请求服务器响应快了,加上400ms的往返延迟,总时间就卡在800ms-1s左右,和cachefilesd开没开没关系。cachefilesd的缓存未正确生效
你看到/var/cache/fscache有内容,不代表缓存能被正确命中,可能的问题点:/var/cache/fscache的权限配置不对:cachefilesd需要对这个目录有读写权限,可以用ls -ld /var/cache/fscache检查,通常应该属于cachefiles用户组。- NFS挂载的fsc选项未正确关联fscache:比如NFS版本不兼容(比如某些老版本NFSv3对fscache支持有限),或者挂载时同时用了
noac(禁用属性缓存)这类会干扰fscache的选项。 - cachefilesd服务有隐性错误:可以查看日志
journalctl -u cachefilesd,看看有没有缓存命中失败、权限报错之类的信息。
NFS服务器端缓存的影响
你之前怀疑的服务器端缓存确实可能是关键:第一次请求后,服务器把文件存在自己的内存/磁盘缓存里,第二次请求时直接从本地返回,就算客户端加了400ms延迟,往返一次加上服务器的快速响应,总时间就会是800ms左右,这和客户端的cachefilesd是否开启无关。
二、如何确认文件是否从本地cachefilesd缓存读取?
给你几个实用的验证方法:
查看fscache统计数据
执行cat /proc/fs/fscache/stats,里面会有hits(命中数)、misses(未命中数)等统计项。在第一次复制前记录数值,复制后再看;第二次复制后再对比,如果hits数值增加,说明缓存命中了。
也可以查看挂载卷的状态:cat /proc/fs/fscache/volumes,确认对应的NFS卷的缓存状态是active。抓包验证网络流量
用tcpdump -i eth0 port nfs抓NFS相关的网络包。如果第二次复制时没有产生NFS流量,说明是从本地缓存读取的;如果有流量,那就是还在从服务器拿数据,cachefilesd没生效。手动修改缓存文件验证
在第一次复制后,找到/var/cache/fscache下对应NFS文件的缓存文件(可以用find /var/cache/fscache -size 4M定位),手动修改它的内容(比如用echo "test" >> 缓存文件路径)。然后第二次复制这个NFS文件到本地,如果复制后的文件包含你加的内容,说明是从本地缓存读取的;如果还是原内容,说明缓存没生效。查看cachefilesd日志
执行journalctl -u cachefilesd -f实时跟踪日志,然后执行第二次复制操作,如果日志里出现类似“cache hit”“retrieving from cache”之类的条目,就说明缓存命中了。
额外的排查建议
测试前彻底清空所有缓存:每次测试前先执行这些操作:
systemctl stop cachefilesd echo 3 > /proc/sys/vm/drop_caches rm -rf /var/cache/fscache/* systemctl start cachefilesd mount -o remount,fsc /你的NFS挂载点这样可以完全排除之前的缓存干扰,确保测试的是cachefilesd的真实效果。
测试更大的文件:4M的文件太小,很容易被系统页缓存完全容纳。试试复制100M以上的文件,系统页缓存存不下,第二次读取就会被迫使用cachefilesd的磁盘缓存,这时候加网络延迟的话,第二次复制的速度应该会比第一次快很多。
检查NFS服务器配置:登录NFS服务器,查看
/etc/exports里有没有no_cache之类的禁用缓存选项,或者用cat /proc/meminfo查看服务器的页缓存使用情况,确认是不是服务器端缓存导致的第二次请求加速。
备注:内容来源于stack exchange,提问作者astre

