阿里云存储网关(CSG)软件版与ossfs对比(数据缓存篇)

简介: 本文从文件数据的管理、使用角度,详细对比阿里云存储网关(CSG)软件版与ossfs之间的区别。

1. 前言

ossfs是一款开源的工具,可以将Oss Bucket挂载在本地机器上,以POSIX文件接口对存在Oss Bucket中的文件进行访问。不过,该工具从2019年起,已经不再维护了。

阿里云云存储网关(Cloud Storage Gateway, CSG)软件版(以下简称CSG软件版)。同样是一款可以安装在阿里云用户机器(ECS,或用户自建机房服务器)上的产品,将OSS Bucket挂载到用户机器,以POSIX文件接口进行访问。在实现上,CSG软件版衍生自已经商业化的CSG托管版,与ossfs有较大的不同,并且在使用上引入了监控等多项功能。

元数据的使用管理角度的对比,在《阿里云存储网关(CSG)软件版与ossfs对比(元数据篇)》一文中已经已经有阐述,您可以点击该链接查看详情。

本文则将从数据缓存的使用和管理的角度,比较CSG软件版和ossfs的区别。


2. 原理对比

2.1 CSG软件版缓存实现

CSG软件版的数据缓存原理可以参考下图。

  • 当CSG软件版挂载点收到文件写请求时,数据会先在内存中缓存住。
  • 如果内存缓存达到上限,则内存中数据会写至磁盘上,防止占用内存过多。
  • 文件close时,内存中缓存的数据也会写至磁盘上。同时,本地的db中记录一份操作日志。随即write请求返回。
  • 后台线程异步回放日志,将文件在本地的缓存上传至OSS Bucket。


CSG软件版支持配置缓存的路径、缓存空间大小。当本地磁盘的缓存到达高水位时,此时读写会触发限流。并且会启动线程,回收磁盘空间。

如果本地有数据缓存,读请求可以直接从本地磁盘获取数据,加速读取。


image.png

CSG软件版写数据流程


2.2 ossfs缓存实现

ossfs的文件数据也会首先写入本地的缓存盘,然后上传到OSS Bucket中。当缓存空间足够时,文件的数据会先写入本地的缓存盘,在文件flush时,上传到OSS Bucket,上传成功之后才会返回。当缓存空间不足时,会提前上传文件的part,并将文件的缓存清理。

ossfs支持配置缓存路径和不配置缓存路径(默认模式)两种模式。如果指定缓存路径,文件的数据缓存不会被显示回收,因此一般使用时,均采用默认模式(不指定缓存路径)挂载。因此下文均分析、对比默认模式。


ossfs如果未指定缓存路径,在挂载点收到文件写请求时,数据缓存的使用方式如下图所示。

  • 在create/open阶段,在/tmp路径下创建特殊的tmpfile,作为文件缓存,该文件对文件系统不可见,且在close的时候会自动被清理缓存
  • 文件先写入本地缓存,并且为异步落盘,即先写入page cache即返回。
  • 在flush阶段,将文件上传至Oss Bucket,上传成功之后请求返回。


由于数据缓存是临时本地文件,在close之后就会被清除,因此无需显示回收缓存。

由于本地只会临时缓存,所以读文件时,并不能使用使用本地缓存加速。

image.png


2.3 原理对比


Ossfs与CSG软件版的数据缓存原理对比


ossfs

CSG软件版

存储形式

数据以临时文件的方式存在系统盘/tmp目录下,临时文件对用户不可见,但使用总量不太可控。

数据缓存在本地磁盘中,占用的空间事先分配并统一管理。

缓存文件自动回收,本地一般无缓存,因此每次读需要从云上下载至本地,再从本地缓存读数据。

若本地缓存命中,从磁盘读;否则从云上下载缺失的数据并写入本地磁盘供后续读取,对读更友好。

  • 数据首先写入磁盘,再从磁盘读取文件,同步上云,上云之后才会返回。
  • 文件关闭时,即可在云上看到文件数据。
  • 如果是大文件文件关闭的时候会卡很长一段时间。
  • 数据首先由内存缓存,达到缓存上限或文件close时,写入磁盘后立即返回。
  • 后台线程从磁盘中读取数据,异步回放上云,体验更好。
  • 文件关闭之后,无法及时感知文件是否上云。

