如何计算和优化追加写引擎中GC的写放大

名词解释

  • append写
    一种基于journal的顺序追加写的数据记录方式,类似ZFS的ZIL,ext4的journal.

  • GC
    garbage colletion 是指在append写过程中对覆盖写产生的垃圾数据的回收过程。

GC过程中写放大的计算

不同层次的写放大

  • journal级别
    统计前端用户有效数据的写入量total_user_io,和包含了这部分数据且对接了分布式一致性协议、支持索引而设计的journal 的写入总量total_journal_io,计算 total_journal_io/total_user_io 。这里主要的开销是封装用户IO,把它组织成相应日志而添加的journal 头尾的开销。
  • 存储引擎级别

统计前端用户有效数据的写入量total_user_io,和经过存储引擎对外写入的总量total_engine_io,计算 total_enigne_io/total_user_io 。这里主要的开销包括:

  1. 存储引擎GC的开销;
  2. 索引数据落盘的开销;
  • 磁盘级别
    统计前端用户有效数据的写入量total_user_io,和为了记录这些数据,host端发往磁盘的写请求的总量total_host_io,计算 total_host_io/total_user_io。total_host_io可以通过ioutil工具或/proc/diskstat文件获取。在分布式场景下,这里主要的开销除了上面的开销之外还包括:

    1. 基于分布式一致性协议,所有索引信息定期落盘的开销;
    2. 记录逻辑卷和复制组映射关系的元数据落盘的开销;
  • SSD级别
    统计前端用户有效数据的写入量total_user_io,和SSD内部发往NAND的吸入总量total_nand_io,计算 total_nand_io/total_user_io 。这里主要的开销除了上面的开销之外,还包括 SSD 内部写放大的开销。后者可以通过nvmecli或者其原生库统计到。

GC设计的考虑因素

GC的优化点主要目的就是提供给用户尽可能多的有效IO,同时降低IO延迟。上面各个层次的写放大统计值是衡量存储引擎设计的一个重要指标。实际GC的设计需要考虑当前可用容量大小、数据碎片化程度、SSD磨损程度静态因素,还需要兼顾用户IO模式、SSD内部任务调度等动态因素。下面假设其他调节不变的情况下,逐一考虑每个影响因素。

当前可用容量

在大规模分布式系统中,可用容量在不同的层次有不同的设计考量。

  • 集群级别
    如果集群整体可用容量充足可以减缓GC;反之尽快GC。针对个别节点可用空间不足,这些节点应该尽快通过节点间的容量均衡去释放空间,而不应该加速GC。因为在空间不足的情况下,做GC的写放大相当大。
  • 主机/磁盘级别
    同样,如果容量充足可以在GC过程中高优做碎片整理,反之GC应该尽快释放空间。

数据碎片化程度

基于索引可以统计出磁盘内所有区间的数据碎片化程度。越零碎的区域越应该在GC过程中先做碎片整理。

用户IO模式

用户的覆盖写越多,越应该避免GC过程中搬数据,而应该让用户的覆盖写自己无效掉之前的数据,然后删去。

用户的随机写越多,越应该做碎片整理。

在可用容量充足的情况下:当前用户的请求越多,越应该避免GC,把带宽让给用户;反之,可用积极GC,错峰利用磁盘带宽。

SSD磨损程度

极端情况下,如果SSD磨损得很厉害了,尽量避免搬数据;反之,可以根据需要做GC。

SSD内部任务调度

因为SSD内部总的可用带宽是一定的,因此GC可以尽量避开SSD内部周期任务执行的时机。

GC的优化方法

这个在其本人的其他博客有讨论,参考:http://xiaqichao.cn/wordpress/?p=172
这里简单归纳几点。

GC通常基于切片去做,通常需要考虑选取哪些切片做GC,以及如何做GC。

选取策略

