You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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=200
    
    执行sysctl -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:31:28