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