缓存预热是一个比较常见的概念,相信很多小伙伴都有所了解。对于 JuiceFS 来说,缓存预热就是将需要操作的数据预先从对象存储拉取到本地,从而获得与使用本地存储类似的性能表现。

缓存预热

JuiceFS 缓存预热是一种主动缓存手段,它可以将高频使用的数据预先缓存到本地,从而提升文件的读写效率。

使用 warmup 子命令预热缓存:

juicefs warmup [command options] [PATH ...]

可用选项:

  • --file-f:通过文件批量指定预热路径
  • --threads-p:并发线程,默认 50 个线程。
  • --background-b:后台运行

只能预热已经挂载的文件系统中的文件,即预热的路径必须在本地挂载点上。

预热一个目录

例如,将文件系统挂载点中的 dataset-1 目录缓存到本地:

juicefs warmup /mnt/jfs/dataset-1

预热多个目录或文件

当需要同时预热多个目录或文件的缓存时,可以将所有路径写入一个文本文件。例如,创建一个名为 warm.txt 的文本文件,每行一个挂载点中的路径:

/mnt/jfs/dataset-1
/mnt/jfs/dataset-2
/mnt/jfs/pics

通过文件批量指定预热路径:

juicefs warmup -f warm.txt

缓存位置

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

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

对于 Linux 系统,要注意默认缓存路径要求管理员权限,普通用户需要有权使用 sudo 才能设置成功,例如:

sudo juicefs mount redis://127.0.0.1:6379/1 /mnt/myjfs

另外,可以在挂载文件系统时通过 --cache-dir 选项设置在当前系统可以访问的任何存储路径上。对于没有访问 /var 目录权限的普通用户,可以把缓存设置在用户的 HOME 目录中,例如:

juicefs mount --cache-dir ~/jfscache redis://127.0.0.1:6379/1 /mnt/myjfs

将缓存设置在速度更快的 SSD 磁盘可以有效提升性能。

内存盘

如果对文件的读性能有更高要求,可以把缓存设置在内存盘上。对于 Linux 系统,通过 df 命令查看 tmpfs 类型的文件系统:

$ df -Th | grep tmpfs
文件系统 类型 容量 已用 可用 已用% 挂载点
tmpfs tmpfs 362M 2.0M 360M 1% /run
tmpfs tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock

其中 /dev/shm 是典型的内存盘,可以作为 JuiceFS 的缓存路径使用,它的容量一般是内存的一半,可以根据需要手动调整容量,例如,将缓存盘的容量调整为 32GB:

sudo mount -o size=32000M -o remount /dev/shm

然后使用该路径作为缓存,挂载文件系统:

juicefs mount --cache-dir /dev/shm/jfscache redis://127.0.0.1:6379/1 /mnt/myjfs

共享目录

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

以 SMB/CIFS 共享为例,使用 cifs-utils 包提供的工具挂载局域网中的共享目录:

sudo mount.cifs //192.168.1.18/public /mnt/jfscache

将共享目录作为 JuiceFS 缓存:

sudo juicefs mount --cache-dir /mnt/jfscache redis://127.0.0.1:6379/1 /mnt/myjfs

多缓存目录

JuiceFS 支持同时设置多个缓存目录,从而解决缓存空间不足的问题,使用 : 分割多个路径,例如:

sudo juicefs mount --cache-dir ~/jfscache:/mnt/jfscache:/dev/shm/jfscache redis://127.0.0.1:6379/1 /mnt/myjfs

设置了多个缓存路径时,客户端会采用 hash 策略向各个缓存路径中均匀地写入数据。

Tips

当设置了多个缓存目录时,--cache-size 选项表示所有缓存目录中的数据总大小。建议不同缓存目录的可用空间保持一致,否则可能造成不能充分利用某个缓存目录空间的情况。

例如 --cache-dir/data1:/data2,其中 /data1 的可用空间为 1GiB,/data2 的可用空间为 2GiB,--cache-size 为 3GiB,--free-space-ratio 为 0.1。因为缓存的写入策略是均匀写入,所以分配给每个缓存目录的最大空间是 3GiB / 2 = 1.5GiB,会造成 /data2 目录的缓存空间最大为 1.5GiB,而不是 2GiB * 0.9 = 1.8GiB

总结

本篇介绍了介绍如何使用 JuiceFS 缓存预热以及缓存位置的选择,该功能能够有效的增加集群的利用率,使得程序一开始运行就具有较好的 IO 读取速度,整体效率上升。

如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)

JuiceFS 缓存预热详解的更多相关文章

  1. JuiceFS 缓存策略详解

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

  2. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

  3. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  4. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...

  5. PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

  6. 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

    <深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面   MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...

  7. 二,PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

  8. hibernate缓存机制详解

    hiberante面试题—hibernate缓存机制详解   这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...

  9. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

随机推荐

  1. Docker容器入门实践

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...

  2. FOC实现概述

    FOC原理框图如下: 其中涉及到两种坐标转换: 1. Clark变换:常规的三相坐标系→静止的二相坐标系α.β 正变换矩阵 $\left[ {\begin{array}{*{20}{c}}{\sqrt ...

  3. MySQL—索引(Index)

    前言: 关于MySql索引数据结构和实现原理的讲解值得阅读一下: 实现原理:https://www.cnblogs.com/songwenjie/p/9415016.htm 索引数据结构:https: ...

  4. 教你识别一些sequence的相关问题

    摘要:通过一些自定义的视图或者查询语句,批量识别集群的sequence相关问题 本文分享自华为云社区<GaussDB(DWS)运维 -- sequence常见运维操作>,作者: 譡里个檔. ...

  5. C#中的类型转换-自定义隐式转换和显式转换

    目录 前言 基础知识 示例代码 实际应用 问题 答案 报错 用户定义的转换必须是转换成封闭类型,或者从封闭类型转换 参考 其他 应用和设计 读音 参考 前言 有时我们会遇到这么一种情况:在json数据 ...

  6. idea 下 Vue

    一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...

  7. Kafka01--Kafka生产者使用方式

    Kafka之--生产者入门 前言: Kafka诞生至今,产生两个版本的生产者客户端:1是早期基于scala语言编写的客户端:2是随着Java用户的广泛涌入,kafka0.9版本开始退出Java版本的客 ...

  8. python django对数据表的增删改查操作

    新增操作:方式1:book = BookInfo(title='西游记',price=99)book.save() 方式2:BookInfo.objects.create(title='西游记',pr ...

  9. 怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?

    public int compareTo(Student o) { return this.age - o.age; // 比较年龄(年龄的升序)    } 应该理解成return (-1)×(thi ...

  10. 获取Java数据库中结果集的每个字段名和个数

    /** * 查询到多条数据, 封装到List<Map> */public List<Map<String, Object>> queryForMapList(Str ...