triggering maintenance ops(触发维护计划)

Maintenance Op Scheduling(维护运行计划)

就本文档而言,“maintenance operations”是指Kudu在正常操作过程中运行的任何后台进程。MaintenanceManager 必须智能schedule 地安排这些操作以保持系统的平稳运行。部分原因是,这是当前性能与未来性能之间的一个折衷。例如,运行压缩将花费一些I / O现在为了加快插入。部分地,这是一个执行必要的任务调优,如果不加以解决,就会危及系统的稳定性。例如,如果我们从不刷新MemRowSets,我们最终会耗尽内存。由于memory不足,用户控制将会减缓新请求被接受的速度。

Decision Criteria(决策标准)

为了做出正确的决定,我们需要权衡的最重要的事情是:
1、内存使用情况
2、平板电脑统计
3、memrowsets的年龄
我们考虑过的一些其他标准,但被拒绝的包括:
4、可用磁盘空间。
5、在维护操作将会触及的disk或diskRowSet之间进行负载平衡
可用磁盘空间不应该成为最能胜任管理设置的问题。我们稍后可能会重新讨论这个问题,但对于最初的版本,最好假设我们有足够的空间。
我们现在不能考虑基于磁盘的调度,因为我们还没有支持多个磁盘。

一、Memory usage(内存使用情况)

内存使用可以分解成几个桶:
1、系统开销(C ++数据结构,操作系统开销等等)。
2、MemRowSets
3、LRU块缓存
我们假设#1是相对恒定的。维护操作调度程序可以通过决定将某些MemRowSets刷新到磁盘来在#2和#3之间进行权衡。

我们希望保持#1,#2和#3所占用的内存总量不会太大。现在,我们的目标是保持这个总和相对不变。我们还没有实现将tcmalloc持有的内存返回给操作系统。

二、Tablet Statistics

如果我们知道tablet的工作负载是扫描工作较大(而不是插入工作量大),我们可能希望对该tablet进行大幅度的压缩,以加快扫描速度。在大量使用的表上执行压缩可能比在那些看不到多少流量的模糊的表上更明智。

这可能是最难以有效使用的信息源,因为它涉及到许多与工作负载有关的假设和启发式方法。

三、The Age of MemRowSet objects(MemRowSet对象的年龄)

MemRowSet和DeltaMemRowSet对象如果太旧,必须刷新到磁盘。如果我们不这样做,预写日志(WAL)将无限制地增长。这种增长会浪费磁盘空间,并且缓慢启动,因为在启动过程中必须遍历整个WAL。
我们应该在每个MemRowSets和DeltaMemRowSet中嵌入一个WAL操作标识。随着时间的增长,调度器将更倾向于对一个MemRowSet的刷新。。在操作ID落后太多之后,无论如何都会尝试刷新MemRowSet。

Maintenance Operation types(维护操作类型)

一、Maintenance operations to reduce memory usage(维护操作以减少内存使用量)

这些操作花费一些I / O或CPU来释放内存使用量。在完成之后,他们可能还会产生更多的性能成本,由于RAM是一种有限的资源,因此不能无限期地延迟它们。

二、MemStore Flush

成本:
● 顺序I / O现在(将实际的memstore内容写入磁盘)
● 之后的顺序I / O(频繁的小冲洗将会在路上花费更多的压缩)
效益:
● RAM:释放内存
其他/wash:
● 乍一看,刷新似乎会增加进一步插入/更新的成本,因为它添加了一个新的RowSet。但是,因为memstore没有以任何方式进行压缩,所以通常新刷新的RowSet在磁盘上要比它来自的memstore小得多。这意味着,即使我们必须将整个结果RowSet缓存在block cache中,我们也可以更有效地使用RAM,从而可以减少实际I / O的总数。

三、DeltaMemStore Flush

基本上与MemStore刷新相同的成本
其他好处:TODO:flush刷新操作也可能加速scan扫描大幅度。需要在此上运行实验 - 扫描静态缓存文件与扫描等效内存相比要好得多。也许是一个数量级。

四、LRU cache eviction(LRU缓存逐出)

成本:较慢的读取,较慢的插入,如果驱逐key column 或者是 bloom
好处:释放RAM

五、Maintenance operations to manage future performance

这些操作现在花费某种I / O和CPU,以便在完成后提高系统的性能。他们只是永远是“必要的”,如果我们永远放弃它,系统最终会慢慢爬行。

六、Merging Compaction

成本:
● 现在的顺序I / O(读输入,重写输出)
效益:
● 减少行数:加快插入,更新。加快花朵不适用的短扫描速度。

七、Minor Delta Compaction

成本:
● 顺序I / O(读取输入,重新输出)
效益:
● 加快扫描速度 - 应用更少的delta trackers跟踪器
● 可以节省磁盘空间(例如,当执行快照隔离时,旧版本更新可能会被丢弃)

八、Major delta compaction

成本:
● 顺序I / O(读取输入,重新输出)
效益:
● 加快扫描速度 - 应用较少的delta trackers跟踪器,应用更少的带有delta的总行数。
● 保存磁盘空间(例如,当执行快照隔离时,旧版本更新可能会被丢弃)
相关指标:
● 对于每个列,RowSet中已更新的行的百分比
● 对于每列,可以完全合并的百分比的百分比
● 工作量:扫描沉重vs插入/更新沉重

Implementation Considerations(实施注意事项)

每个tablet创建多个MaintenanceOp对象,代表可以在其上执行的各种维护操作。它们通过MaintenanceManager注册这些操作。

MaintenanceManager有一个主线程,它定期轮询已注册的MaintenanceOp对象,并确定是否应该执行其中的任何一个。默认的轮询间隔是250毫秒,但是这是可配置的。访问MaintenanceOp被认为是线程安全的。需要注意的是,调度程序可以选择任何可用的操作。并不一定以先到先得的原则执行运作。

如果MaintenanceManager决定执行这些操作之一,它将在可配置大小的线程池中运行它。我们假设维护操作是阻塞的并且需要线程上下文。如果操作失败,MaintenanceManager将记录警告消息并重新触发主线程。在可配置的宽限期过期之前,将不会重试失败的MaintenanceOp。

MaintenanceOp具有不同的字段,表示它可能释放多少内存,将使用多少CPU等等。它也有一个标记为当前不可执行的字段。例如,一些不希望自己的多个实例同时运行的Ops可以使用这种方法。

我们希望至少有一个线程可以运行flush操作,所以我们永远不会遇到需要释放内存的情况,但所有的维护操作线程都在进行压缩或其他操作。希望大多数的压缩都是相当短的,所以我们不需要把长时间压缩比短时压缩做得更多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值