s3fs下载的文件未存储到指定缓存目录的原因是什么?
s3fs未生成磁盘缓存的原因说明
- 内核页缓存优先级高于s3fs磁盘缓存
你将文件写入s3fs挂载点时,数据会首先暂存在Linux内核的页缓存(Page Cache)中,此时你立刻读取该文件,内核会直接从内存返回数据,不会触发s3fs的读逻辑,自然不会走磁盘缓存写入流程,也不会发起S3下载请求。就算你重新挂载s3fs,只要内核的页缓存还没有被系统回收,读操作仍然会直接从内存取数据,不会和S3交互也不会写磁盘缓存。
重启之后内存页缓存被清空,所以第一次读会触发S3下载,和你观察到的现象一致。 use_cache参数有触发前提,未满足条件时不会写入磁盘
要触发磁盘缓存写入,必须同时满足以下条件:
- 实际发生了从S3服务端拉取数据的读请求(内存缓存未命中)
- s3fs运行身份对指定的
/tmp缓存目录有读写权限 - 缓存目录剩余空间大于
ensure_diskfree参数的阈值,s3fs默认该值为100MB,也就是说如果/tmp剩余空间低于100MB + 待缓存文件大小,s3fs会直接放弃写入磁盘缓存,数据仅在内存中流转 - 挂载时未开启
direct_io等会绕开用户态缓存的参数
- 缓存文件存在形式容易被忽略
s3fs的磁盘缓存文件默认以对象的ETag值命名,且在读写过程中会使用临时文件名,如果你在文件读取过程中检查/tmp,可能看不到完整的缓存文件。部分版本的s3fs还会将缓存文件放在/tmp下的隐藏子目录中,你可以执行ls -la /tmp排查是否有相关隐藏目录或文件。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

