# MezzFS文件系统
Date: 2020-09-02


这篇文章[MezzFS — Mounting object storage in Netflix’s media processing platfor](https://netflixtechblog.com/mezzfs-mounting-object-storage-in-netflixs-media-processing-platform-cda01c446ba)

是出自`medium` [Netflix Technology Blog](https://netflixtechblog.com/@NetflixTechBlog?source=post_page-----cda01c446ba----------------------),作者 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`

```C
# 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个数。让线程划分好的各自的连续缓冲区内读.

