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软件版支持配置缓存的路径、缓存空间大小。当本地磁盘的缓存到达高水位时,此时读写会触发限流。并且会启动线程,回收磁盘空间。
如果本地有数据缓存,读请求可以直接从本地磁盘获取数据,加速读取。
CSG软件版写数据流程
2.2 ossfs缓存实现
ossfs的文件数据也会首先写入本地的缓存盘,然后上传到OSS Bucket中。当缓存空间足够时,文件的数据会先写入本地的缓存盘,在文件flush时,上传到OSS Bucket,上传成功之后才会返回。当缓存空间不足时,会提前上传文件的part,并将文件的缓存清理。
ossfs支持配置缓存路径和不配置缓存路径(默认模式)两种模式。如果指定缓存路径,文件的数据缓存不会被显示回收,因此一般使用时,均采用默认模式(不指定缓存路径)挂载。因此下文均分析、对比默认模式。
ossfs如果未指定缓存路径,在挂载点收到文件写请求时,数据缓存的使用方式如下图所示。
- 在create/open阶段,在/tmp路径下创建特殊的tmpfile,作为文件缓存,该文件对文件系统不可见,且在close的时候会自动被清理缓存。
- 文件先写入本地缓存,并且为异步落盘,即先写入page cache即返回。
- 在flush阶段,将文件上传至Oss Bucket,上传成功之后请求返回。
由于数据缓存是临时本地文件,在close之后就会被清除,因此无需显示回收缓存。
由于本地只会临时缓存,所以读文件时,并不能使用使用本地缓存加速。
2.3 原理对比
Ossfs与CSG软件版的数据缓存原理对比
ossfs |
CSG软件版 |
|
存储形式 |
数据以临时文件的方式存在系统盘/tmp目录下,临时文件对用户不可见,但使用总量不太可控。 |
数据缓存在本地磁盘中,占用的空间事先分配并统一管理。 |
读 |
缓存文件自动回收,本地一般无缓存,因此每次读需要从云上下载至本地,再从本地缓存读数据。 |
若本地缓存命中,从磁盘读;否则从云上下载缺失的数据并写入本地磁盘供后续读取,对读更友好。 |
写 |
|
|
数据回收 |
每次文件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软件版有一定优势。