MezzFS文件系统

这篇文章MezzFS — Mounting object storage in Netflix’s media processing platfor

是出自medium Netflix Technology Blog,作者 Barak Alon

MezzFS: Mezzanine文件系统的缩写, 是Netflix使用Python开发的一个工具,可通过FUSE将云对象作为本地文件挂载。

FUSE支持用户态空间的文件系统, 文件操作命令通过VFS->FUSE->glibc->libfuse->用户自定义文件系统实现, 从而可以在用户态重新定义文件操作.

Netflix处理视频编码主要涉及以下几个方面问题:

  • 针对不同编码器分辨率进行多次编码,如果编码技术更新调整 可能需要全部重新编码
  • 文件拆分并加密为单独的块,并将这些块存储在Amazon S3中。另外需要处理内容安全性,审核,灾难恢复等
  • 视频编码器都是处理本地文件系统上的文件,不会去调用API去处理云上文件。视频文件非常大,需要避免为了处理一小块而下载整个视频文件

MezzFS的一些特点;

  • Stream objects: 流对象不要外设存储
  • Assemble and decrypt parts: MezzFS知道如何组装和解密
  • Mount multiple objects: 挂载多个对象
  • Disk Caching: 支持本地磁盘缓冲
  • Mount ranges of objects: 可以将云对象指定范围对象挂载到本地
  • Regional caching: 一个区域的缓冲信息可以被另一个区域使用

关键特征replay

支持配置MezzFS为记录replay文件。 该文件包括: 元数据, 文件操作, 缓存的内容, 统计信息。有这些信息可以实现可视化的功能, 可以用来调试错误,进行性能分析.

关键特征Adaptive Buffer

由于使用FUSE系统, 内核将分块读入, 这意味这1G 的挂载文件, MezzFS可能要针对64KB块进行16384次读取。 因此最好可以预先读取一大块进行缓存。但是由于涉及离散和连续数据, 因此出现了Adaptive Buffer

具体公式数据来源于最近的读取的信息.

每连续块读取的数据: average_bytes_per_cluster
每次读取的数据: average_bytes_per_read

# This tunable threshold defines what is "close to 1" 
and what is "close to 0"
threshold = 0.6

sparsity = average_bytes_per_read / average_bytes_per_cluster

if 0 < sparsity <= threshold:
  # access pattern classified as "dense"
  buffer_size = max_allowed_buffer_size / number_of_clusters

if threshold < sparsity <= 1:
  # access pattern classified as "sparse"
  buffer_size = average_bytes_per_cluster

计算稀疏值`sparsity 如果接近1说明数据稀疏分布,那么缓存设定为一个块的大小, 如果接近0说明紧密分布,连续读, 考虑到多线程, 使用设置缓冲最大值除以clusters个数。让线程划分好的各自的连续缓冲区内读.

Be First to Comment

发表回复