JYCache/README.md

154 lines
7.5 KiB
Markdown
Raw Normal View History

2024-07-30 15:12:11 +08:00
# JYCache
2024-08-01 16:35:05 +08:00
**九源缓存存储系统简称JYCache** 是一款面向个人使用、大模型训练推理等多种场景适配大容量对象存储等多种底层存储形态高性能、易扩展的分布式缓存存储系统。通过层次化架构、接入层优化、I/O优化等多种组合优化JYCache 不仅支持文件顺序/随机读写,其读写性能也领先国际主流产品 Alluxio。JYCache 现支持在 X86Intel、AMD、海光等及 ARM鲲鹏、飞腾等平台下运行。
缓存存储系统面向个人使用及集群使用等场景,可为用户提供以下两种运行模式:
1. **单机对象加速**:将 S3 对象存储通过 POSIX 接口挂载到本地像本地磁盘一样进行读写访问。S3 上的一个完整对象对应本地的一个文件,通过对象名构造目录树结构。进一步地,热点数据可缓存于本地的 DRAM/SSD通过减少与 S3 的数据交互操作,可提升文件系统性能。
2. **分布式对象加速**:将 S3 对象存储通过 POSIX 接口挂载到本地像本地磁盘一样进行读写访问。S3 上的一个完整对象对应本地的一个文件,通过对象名构造目录树结构。热点数据呈现两级缓存结构,除各个客户端内部 DRAM/SSD 缓存外,还提供一层共享的 DRAM/SSD 缓存,进一步提高缓存命中率,提升并发读等场景下的 IO 性能。
## 主要特性
- **兼容 POSIX 接口**。通过 FUSE 或动态库劫持技术,应用程序无需重新编译即可立即实现缓存存储加速。
- **高可用缓存写**。数据写入缓存层即可视为持久化,通过多副本、纠删码机制实现缓存层内数据高可用,降低下层存储系统压力,提高 I/O 性能。
- **支持用户态零拷贝 I/O**。动态库劫持技术Syscall intercept实现全用户态 I/O降低上下文切换和拷贝实现极限性能。
- **层次化缓存存储**。本地缓存与计算任务同机部署,使用高速共享缓存可为用户进程提供高达 45GB/s 的缓存带宽;为进一步提高分布式系统缓存效率,可额外部署全局缓存服务,通过与多个本地缓存相关联,进一步提高缓存命中率。
- **易于扩展和集成**。本地缓存与全局缓存采用模块化设计,可依据业务需要实现多样的组合。
- **兼容多种平台**。支持在 X86Intel、AMD、海光等及 ARM鲲鹏、飞腾等平台下运行。
## 系统架构
2024-08-02 16:33:14 +08:00
![](doc/image/JYCache_architecture.PNG)
2024-08-01 16:35:05 +08:00
在单机对象加速部署模式下,对象存储可通过 FUSE基于S3FS(V1.94)实现) 或系统调用劫持等方式挂载到本地,用户可像本地磁盘一样进行读写访问。对象存储系统上的一个完整对象对应本地的一个文件,通过对象名构造目录树结构。热点数据可缓存于本地的 DRAM/SSD通过减少与对象存储系统的数据交互操作可提升文件系统性能。
在分布式对象加速模式下,热点数据呈现两级缓存结构,除各个客户端内部 DRAM/SSD 缓存外,还提供一层共享的 DRAM/SSD 缓存,进一步提高缓存命中率,提升并发读等场景下的 IO 性能。
缓存存储系统的两个核心部件是客户端缓存模块及全局缓存模块。客户端缓存模块内部包含写缓存、读缓存。客户端缓存模块按需向全局缓存服务器发出 RPC 通信请求实现数据的传递。全局缓存服务器包含写缓存和读缓存其中写缓存提供多副本等高可用模式。当用户发出下刷fsync请求时写数据会落入此处可容忍少量全局缓存服务器故障时不丢失写入的数据。无论是读缓存还是写缓存都会按需调用数据源访问组件访问对象存储等底层存储资源从而轻松适配其他类型的底层存储。
此外在intercept模式的缓存系统中我们采用了client-server+中间件架构利用系统调用拦截技术捕获POSIX请求将posix请求封装后发送至服务器处理处理完成后返回至客户端。通过绕过FUSE内核模块和采用零拷贝中间件最大限度地减少了数据拷贝和系统开销不仅确保了与常见posix接口的兼容还显著提升了系统性能尤其在读写密集的场景中避免了数据的重复拷贝性能优势明显。
## 系统性能
顺序读性能使用 FIO 测试工具,带宽数据如下表所示:
| BS | 优化前 | JYCache(FUSE) | JYCache(intercept) |
| ------------ | ------------ | ------------ | ------------ |
| 4K | 761MiB/s | 933MiB/s | 3576MiB/s |
| 16K | 706MiB/s | 3643MiB/s | 11.6GiB/s |
| 128K | 2268MiB/s | 22.6GiB/s | 38GiB/s |
顺序写性能使用 FIO 测试工具,带宽数据如下表所示:
| BS | 优化前 | JYCache(FUSE) | JYCache(intercept) |
| ------------ | ------------ | ------------ | ------------ |
| 4K | 624MiB/s | 1226MiB/s | 2571MiB/s |
| 16K | 2153MiB/s | 5705MiB/s | 9711MiB/s |
| 128K | 7498MiB/s | 23.5GiB/s | 31.2GiB/s |
## 系统构建
**环境要求**
- GCC 9.3.0
- GLIBC 2.31
- CMake 3.7
- C++ 17
- FUSE >= 2.6
**从源码构建**
直接在根目录下运行build.sh脚本
```bash
sh build.sh
```
*在build.sh脚本中会自动下载第三方依赖。*
**系统安装**
编译完成后在根目录下运行install.sh脚本
```bash
sh install.sh
```
## 快速使用
执行install.sh脚本后会在当前目录下构建JYCache运行环境其目录为JYCache_Env。下述使用方法均以JYCache_Env为根目录。
**一、JYCache普通模式不启用全局缓存**
修改conf/newcache.conf配置文件中的`UseGlobalCache=0`
```bash
# 1.启动minio
cd ./minio && sh start.sh && cd ..
# 2.启动s3fs
sh start_s3fs.sh
```
启动完成后,在挂载目录 ./mnt 下的文件操作均为JYCache控制。
*注:需要在此模式下,在挂载目录 ./mnt 创建文件夹testdir此为intercept模式所需。*
**关闭服务**
```bash
sh stop_s3fs.sh
cd ./minio && sh stop.sh && cd ..
```
**二、JYCache普通模式启用全局缓存**
修改conf/newcache.conf配置文件中的`UseGlobalCache=1`
```bash
# 1.启动minio
cd ./minio && sh start.sh && cd ..
# 2.启动etcd
sh start_etcd.sh
# 3.启动全局缓存
sh start_global.sh
# 4.启动s3fs
sh start_s3fs.sh
```
启动完成后,在挂载目录 ./mnt 下的文件操作均为JYCache控制
**关闭服务**
```bash
sh stop_s3fs.sh
sh stop_global.sh
sh stop_etcd.sh
cd ./minio && sh stop.sh && cd ..
```
**三、JYCache intercept模式**
此模式也支持全局缓存,方法与二同。下述以不开全局缓存为例:
```bash
# 1.启动minio
cd ./minio && sh start.sh && cd ..
# 2.启动intercept_server
sh start_intercept_server.sh
```
启动完成后在JYCache_Env根目录下执行
```bash
LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH LD_PRELOAD=./libintercept_client.so ${cmd}
```
其中`${cmd}`为用户实际文件操作的命令。例如:
```bash
LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH LD_PRELOAD=./libintercept_client.so ll /testdir/
```
需要在testdir目录下进行文件操作才为JYCache intercept模式控制。
*且使用intercept模式前需要先通过普通模式在挂载目录下创建文件夹testdir。*
**关闭服务**
```bash
sh stop_intercept_server.sh
cd ./minio && sh stop.sh && cd ..
```
## 常见问题
2024-08-02 16:26:50 +08:00
[常见问题](https://www.osredm.com/jiuyuan/JYCache/tree/master/doc/frequently_asked_questions.md)
2024-08-01 16:35:05 +08:00
## 许可
本项目使用了以下遵循GPLv2许可的代码
- S3FS (https://github.com/s3fs-fuse/s3fs-fuse)
This software is licensed under the GNU GPL version 2.