编辑

管理内存

本文介绍如何管理并调优内存资源。

查看内存使用

您可以通过以下方法查看分析 BE 内存使用。

  • 通过浏览器或 curl 命令访问 Metrics 接口分析内存使用。

Metrics 统计每 10 秒更新一次。

curl -XGET -s http://be_ip:8040/metrics | grep "^starrocks_be_.*_mem_bytes\|^starrocks_be_tcmalloc_bytes_in_use" 

说明:

  • 将以上 be_ip 改为 BE 节点实际的 IP 地址。
  • BE webserver_port 默认为 8040

对应指标的含义参考 内存分类

  • 通过浏览器或 curl 命令访问 mem_tracker 接口分析 BE 内存使用。
http://be_ip:8040/mem_tracker

说明:

  • 将以上 be_ip 改为 BE 节点实际的 IP 地址。
  • BE webserver_port 默认为 8040

MemTracker

指标说明:

  • level: MemTracker 为树型结构,第一级为 BE 使用总内存,第二级为分类内存使用。

  • Label: 标识内存分类,对应指标的含义参考 内存分类

  • Parent: 父结点 Label。

  • Limit: 内存使用限制,-1 表示没有限制。

  • Current Consumption: 当前内存使用。

  • Peak Consumption: 峰值内存使用。

  • 通过浏览器或 curl 命令访问 TCmalloc 接口分析 BE 内存使用。

http://be_ip:8040/memz

说明:

  • 将以上 be_ip 改为 BE 节点实际的 IP 地址。
  • BE webserver_port 默认为 8040

示例:

------------------------------------------------
MALLOC:      777276768 (  741.3 MiB) Bytes in use by application
MALLOC: +   8851890176 ( 8441.8 MiB) Bytes in page heap freelist
MALLOC: +    143722232 (  137.1 MiB) Bytes in central cache freelist
MALLOC: +     21869824 (   20.9 MiB) Bytes in transfer cache freelist
MALLOC: +    832509608 (  793.9 MiB) Bytes in thread cache freelists
MALLOC: +     58195968 (   55.5 MiB) Bytes in malloc metadata
MALLOC:   ------------
MALLOC: =  10685464576 (10190.5 MiB) Actual memory used (physical + swap)
MALLOC: +  25231564800 (24062.7 MiB) Bytes released to OS (aka unmapped)
MALLOC:   ------------
MALLOC: =  35917029376 (34253.1 MiB) Virtual address space used
MALLOC:
MALLOC:         112388              Spans in use
MALLOC:            335              Thread heaps in use
MALLOC:           8192              Tcmalloc page size
------------------------------------------------
Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
Bytes released to the OS take up virtual address space but no physical memory.

指标说明:

  • Bytes in use by application: BE 实际使用的内存。
  • Bytes in page heap freelist: BE 已不再使用,但是尚未归还给操作系统的内存。
  • Actual memory used: 操作系统监测到 BE 实际内存使用(BE 会预留一些空闲内存,不还给操作系统或是缓慢返还给操作系统)。
  • Bytes released to OS: BE 已设置为可回收状态,但是操作系统尚未回收的内存。

内存分类

StarRocks BE 中的内存分为以下几类。

标识Metric 名称说明BE 相关配置
processstarrocks_be_process_mem_bytesBE 进程实际使用的内存(不包含预留的空闲内存)。mem_limit
query_poolstarrocks_be_query_mem_bytesBE 查询层使用总内存。
loadstarrocks_be_load_mem_bytes导入使用的总内存。load_process_max_memory_limit_bytes, load_process_max_memory_limit_percent
table_metastarrocks_be_tablet_meta_mem_bytes元数据总内存。
compactionstarrocks_be_compaction_mem_bytes版本合并总内存。compaction_max_memory_limit, compaction_max_memory_limit_percent
column_poolstarrocks_be_column_pool_mem_bytescolumn pool 内存池,用于加速存储层数据读取的 Column Cache。
page_cachestarrocks_be_storage_page_cache_mem_bytesBE 存储层 page 缓存。disable_storage_page_cache, storage_page_cache_limit
chunk_allocatorstarrocks_be_chunk_allocator_mem_bytesCPU per core 缓存,用于加速小块内存申请的 Cache。chunk_reserved_bytes_limit
consistencystarrocks_be_consistency_mem_bytes定期一致性校验使用的内存。consistency_max_memory_limit_percent, consistency_max_memory_limit
schema_changestarrocks_be_schema_change_mem_bytesSchema Change 任务使用的总内存。memory_limitation_per_thread_for_schema_change
clonestarrocks_be_clone_mem_bytesTablet Clone 任务使用的总内存。
updatestarrocks_be_update_mem_bytes主键模型使用的总内存。

