内存管理

本章节简单的介绍StarRocks中的内存使用分类和基本的查看内存管理的方法

内存分类

解释:

标识名称说明
processBE 总使用内存
query_pool查询内存分为两部分: (1)执行层使用内存 (2)存储层使用内存。
load导入内存主要是 MemTable
table_meta元数据内存Schema, Tablet元数据, RowSet元数据, Column元数据, ColumnReader, IndexReader
compaction多版本合并内存用于数据导入完成后的 Compaction
snaphost快照内存一般用于 clone, 内存使用很少
column_poolColumn pool内存池用于加速Column申请释放的列缓存
page_cacheBE自有PageCache默认是关闭的,用户可以通过修改BE文件主动打开

内存相关的配置

  • BE 配置
名称默认值说明
vector_chunk_size4096Chunk 行数
tc_use_memory_min10737418240TCmalloc 最小保留内存,只有超过这个值,StarRocks才将空闲内存返还给操作系统
mem_limit80%BE可以使用的机器总内存的比例,如果是BE单独部署的话,不需要配置,如果是和其它占用内存比较多的服务混合部署的话,要单独配置下
disable_storage_page_cachetrue是否打开StarRocks自有PageCachestorage_page_cache_limit0PageCache容量限制
write_buffer_size104857600单个MemTable内存中的容量限制超过这个限制要执行刷盘
load_process_max_memory_limit_bytes107374182400导入总内存限制min(mem_limit * load_process_max_memory_limit_percent, load_process_max_memory_limit_bytes)是实际可使用的导入内存限制到达这个限制,会触发刷盘逻辑
load_process_max_memory_limit_percent60导入总内存限制min(mem_limit * load_process_max_memory_limit_percent, load_process_max_memory_limit_bytes)是实际可使用的导入内存限制到达这个限制,会触发刷盘逻辑
default_load_mem_limit2147483648单个导入实例,接收端的内存限制到达这个限制,会触发刷盘逻辑当前,需要配合Session变量 load_mem_limit 的修改才能生效
max_compaction_concurrency10表示禁用 Compaction
cumulative_compaction_check_interval_seconds1Compaction Check 间隔时间
  • Session 变量
名称默认值说明
exec_mem_limit2147483648单个 instance 内存限制
load_mem_limit0单个导入任务的内存限制,如果是0,会取exec_mem_limit

查看内存使用

  • mem_tracker
// 看整体内存统计
<http://be_ip:be_web_port/mem_tracker>

// 看更细粒度的内存统计
<http://be_ip:be_web_port/mem_tracker?type=query_pool&upper_level=3>
  • tcmalloc
<http://be_ip:be_web_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,有些内存使用是Reserve的,但是并没有使用,TcMalloc统计的实际上是Reserve的内存,而不是实际使用的内存。

这里Bytes in use by application 指的是当前使用的内存.

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

metrics的值是10秒更新一次,老的版本,可以通过这种方法,监控部分内存统计。