如何配置ClickHouse限制内存增长 将内存使用率上限控制在80%
核心原因
你观察到的内存周期性涨满回落是22.2版本ClickHouse在Linux环境下的常见现象:
- 监控用的
mem_used_percent统计的是Linux系统总内存占用,其中包含ClickHouse读写磁盘生成的可回收页缓存(Page Cache),这部分内存可随时释放给其他进程,不会触发OOM,你看到的内存骤降到0就是系统批量回收页缓存导致的 max_server_memory_usage_to_ram_ratio是进程内存比例软阈值,仅控制ClickHouse自身匿名内存的增长速度,不限制页缓存占用,所以单改这个参数没法把总内存卡在80%
配置方案
16G内存要把总使用率限制在80%(即12.8G),按以下三层配置即可,不需要调整业务逻辑:
1. 硬限制ClickHouse进程内存
不要用比例类配置,直接在config.xml中写死绝对值,避免容器、内存预留场景下比例计算偏差:
<max_server_memory_usage>11G</max_server_memory_usage>
这是硬阈值,ClickHouse所有查询、后台merge、mutation任务的总进程内存超过该值就会主动终止大内存任务,不会无限制占用内存。预留1.8G给系统内核、复制队列、运维基础服务,不会触发系统OOM。
2. 限制任务级内存,避免尖刺
在users.xml的default配置段中加任务级内存限制,防止单查询/单任务突发占满内存:
<profiles> <default> <max_memory_usage>4G</max_memory_usage> <!-- 单查询最大内存 --> <max_memory_usage_for_user>10G</max_memory_usage_for_user> <!-- 所有查询总内存上限 --> <max_bytes_before_external_group_by>2G</max_bytes_before_external_group_by> <!-- 聚合超2G落盘 --> <max_bytes_before_external_sort>2G</max_bytes_before_external_sort> <!-- 排序超2G落盘 --> <max_partition_load_bloat_factor>2</max_partition_load_bloat_factor> <!-- 降低无用分区加载冗余,22.2版本默认值偏高 --> </default> </profiles>
3. 控制页缓存占比,解决总内存涨满问题
你看到的大部分内存上涨都是页缓存导致的,两层配置限制:
- ClickHouse层:在
config.xml中加配置限制mmap映射的文件缓存大小<mmap_cache_size>1G</mmap_cache_size> - 系统层:修改
/etc/sysctl.conf调高页缓存回收优先级,让系统更早回收无用缓存
执行vm.vfs_cache_pressure=200sysctl -p立即生效。系统默认值100的策略会尽量攒缓存到内存接近满才回收,改成200后缓存占比到30%左右就会主动回收,不会让总内存摸到80%以上。
验证方法
配置完成重启ClickHouse后重点观测两个指标:
- ClickHouse进程内存:用CK自暴露的
clickhouse_server_memory_usage指标观测,会稳定在11G以内 - 系统总内存:
mem_used_percent会稳定在70%-78%区间,不会涨到接近100%,也不会出现骤降到0的大幅波动
如果偶发大查询报内存不足,把max_server_memory_usage每次加512M逐步调整即可,最高不要超过12G。
内容的提问来源于stack exchange,提问作者grvsd
相关产品推荐
相关产品推荐