内存相关配置项

BE 配置项

名称默认值说明
mem_limit90%BE 进程内存上限,默认硬上限为 BE 所在机器内存的 90%, 软上限为 BE 所在机器内存的 80%。如果 BE 为独立部署,则无需配置,如果 BE 与其它占用内存较多的服务混合部署,则需要合理配置。
load_process_max_memory_limit_bytes107374182400导入内存上限, 取 mem_limit * load_process_max_memory_limit_percent / 100 和 load_process_max_memory_limit_bytes 中较小的值。如导入内存到达限制,则会触发刷盘和反压逻辑。
load_process_max_memory_limit_percent30导入内存上限,取 mem_limit * load_process_max_memory_limit_percent / 100 和 load_process_max_memory_limit_bytes 中较小的值,导入内存到达限制,会触发刷盘和反压逻辑。
compaction_max_memory_limit-1Compaction 内存上限,取 mem_limit * compaction_max_memory_limit_percent / 100 和 compaction_max_memory_limit 中较小的值,-1 表示没有限制。当前不建议修改默认配置。Compaction 内存到达限制,会导致 Compaction 任务失败。
compaction_max_memory_limit_percent100Compaction 内存上限,取 mem_limit * compaction_max_memory_limit_percent / 100 和 compaction_max_memory_limit 中较小的值,-1 表示没有限制。当前不建议修改默认配置。Compaction 内存到达限制,会导致 Compaction 任务失败。
disable_storage_page_cachetrue是否禁用 BE 存储层 page 缓存。该配置项与 storage_page_cache_limit 配合使用,在内存资源充足和有大数据量 Scan 的场景中启用能够加速查询性能。
storage_page_cache_limit0BE 存储层 page 缓存可以使用的内存上限。
chunk_reserved_bytes_limit2147483648用于加速小块内存分配的 Cache,默认上限为 2GB。您可以在内存资源充足的情况下打开。
consistency_max_memory_limit_percent20一致性校验任务使用的内存上限,取 mem_limit * consistency_max_memory_limit_percent / 100 和 consistency_max_memory_limit 中较小的值。内存使用超限,会导致一致性校验任务失败。
consistency_max_memory_limit10G一致性校验任务使用的内存上限,取 mem_limit * consistency_max_memory_limit_percent / 100 和 consistency_max_memory_limit 中较小的值。内存使用超限,会导致一致性校验任务失败。
memory_limitation_per_thread_for_schema_change2单个 Schema Change 任务的内存使用上限,内存使用超限,会导致 Schema Change 任务失败。
tc_use_memory_min10737418240TCmalloc 最小预留内存,小于这个值,StarRocks 不会将空闲内存返还给操作系统。

Session 变量

名称默认值说明
exec_mem_limit2147483648单个 Instance 的内存限制,单位是 Byte。一个查询可以使用的内存为 Instance 数量 * exec_mem_limit。只有在配置项 query_mem_limit 为 0 时,该配置项生效。
load_mem_limit0单个导入任务的内存限制,单位是 Byte。如果此配置项被设置为 0,那么系统会使用 exec_mem_limit 来限制内存。
query_mem_limit0单个查询的内存限制,单位是 Byte。如果此配置项被设置为 0,那么系统会使用 exec_mem_limit 来限制内存。建议设置为 17179869184(16GB)以上。