【JuiceFS】理解juicefs缓存

1. 简介

对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技术可以大大降低存储操作的延时并提高数据吞吐量。

JuiceFS 提供包括元数据缓存、数据读写缓存等多种缓存机制。

【学会思考】上面我们知道了缓存的优势,为什么要引入缓存。还要考虑我们的应用场景 ,真的需要缓存吗?缓存提升性能的前提是什么?

数据缓存可以有效地提高随机读的性能,对于像 Elasticsearch、ClickHouse 等对随机读性能要求更高的应用,建议将缓存路径设置在速度更快的存储介质上并分配更大的缓存空间。

然而缓存能提升性能的前提是,你的应用需要反复读取同一批文件。如果你确定你的应用对数据是「读取一次,然后再也不需要」的访问模式(比如大数据的数据清洗常常就是这样),可以关闭缓存功能,省去缓存不断建立,又反复淘汰的开销。

2. 数据一致性

在这里插入图片描述

3.元数据缓存

在这里插入图片描述

4. 读写缓冲区

  • 4.1概念

在这里插入图片描述

  • 4.2预读和预取

在这里插入图片描述

  • 4.3写入

在这里插入图片描述

  • 4.4观测和调优

在这里插入图片描述

5. 数据缓存

在这里插入图片描述

5.1内核页缓存

在这里插入图片描述

5.2内核回写模式

在这里插入图片描述

5.3客户端读缓存

在这里插入图片描述
以下是缓存配置的关键参数(完整参数列表见 juicefs mount):

–prefetch

并发预读 N 个块(默认 1)。所谓预读(prefetch),就是随机读取文件任意一小段,都会触发对应的整个对象存储块异步完整下载。预读往往能改善随机读性能,但如果你的场景的文件访问模式无法利用到预读数据(比如 offset 跨度极大的大文件随机访问),预读会带来比较明显的读放大,可以考虑设为 0 以禁用预读特性。

JuiceFS 还内置着另一种类似的预读机制:在顺序读时,会提前下载临近的对象存储块,这在 JuiceFS 内称为 readahead 机制,能有效提高顺序读性能。Readahead 的并发度受「读写缓冲区」的大小影响,读写缓冲区越大并发度越高。

–cache-dir

缓存目录,默认为 /var/jfsCache 或 $HOME/.juicefs/cache。请阅读「缓存位置」了解更多信息。

如果急需释放磁盘空间,你可以手动清理缓存目录下的文件,缓存路径为 //raw/。

–cache-size 与 --free-space-ratio

缓存空间大小(单位 MiB,默认 102400)与缓存盘的最少剩余空间占比(默认 0.1)。这两个参数任意一个达到阈值,均会自动触发缓存淘汰,使用的是类似于 LRU 的策略,即尽量清理较早且较少使用的缓存。

实际缓存数据占用空间大小可能会略微超过设置值,这是因为对同样一批缓存数据,很难精确计算它们在不同的本地文件系统上所占用的存储空间,JuiceFS 累加所有被缓存对象大小时会按照 4KiB 的最小值来计算,因此与 du 得到的数值往往不一致。

–cache-partial-only

只缓存小文件和随机读的部分,适合对象存储的吞吐比缓存盘还高的情况。默认为 false。

读一般有两种模式,连续读和随机读。对于连续读,一般需要较高的吞吐。对于随机读,一般需要较低的时延。当本地磁盘的吞吐反而比不上对象存储时,可以考虑启用 --cache-partial-only,这样一来,连续读虽然会将一整个对象块读取下来,但并不会被缓存。而随机读(例如读 Parquet 或者 ORC 文件的 footer)所读取的字节数比较小,不会读取整个对象块,此类读取就会被缓存。充分地利用了本地磁盘低时延和网络高吞吐的优势。

5.4客户端写缓存

在这里插入图片描述
如果你的场景需要写入大量临时文件,不需要持久化和分布式访问,也可以用 --upload-delay 参数来设置延缓数据上传到对象存储,如果在等待的时间内数据被应用删除,则无需再上传到对象存储,既提升了性能也节省了成本。相较于本地硬盘而言,JuiceFS 提供了后端保障,在缓存目录容量不足时依然会自动将数据上传,确保在应用侧不会因此而感知到错误。

挂载时加入 --writeback 参数,便能开启客户端写缓存,但在该模式下请注意:

本地缓存本身的可靠性与缓存盘的可靠性直接相关,如果在上传完成前本地数据遭受损害,意味着数据丢失。因此对数据安全性要求越高,越应谨慎使用。
待上传的文件默认存储在 /var/jfsCache//rawstaging/,只要该目录不为空,就表示还有待上传的文件。务必注意不要删除该目录下的文件,否则将造成数据丢失。
写缓存大小由 --free-space-ratio 控制。默认情况下,如果未开启写缓存,JuiceFS 客户端最多使用缓存目录 90% 的磁盘空间(计算规则是 (1 - free-space-ratio) * 100)。开启写缓存后会超额使用一定比例的磁盘空间,计算规则是 (1 - (free-space-ratio / 2)) * 100,即默认情况下最多会使用缓存目录 95% 的磁盘空间。
写缓存和读缓存共享缓存盘空间,因此会互相影响例如写缓存占用过多磁盘空间,那么将导致读缓存的大小受到限制,反之亦然。
如果本地盘写性能太差,带宽甚至比不上对象存储,那么 --writeback 会带来更差的写性能。

如果缓存目录的文件系统出错,客户端则降级为同步写入对象存储,情况类似客户端读缓存。
如果节点到对象存储的上行带宽不足(网速太差),本地写缓存迟迟无法上传完毕,此时如果在其他节点访问这些文件,则会出现读错误。低带宽场景的排查请详见「与对象存储通信不畅」。
也正由于写缓存的使用注意事项较多,使用不当极易出问题,我们
推荐仅在大量写入小文件时临时开启
,比如:

解压包含大量小文件的压缩文件
软件编译
大数据任务的临时存储场景,比如 Spark shuffle
启用 --writeback 模式后,除了直接查看 /var/jfsCache//rawstaging/ 目录,还可以通过以下命令确定文件上传进度:

假设挂载点为 /jfs

$ cd /jfs
$ cat .stats | grep "staging"
juicefs_staging_block_bytes 1621127168  # 待上传的数据块大小
juicefs_staging_block_delay_seconds 46116860185.95535
juicefs_staging_blocks 394  # 待上传的数据块数量

5.5缓存位置

取决于操作系统,JuiceFS 的默认缓存路径如下:

Linux:/var/jfsCache
macOS:$HOME/.juicefs/cache
Windows:%USERPROFILE%.juicefs\cache

  • 内存盘

如果对文件的读性能有更高要求,可以把缓存设置在内存盘上。

  • 共享目录

SMB、NFS 等共享目录也可以用作 JuiceFS 的缓存,对于局域网有多个设备挂载了相同 JuiceFS 文件系统的情况,将局域网中的共享目录作为缓存路径,可以有效缓解多个设备重复预热缓存的带宽压力。

  • 多缓存目录

JuiceFS 支持同时设置多个缓存目录,从而解决缓存空间不足的问题。

6. 参考

JuiceFS官网-社区版文档-核心特性-缓存

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值