数据回收

每次文件close时,文件的缓存自动回收

缓存到达高水位时,后台线程自动回收


3. 测试

测试环境配置为阿里云ECS:

  • CPU:24核
  • 内存:48GB
  • 磁盘:500GB,ESSD PL1,带宽上限为350MB/s


另外,用于对比测试的Ossfs版本为1.80.6版本。下面根据读写的不同情形,分别进行了对比测试,具体结果见下文。


3.1. 写测试

CSG软件版

ossfs

单线程,写小文件

1.88MB/s

0.042MB/s

cp500个本地4K小文件至挂载点。

多线程,写小文件

3.46MB/s

0.051MB/s

64线程。每个线程cp160个本地4K小文件至挂载点。

单线程,写大文件

232.7MB/s

64.7MB/s

cp1个本地5G大文件至挂载点。

多线程,写大文件

340.3MB/s

95.8MB/s

32线程,每个线程cp1个本地1G大文件至挂载点。

注:由于CSG软件版异步进行文件上传,因此统计CSG软件版的写带宽时,不包含文件上云时间。


3.2. 读测试

CSG软件版

Ossfs

本地无缓存

本地有缓存

单线程,读小文件

0.25MB/s

3.30MB/s

0.16MB/s

cp500个挂载点4K小文件至本地。

多线程,读小文件

9.67MB/s

20.86MB/s

0.29MB/s

64线程。每个线程cp160个挂载点4K小文件至本地。

单线程,读大文件

53.3MB/s

222.5MB/s

35.0MB/s

cp1个挂载点5G大文件至本地。

多线程,读大文件

346.9MB/s

349.8MB/s

248.2MB/s

32线程,每个线程cp1个挂载点1G大文件至本地。CSG软件版达到磁盘带宽上限。


3.3 结果分析

从上面的结果可以看出:

  • 数据写入的场景下,CSG软件版由于是异步上传,数据落盘之后即返回。而Ossfs是同步上传,数据上传到OSS Bucket之后才能返回。因此在写大文件时,以及网络较差的情形下,CSG软件版优势较大。
  • 读写文件数目较多时,元数据的性能也在其中扮演了很重要的作用,因而CSG软件版表现更好。
  • CSG软件版支持缓存数据到本地磁盘。数据重复读取的场景下,无需重复从云上下载,直接从本地缓存读取即可,优势巨大。
  • 读文件本地无缓存时,CSG软件版通过后台线程池,异步进行预取,而Ossfs则是等待预取完成之后返回,因此CSG软件版有一定优势。
目录
相关文章
|
6天前
|
存储 缓存 分布式计算
|
23天前
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
52 3
|
1月前
|
存储 缓存 中间件
|
1月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
15天前
|
缓存 算法 OLTP
自适应软件缓存管理
自适应软件缓存管理
14 1
|
27天前
|
消息中间件 缓存 数据库
Redis问题之如何解决缓存更新失败导致的数据不一致问题
Redis问题之如何解决缓存更新失败导致的数据不一致问题
|
5天前
|
存储 缓存 Java
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
Java本地高性能缓存实践问题之使用@CachePut注解来更新缓存中的数据的问题如何解决
|
1月前
|
物联网
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
好的资源链接,gitee全糖咖啡,B站视频转成mp4,全糖咖啡 / 物联网网关数据上传,,全糖咖啡 / springboot+百度智能车牌检测
|
2月前
|
存储 缓存 测试技术
有效使用缓存时需要缓存动态数据吗?
【6月更文挑战第7天】本文探讨了如何有效地缓存数据以提升应用性能。关键在于选择合适的数据进行缓存和适时缓存。缓存不应被视为永久存储,应同时维护原始数据存储。
88 2
有效使用缓存时需要缓存动态数据吗?
|
2月前
|
缓存 NoSQL 中间件
应对数据库不断膨胀的数据:缓存和队列中间件
【6月更文挑战第5天】该文探讨了优化数据库使用以提升应用系统性能的策略。文中建议利用Redis缓存和MQ消息队列作为辅助工具,以进一步优化性能和减少资源消耗。
49 2
应对数据库不断膨胀的数据:缓存和队列中间件