全部产品
Search
文档中心

对象存储 OSS:ossfs 1.91.2和1.91.3版本新功能介绍

更新时间:Oct 18, 2024

通过ossfs,您可以像操作本地文件一样直接访问和管理OSS中的Object,从而实现数据的无缝共享和操作。本文介绍ossfs 1.91.2和1.91.3版本的新功能情况。

1.91.2版本

新增直读模式

ossfs读文件时,默认从云上下载的数据会先写到磁盘,再从磁盘读取返回给用户。由于ossfs的磁盘写操作均为异步写,因此下载的数据会先写到内存page cache,操作系统异步将脏页刷到磁盘上。用户读取时,如果内存缓存命中则直接返回。

ossfs读文件时默认会将预取的数据全部保留在磁盘上,磁盘空间到达上限才会淘汰。

  • 当内存足够大时,所有的数据均缓存在内存page cache中,不受到磁盘带宽的限制,仅受机器的网络带宽限制。

  • 当内存不足以缓存整个文件时,下载的数据需要落盘,读取数据也需要从磁盘读,因此读性能同时会受到磁盘带宽和网络带宽限制。一般磁盘带宽是主要性能制约。

    image

默认模式下,当文件较大时,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

1.91.3版本

新增参数direct_read_backward_chunks

直读模式下,ossfs保留[当前chunk - 1, 当前chunk + direct_read_prefetch_chunks]区间内的数据,当前读的位置之前只保留一个chunk的数据,如果用户向前跳跃读,则会丢弃大量已经预取的数据,有可能造成带宽与资源浪费,以及性能下降。

新增参数direct_read_backward_chunks,使ossfs保留[当前chunk - direct_read_backward_chunks, 当前chunk + direct_read_prefetch_chunks]区间内的数据。在AI推理场景下,加载safetensors模型文件(随机读)时,通过调大direct_read_backward_chunks参数,能有更多的数据保留,减少数据重复下载,从而在一定程度上提升性能。

参数

说明

默认值

direct_read_backward_chunks

在直读模式下,保留当前读请求位置之前已下载的chunk数量,单位为个。1个chunk的默认大小为4 MB。

本次新增的参数。

1

stat_cache_expire

元数据过期时间,单位为秒。新支持设为-1,即永不过期。

失效后会重新加载缓存数据。

900

新增混合直读模式

在随机读频繁且跳跃范围较大的场景下:

  • 直读模式的ossfs会频繁下载数据并丢弃,再重复下载,性能会受到很大影响。

  • 默认模式的ossfs会将数据下载到磁盘上,在磁盘空间到达上限之前不会丢弃,因此无重复下载。

    • 当文件不大时,下载的数据直接写到内存page cache中随后直接返回,不会受到磁盘性能限制。

    • 当文件较大,page cache无法全部缓存之后,读性能受到磁盘性能制约。

混合直读模式兼具了默认落盘模式和纯直读模式的优势。小文件可以全部利用page cache加速,大文件可以充分利用page cache,超过一定上限之后才切换到直读模式,同样避免受到磁盘性能限制。

参数

说明

默认值

direct_read_local_file_cache_size_mb

混合直读模式下,数据默认下载到磁盘上。当下载数据总量超过该值时,切换到直读模式,单位为MB。

0(等同直读模式)

性能测试

顺序读取文件

  • 机器规格

    • 内存: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

pytorch加载文件测试

  • 机器规格

    • 内存:15GB

    • 磁盘带宽:150MB/s

    • 内网带宽:500MB/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 -odirect_read_backward_chunks=16
    • 混合直读模式ossfs挂载命令:

      ossfs [bucket name] [mountpoint] -ourl=[endpoint] -oparallel_count=32 -omultipart_size=16 -odirect_read -odirect_read_chunk_size=8 -odirect_read_prefetch_chunks=64 -odirect_read_backward_chunks=16 -odirect_read_local_file_cache_size_mb=3072
  • 测试

    测试脚本:

    import time
    from safetensors.torch import load_file
    
    file_path = "./my_folder/bert.safetensors"
    start = time.perf_counter()
    loaded = load_file(file_path)
    end = time.perf_counter()
    elapsed = end - start
    print("time_spent:", elapsed)

    测试结果:

    说明

    测试结果仅供参考,实际读的耗时除了和文件大小有关,也和safetensors模型结构本身有关。

    文件大小

    默认模式

    直读模式

    混合直读模式

    2.0 GB

    4.00s

    5.86s

    3.94s

    5.3 GB

    20.54s

    27.33s

    19.91s

    6.5 GB

    30.14s

    24.23s

    17.93s