学习 Druid(五):集群调优

Historical

堆内存

Historical 堆内存的使用:

  • 部分未合并的 Segment 查询结果;
  • Lookup 映射;
  • 缓存。

堆内存公式:

(0.5GB * number of CPU cores) + (2 * total size of lookup maps) + druid.cache.sizeInBytes

配置项:

  • druid.cache.sizeInBytes 缓存大小。

堆外内存

Historical 堆外内存的使用:

  • Processing buffer;
  • GroupBy merging buffer。

堆外内存公式:

(druid.processing.numThreads + druid.processing.numMergeBuffers + 1) * druid.processing.buffer.sizeBytes

配置项:

  • druid.processing.buffer.sizeBytes buffer 大小,合理的大小在 500MB 到 1GB 之间;
  • druid.processing.numThreads Processing 线程数,即可以处理的并发查询数;
  • druid.processing.numMergeBuffers GroupBy merging buffer 数,合理的大小约为 druid.processing.numThreads 的四分之一。

Segment

配置项:

  • druid.server.maxSize 分配给 Historical 最大 Segment 数据大小;
  • druid.segmentCache.locations Segment 数据的位置。

通过优化 free system memory / druid.server.maxSize 比率,可以最大的利用内存中的 Segment 数据。

Broker

堆内存

Broker 堆内存的使用:

  • 部分未合并的 Historical 和 Task 查询结果;
  • Segment 时间线:所有当前可用的 Segment 数据的位置信息;
  • 缓存的 Segment 元数据。

配置项:

  • druid.cache.sizeInBytes 缓存大小。

堆外内存

Broker 堆外内存的使用:

  • GroupBy merging buffer。

堆外内存公式:

(druid.processing.numThreads + druid.processing.numMergeBuffers + 1) * druid.processing.buffer.sizeBytes

配置项:

  • druid.processing.buffer.sizeBytes buffer 大小,设置为 500MB;
  • druid.processing.numThreads Processing 线程数,设置为 1;
  • druid.processing.numMergeBuffers GroupBy merging buffer 数,和 Historical 相同或略高。

MiddleManager

TODO

参考