博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kudu之维护操作
阅读量:3683 次
发布时间:2019-05-21

本文共 2611 字,大约阅读时间需要 8 分钟。

维护操作的调度

维护操作(maintenance operations)作为本文阐述的对象,是在kudu正常运行的过程中,运行在后台的进程。为了保证kudu系统操作的流畅,维护管理器(MaintenanceManager)必须要明智的调度维护操作。某种程度上说,这是在当前性能和未来性能之间的权衡。比如说,做compaction操作就是消耗当前的IO,是的之后的插入性能提高。从另外一面说,这有是必须执行的任务,因为不执行的话会导致系统不稳定。比如,如果我们不去刷新MemRowSets,最终会导致kudu内存溢出。内存的的下降最终会导致处理请求速度的减慢。

决策标准

为了做出正确的决定,我们需要权衡的最重要的事情包括以下几点:

  1. 内存使用情况
  2. tablet的统计
  3. memrowsets的存在时间

除此之外,我们还考虑的其他一些标准(版本1中不需要考虑这些),包括:

  1. 可用磁盘空间。
  2. 磁盘之间的负载平衡,它将受维护操作影响

如果管理得当的话,可用磁盘空间不应成为问题。我们后面还会讨论这点,但对于初始版本,最好假设我们有足够的空间。

我们现在不能考虑基于磁盘的调度,因为我们还没有支持多个磁盘。

内存使用情况

内存使用可以分解为以下几个部分:

  1. 系统开销(C ++数据结构,操作系统开销等)。
  2. MemRowSets
  3. LRU块缓存

我们假设#1相对恒定。维护操作调度程序可以通过决定将某些MemRowSets刷新到磁盘来在#2和#3之间进行权衡。

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

tablet统计

如果我们知道tablet的工作负载是扫描密集型(而不是插入密集型),我们可能希望对该tablet进行主要的增量压缩以加快扫描速度。对于使用频繁的表进行压缩可能比在不怎么使用的表上进行压缩更聪明。

这可能是最难有效利用的信息来源,因为它涉及许多依赖于工作负载的假设和启发式方法

MemRowSet的存在时间

MemRowSet和DeltaMemRowSet对象在存储一定时间后必须刷新到磁盘。如果我们不这样做,预写日志(WAL)将不受限制地增长。这种增长会浪费磁盘空间并使启动速度变慢,因为在启动过程中必须遍历整个WAL。

我们应该在每个MemRowSets和DeltaMemRowSet中嵌入一个WAL操作ID。调度程序将更倾向于刷新存在时间比较久的MemRowSet。在操作id落后太多之后,调度程序无论如何都会尝试刷新这个MemRowSet。

维护操作类型

维护操作用于减少内存使用量

这些操作需要花费一些I / O或CPU以释放内存。完成后,它们可能会提高性能。这些操作不能无限延迟,因为RAM是一种有限的资源。

MemStore 刷新

开销:

  • 当前的顺序I / O(将实际的memstore内容写入磁盘)
  • 之后的顺序I / O(频繁的小小刷新将导致更多的压缩)

效益:

  • RAM:释放内存

其他:

  • 乍一看,刷新可能会增加进一步插入/更新的成本,因为它添加了一个新的RowSet。但是,由于memstores没有以任何方式进行压缩,因此通常新刷新的RowSet在磁盘上将比它来自的memstore小得多。这意味着,即使我们必须将整个结果RowSet缓存在块缓存中,我们也可以更有效地使用RAM,从而可以减少实际I
    / O的总数。

DeltaMemStore 刷新

基本上与MemStore刷新开销相同

其他好处:TODO:刷新也可以大大加快扫描速度。与扫描等效的memstore相比,扫描缓存文件要快得多,需要对此进行实验 。也许同一个数量级。

LRU缓存驱逐

开销:如果驱逐了key列的缓存,查询和插入速度会变慢

效益:释放RAM

管理未来的性能的维护操作

这些操作消耗现在的某种I / O和CPU,以便在系统完成后提高系统性能。它们是必要的,因为如果我们不去执行它,系统最终会越来越慢。

合并压缩

开销:

  • 当前的顺序I / O(读取输入,重写输出)

效益:

  • 减少RowSet的数量:加快插入,更新。加快不适用blooms 过滤器的短扫描速度。

Minor Delta 压缩

成本:

  • 顺序I / O(读取输入,重写输出)

效益:

  • 加快扫描速度 - 应用更少的delta trackers
  • 可以节省磁盘空间(例如,实现快照隔离时,可能会丢弃旧版本更新)

Major delta 压缩

成本:

  • 顺序I / O(读取输入,重写输出)

效益:

  • 加速扫描 - 应用更少的delta trackers,减少要应用增量的总行数。
  • 节省磁盘空间(例如,实现快照隔离时,可能会丢弃旧版本更新)

判断是否需要压缩的相关指标:

  • 对于每个列,RowSet中已更新的行的百分比
  • 对于每列,可以完全合并的deltas百分比
  • 工作量:属于扫描密集型还是插入/更新密集型?

实施注意事项

每个tablet都会创建多个MaintenanceOp对象,表示可以对其执行的各种维护操作。它使用MaintenanceManager注册这些操作。

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

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

MaintenanceOp有各种字段,表明它可能释放多少内存,它将使用多少CPU,等等。它还有一个字段,标记它当前不可执行。例如,某些Ops可能会使用它,这些Ops不希望它们的多个实例同时运行。

我们希望保持至少一个线程可以自由运行刷新操作,这样我们就不会遇到这种情况:当我们需要释放内存时,所有维护操作线程都在进行压缩或其他操作。希望大多数压缩都会相当短,因此我们不必调度长时间的压缩。

转载地址:http://cwydn.baihongyu.com/

你可能感兴趣的文章
Python Crypto Cipher加密包
查看>>
GB2312汉字拼音对照表
查看>>
手机 用户界面和多媒体 版面有价值问题整理 j2medev com 0406更新
查看>>
SP 梦网masterSP模式下的sp生存
查看>>
dotNET ThreadPool 对象中没有足够的自由线程来完成操作 的现象和解决办法
查看>>
转 FTP搜索引擎的设计与实现(优化版)
查看>>
数据挖掘和知识发现的技术 方法及应用
查看>>
USTC 中科大备忘录
查看>>
ASP NET 2 0应用开发技术 9月份出版发行
查看>>
收藏 C++大师Stan Lippman 我对中国程序员的忠告
查看>>
收藏 深入浅出的 网络socket编程指南
查看>>
BP神经网络基本原理
查看>>
书籍 世界是平的
查看>>
墨菲定律 二八法则 马太效应 手表定理 不值得 定律 彼得原理 零和游戏 华盛顿合作规律 酒与污水定律 水桶定律 蘑菇
查看>>
STL学习小结
查看>>
网络编程学习小结
查看>>
数据库编程总结
查看>>
Android系统介绍与框架
查看>>
GDI+编程小结
查看>>
边界跟踪 边缘检测 边缘连接
查看>>