首页 > 其他分享 >OPPO F2FS 增量压缩存储方案

OPPO F2FS 增量压缩存储方案

时间:2022-10-27 18:12:02浏览次数:70  
标签:存储 F2FS 逐出 inode 写入 diff data page OPPO

演讲链接:第 17 届中国 Linux 内核开发者大会 IO 与 eBPF 分论坛-CSDN 直播

image

数据库会带来大量随机更新写

对 F2FS 来说,一次写不仅需要更新 data block,还需要更新索引 block(direct node block),以及 Node Address Table。

这带来的写放大是很可怕的,假如只更新几十个字节,一共需要写入 3 * 4KBytes。

image

增量压缩只记录 diff,而不是更新整个 block。读取的时候需要依赖 base 和 diff

增量压缩不需要更新原数据,避免了更新 direct node。

image

image

Diff 记录在哪?对于 3.69K-3.69M 的 inode,内联区域部分为空,可以记录在内联区域中。

3.69K:能内联的最大大小,923slot * 4Bytes/slot。

3.69M:内联区域有额外空间的最大大小,923slot * 1addr/slot * 4KBytes/addr。inode 大于 3.69 M 时,内联区域全部存放 block addr。

image

图有点复杂,总结下 IO 流程:

Read:

  1. 读 inode page 和其他索引 node page
  2. 读 data page
  3. 解压 inode page 中的 diff,与 data page 运算得出最终数据。

Write:

  1. 读 inode page 和其他索引 node page
  2. 读 data page,并复制一份(Base data)
  3. 新数据写入 data page(New data)
  4. New 与 Base 运算,得出 diff,压缩,写入 inode page

image

演讲中提到,增量压缩数据有两种存放形式:

  1. 非固定大小:记录 ① diff 所属的 page index ② diff size ③ diff 内容。
  2. 固定大小:记录 ① diff 所属的 page index ② 最大 4K 的 diff。

固定少一个 diff size 开销,但容易有碎片。

image

这个公式其实说的是:当新的 diff 进来但没有空间时,逐出旧 diff or 采用普通写入的取舍问题。

这里总结下我能想到的 diff 逐出情况。

非强制逐出 diff 策略:

  1. GC 时,inode 和 data 都被读到内存,再写回磁盘。这个过程可以把 diff 刷回 data 中。没有额外开销,不过触发频率得不到保证。
  2. Write data 时,如果 inode 中属于此 data 的 diff 条目过多/数量过大,可以切回普通写入并刷入磁盘。同样没有额外开销(只关注 I/O,解码忽略不计),但失去了增量写入的优势。

强制逐出 diff 场景:

  1. i_size 增大,需要更多空间保存 data blkaddr:只能强制逐出,代价相当于一次普通写入。
  2. 新产生的 diff 保存不下,需要一进一出:将 inode 中的 diff 大小按 page index 累计,找出 diff 量最大 page,回写。然后把新的 diff 保存到 inode 中。 开销对比如下表,可以看到一进一出比普通写入多了一次读,这就要** diff 差量够大**,因而之后增量写入的收益大于此次逐出产生开销。
NAT inode 新写入数据的 data page Diff 需要被逐出的 data page
普通写入 RW RW RW -
一进一出 RW RW R RW

上图 PPT 说的是强制逐出的第二种场景。演讲中提到,oppo 根据埋点数据及理论推算计算出,在 diff 差量大于 81 KByte 时,逐出收益较高,反之应该直接写入。

image

image

image

image

image

截至 22/10/26,没有公开源码。

标签:存储,F2FS,逐出,inode,写入,diff,data,page,OPPO
From: https://www.cnblogs.com/liuchao719/p/F2FS_incremental_compression.html

相关文章

  • 留言+验证--存储数据库(数组)
    效果图:  前端页面:<divclass="contact-right"><h2>合作意向表/<span>COOPERATIONINTENTIONFORM</span></h2>......
  • mysql57版本默认的存储引擎是
    如何查看mysql默认使用的存储引擎视频讲解的是mysql数据库中存储引擎的知识,使用命令的方式查看当前数据库服务器用的什么存储引擎。本视频的目的在于一方面学习熟悉命令,另一......
  • mysql怎么修改存储引擎
    Windows下如何更改MySQL数据库的存储位置1.7Windows10更改新内容保存位置(变声)如何查看和更改mysql数据库文件存放位置查看my.ini或my.conf文件,从中查找datadir设置,可以得......
  • mysql视图/存储过程
    一.视图相关操作--注:对于单表查询的视图可以进行删除修改操作,多表查询的无法进行删除修改操作。一般视图多数用来做查询,不建议修改。--1.创建视图,语法格式CREATE......
  • mysql创建存储过程
    mysql语句存储过程?MySQL教程4MySQL8运算符、函数、存储过程及新增数据类型17.之创建带有IN和OUT参数的存储过程学习猿地本回答由网友推荐mysql使用存储过程循环查找数据de......
  • 芯片替代-存储-PCIE-WIFI技术分析
    芯片替代-存储-PCIE-WIFI技术分析参考文献链接https://mp.weixin.qq.com/s/ECjl9RlwtZ_WyJEFjPFb9Qhttps://mp.weixin.qq.com/s/U-csnmF5GBLJ-eDZ3YRy_ghttps://mp.wei......
  • 存储交换机 服务器的组网
    存储的两个控制框冗余。。a控,b控连接同一个交换机 。。再来a控b控连接另外一个。。。。服务器再连接交换机。。  ......
  • 存储器 主存 内存条 总线宽度
    存储器基本概念主存的基本结构主存的性能指标半导体存储器组织内存条与总线宽度CPU与主存模块的连接及读写操作 ......
  • 关于常量与字符串常量存储方式的一点看法
    首先,毫无疑问,即使是常量(字符串常量)也是要占据空间的。 一般来说,基本类型(整型、字符型等)常量会在编译阶段被编译成立即数,占的是代码段的内存。(代码段是只读的,而且不允程......
  • 存储引擎
    表在数据库中的存储方式。存储引擎只存在mysql中,(Oracle中有对应机制,但是不叫存储引擎)。完整的建表语句:CREATETABLEmytable(idINT(10)PRIMARYKEY,user......