QuestDB如何配置内存使用?嵌入式部署启动无查询内存占用高如何调优
QuestDB嵌入式场景内存过高问题说明与调优方案
一、启动预分配内存机制说明
QuestDB默认启动时会预分配多块连续内存区域用于后续读写操作,而非运行时动态按需分配,这就是无查询状态下内存占用偏高的核心原因:
- 预分配的内存包括写缓冲区、页面缓存、元数据存储区、排序操作预留池等,是为了避免运行时频繁申请内存、降低GC停顿、提升读写吞吐量设计的,不属于闲置浪费的缓存。
- 嵌入式场景下默认配置是针对独立服务端场景设计的,所以会显得内存占用过高。
二、调优思路
嵌入式场景下调优核心是按需缩小各类预分配内存的上限,关闭不需要的功能模块,具体操作如下:
- 优先调整页面缓存、写缓冲区的大小,这两块是占内存最高的部分
- 关闭不需要的网络监听、HTTP服务等非嵌入式必需功能
- 限制后台异步任务的资源占用
三、可用核心配置选项
所有配置可以通过conf/server.conf文件配置,也可以嵌入式启动时通过Java系统属性传入,核心参数如下:
cairo.sql.page.cache.size:页面缓存最大容量,默认是64m,嵌入式场景可以调整到8m甚至更小,单位支持k/m/gcairo.wal.segment.size:WAL预写日志段大小,默认128m,嵌入式场景如果写入量小可以调整到16mcairo.max.query.sort.memory:单查询排序操作最大预留内存,默认512m,嵌入式轻量查询场景可以降到32mhttp.enabled:是否开启HTTP服务,嵌入式场景不需要的话可以设置为false,可减少约10-20M内存占用pg.enabled:是否开启PostgreSQL协议监听,不需要的话设置为falseline.tcp.enabled:是否开启行协议TCP写入监听,不需要的话设置为falsemetrics.enabled:是否开启指标采集,嵌入式场景不需要可以设置为false
注意:调整内存参数时要结合实际业务读写量、查询复杂度设置,避免出现OOM或者写入失败的问题,调整后可以先压测验证稳定性。
内容的提问来源于stack exchange,提问作者funnymay
相关产品推荐
相关产品推荐

