挂载桶到本地后执行 ls,一个三千个文件的目录卡 30 秒才出结果,第二次快一些。应用日志里每次打开文件都要几百毫秒。日志里能对上时间点,这种反而好排。

ls 会触发一次列对象请求,分页拉完整个前缀。每次 stat 都是网络往返,本地没有元数据缓存。默认缓存时间很短,应用反复访问同一个目录就反复回源。这一点先确认清楚,后面就不用反复试。

s3fs b /mnt/s3 -o passwd_file=/etc/passwd-s3fs \
-o stat_cache_expire=300 -o use_cache=/var/cache/s3fs -o ro
ls /mnt/s3 | wc -l

「s3fs 挂载卡顿」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:开启 stat_cache 和目录缓存 调大过期时间;打开 use_cache 把常用文件落到本地盘;应用侧避免遍历目录 直接按 key 访问;只读场景加 ro 挂载 减少回写检查。

结果对不对很好判断,第二次 ls 在 1 秒内返回,应用打开文件的耗时降到几十毫秒。

作者 9823189