可以考虑下面几个因素综合考虑哪些切片需要做GC:

  • 切片内有效数据的比例
  • 切片内数据的新旧程度
  • 切片内数据做过GC的历史(次数)
  • 切片内数据的碎片化程度

原文地址:https://blog.51cto.com/xiamachao/2484873

时间: 2024-08-07 17:46:06

如何计算和优化追加写引擎中GC的写放大的相关文章

《游戏引擎架构》读书笔记1-游戏引擎中的C++

3月底,我暂时结束了北京的工作,从原来的公司离职,主要是为了学习游戏开发的底层知识和3D引擎相关的内容,并进行技术转型,为了鞭策自己的学习,未来博客更新会比较频繁,现阶段主要是<游戏引擎架构>读书笔记系列和unity学习笔记系列. <游戏引擎架构>在两年前就买了,而且自己也大体的看过一遍,因为自己想学习引擎的底层知识,所以重新又找出了这本书再读一遍,并把根据自己的理解写一些读书笔记在这里与大家交流,另外因为想有一个新的开始,近期都会在博客园这里写技术博客了,前些日子搞了个自己的网站

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

优化 Markdown 在 Notepad++ 中的使用体验

选择一个强大而好用的文本编辑器,是进行 Web 开发和编程必不可少的一部分,甚至对于通常的写作,一个舒服的文本编辑器也会让你写起文字来觉得优雅而潇洒.Sublime Text 是一款不错的编辑器,简洁且跨平台,但对新手来说配置起来有些麻烦,对于通常使用 Windows 的用户来说,Notepad++ 或许是一个更好的选择.Notepad++(NPP),顾名思义,就是一个加强版的记事本了,虽然只多了两个加号,但功能甩系统记事本可不是一里两里. Notepad++ 本身除了作为一款强大的编辑器外,主

刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式:游戏方式可以发生很大变化,比如棒球模式中,所有刺猬都有保护膜无法损伤,只能击入水中退场 可以制作语音,游戏已经包括如海盗,唱诗风格等五种风格,使用开放的ogg格式 纸娃娃系统,不只可以为每个队员命名,还可以用头饰分辨每个人,已有超过90种头部装饰分辨每个刺猬 支持定制团队背景和离场的动画效果 武器[

优化存储过程的7中方法

优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数.使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量. 2.使用确定的Schema 在使用表,存储过程,函数等等时,最好加上确定的Schema.这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索.而且搜索会导致编译锁定,最终影响性能.比如select * from dbo.TestT

虚幻引擎中的数组---TArray: Arrays

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45367171 作者:cartzhang 说明:这个为虚幻官方翻译的一篇文章. 原文地址:https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/TArrays/index.html 一个月前翻译的,官方很忙,自己先贴这里. 若有问题,请

流计算及在特来电监控引擎中的实践

随着云计算的深入落地,大数据技术有了坚实的底层支撑,不断向前发展并日趋成熟,无论是传统企业还是互联网公司,都不再满足于离线批处理计算,而是更倾向于应用实时流计算,要想在残酷的企业竞争中立于不败之地,企业数据必须被快速处理并输出结果,流计算无疑将是企业Must Have的大杀器.作为充电生态网的领军企业,特来电在流计算方面很早便开始布局,下面笔者抛砖引玉的谈一下流计算及在特来电监控引擎中的应用实践. 一.由Bit说开去 作为计算机信息中的最小单位,Bit就像工蚁一样忙碌,任一时刻都只能处于以下三种

为啥select count(_) from t,在InnoDB引擎中比MyISAM 慢

感谢参考原文-http://bjbsair.com/2020-04-01/tech-info/18472.html 统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from t SQL 语句来完成.随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢? 为什么会变慢?想要得到答案就需要知道 MySQL 是如何统计总数量的,先说一个前提吧,count() 的具体实现是由存储引擎实现的,也就是说不同的存储引擎实现的方式不一

用html5中的canvas写的时钟

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8&