跳到主要内容
版本: 最新版本-3.5

内存管理

本节简要介绍内存分类和 StarRocks 的内存管理方法。

内存分类

说明

指标名称描述
processBE 的总内存使用量
query_pool数据查询使用的内存由两部分组成:执行层使用的内存和存储层使用的内存。
load数据加载使用的内存通常为 MemTable
table_meta元数据内存包括 Schema、Tablet 元数据、RowSet 元数据、Column 元数据、ColumnReader、IndexReader
compaction多版本内存 Compaction数据导入完成后发生的 Compaction
snapshot快照内存通常用于 Clone,内存使用量较小
column_pool列池内存请求释放列缓存以加速列
page_cacheBE 自己的 PageCache默认关闭,用户可以通过修改 BE 文件来开启
  • BE 配置
名称默认描述
vector_chunk_size4096Chunk 行数
mem_limit90%BE 进程内存上限。您可以将其设置为百分比(“80%”)或物理限制(“100G”)。默认硬限制为服务器内存大小的 90%,软限制为 80%。如果您想在同一台服务器上部署 StarRocks 和其他内存密集型服务,则需要配置此参数。
disable_storage_page_cachefalse控制是否禁用 PageCache 的布尔值。启用 PageCache 后,StarRocks 会缓存最近扫描的数据。当重复频繁地执行类似的查询时,PageCache 可以显着提高查询性能。true 表示禁用 PageCache。将此项与 storage_page_cache_limit 一起使用,可以在内存资源充足且数据扫描量大的场景中加速查询性能。自 StarRocks v2.4 以来,此项的默认值已从 true 更改为 false
write_buffer_size104857600单个 MemTable 的容量限制,超过该限制将执行磁盘刷写。
load_process_max_memory_limit_bytes107374182400BE 节点上所有加载进程可以占用的内存资源上限。它的值是 mem_limit * load_process_max_memory_limit_percent / 100load_process_max_memory_limit_bytes 中较小的一个。如果超过此阈值,将触发刷写和背压。
load_process_max_memory_limit_percent30BE 节点上所有加载进程可以占用的内存资源的最大百分比。它的值是 mem_limit * load_process_max_memory_limit_percent / 100load_process_max_memory_limit_bytes 中较小的一个。如果超过此阈值,将触发刷写和背压。
default_load_mem_limit2147483648如果单个导入实例的接收端达到内存限制,将触发磁盘刷写。需要使用 Session 变量 load_mem_limit 修改才能生效。当启用基于事件的 Compaction 框架时,此参数是可变的。
max_compaction_concurrency-1Compaction(包括 Base Compaction 和 Cumulative Compaction)的最大并发数。值 -1 表示对并发数没有限制。
cumulative_compaction_check_interval_seconds1Compaction 检查间隔
  • 会话变量
名称默认描述
query_mem_limit0每个 BE 节点上查询的内存限制
load_mem_limit0单个导入任务的内存限制。如果值为 0,则将采用 exec_mem_limit

查看内存使用情况

  • mem_tracker
//View the overall memory statistics
<http://be_ip:be_http_port/mem_tracker>

// View fine-grained memory statistics
<http://be_ip:be_http_port/mem_tracker?type=query_pool&upper_level=3>
  • tcmalloc
<http://be_ip:be_http_port/memz>
------------------------------------------------
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.

此方法查询的内存是准确的。但是,StarRocks 中的某些内存是保留的但未使用。TcMalloc 计算的是保留的内存,而不是使用的内存。

此处 Bytes in use by application 指的是当前使用的内存。

  • metrics
curl -XGET http://be_ip:be_http_port/metrics | grep 'mem'
curl -XGET http://be_ip:be_http_port/metrics | grep 'column_pool'

metrics 的值每 10 秒更新一次。可以使用旧版本监控一些内存统计信息。