本文为您介绍ossfs 1.91.2版本更新内容。
新增功能
直读模式
ossfs读文件时,默认从云上下载的数据会先写到磁盘,再从磁盘读取返回给用户。由于ossfs的磁盘写操作均为异步写,因此下载的数据会先写到内存page cache,操作系统异步将脏页刷到磁盘上。用户读取时,如果内存缓存命中则直接返回。
ossfs读文件时默认会将预取的数据全部保留在磁盘上,磁盘空间到达上限才会淘汰。
当内存足够大时,所有的数据均缓存在内存page cache中,不受到磁盘带宽的限制,仅受机器的网络带宽限制。
当内存不足以缓存整个文件时,下载的数据需要落盘,读取数据也需要从磁盘读,因此读性能同时会受到磁盘带宽和网络带宽限制。一般磁盘带宽是主要性能制约。
默认模式下,当文件较大时,ossfs读性能受到磁盘性能的制约,因此新增直读模式。
直读模式下,ossfs从云上下载的数据会存放在内存buffer中,读取时数据直接从内存buffer返回,整个流程并不涉及磁盘,从而可以充分利用网络带宽,提升顺序读性能。
直读模式下,ossfs以chunk(默认4 MB,可通过direct_read_chunk_size参数设置)为单位管理下载的数据,会在内存中保留
[当前chunk - 1, 当前chunk + direct_read_prefetch_chunks]
区间内的数据,如果下一次读的偏移量超过这个区间,ossfs会丢弃已经下载的数据,并从新的偏移量处开始重新预取。
直读模式仅适用于顺序读(只读)场景,对于其他场景:
随机读:ossfs只会保留当前读偏移量窗口内的数据,如果随机读的偏移量超过这个区间,则会造成数据被多次下载、释放,导致网络资源浪费和性能下降。因此大量随机读操作的场景不适合开启直读模式。
写:数据写入仍然会先写入本地磁盘。为了保证性能与数据一致性,如果当前文件直读过程中有写请求,该文件将自动回退到默认的读模式,即下载到磁盘的逻辑。针对某一个文件的写不会导致其他文件退出直读模式。
直读模式相关配置请参见下表:
参数 | 说明 | 默认值 |
direct_read | 是否开启直读模式。直接通过-odirect_read开启。 | disabled |
direct_read_chunk_size | 每个预取任务下载数据的大小,单位为MB。 | 4 |
direct_read_prefetch_chunks | 预取的chunk数量。 | 32 |
direct_read_prefetch_limit | 所有文件预取数据总量上限,单位为MB。 | 1024 |
direct_read_prefetch_thread | 预取线程数量。 | 64 |
性能测试
使用ossfs将远程Bucket挂载到本地文件系统,进行了顺序读取文件的性能测试。测试结果如下:
机器规格
内存:32GB
磁盘带宽:130MB/s
内网带宽:750MB/s
挂载命令
默认模式ossfs挂载命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16
直读模式ossfs挂载命令:
ossfs [bucket name] [mountpoint] -ourl=[endpoint] -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64
测试脚本
dd if=testfile of=/dev/null bs=1M status=progress
测试结果:
文件大小
默认模式
直读模式
1 GB
646MB/s
592MB/s
5 GB
630MB/s
611MB/s
10 GB
260MB/s
574MB/s