真实查三层内存限制的默认值,发现单查询和单用户默认不限,但服务器整体有一个真实按物理内存自动算出的硬上限,并验证触发超限时精确的审计记录。
代码SELECT name, value FROM system.settings WHERE name IN ('max_memory_usage','max_memory_usage_for_user'); SELECT name, value FROM system.server_settings WHERE name='max_server_memory_usage'; sysctl hw.memsize; -- 本机真实物理内存
max_memory_usage 0 ← 真实默认不限制单条查询 max_memory_usage_for_user 0 ← 真实默认不限制单个用户的所有查询总和 max_server_memory_usage 15461882265 ← 真实约14GB,非零 本机真实物理内存:16 GB 15461882265 / 1024^3 ≈ 14 GB ≈ 16GB的90%左右
这组真实数字揭示了一件容易被忽视的事:默认配置下,单条查询本身是没有内存上限的,能不能把内存用爆,取决于这条查询实际需要多少内存和整台服务器还剩多少内存——但服务器整体确实真实设了一个硬上限,而且这个上限不是随便写的常数,是ClickHouse启动时真实按检测到的物理内存自动计算出来的一个比例值。
SELECT k, count() FROM demo.memtest GROUP BY k SETTINGS max_memory_usage=50000000 FORMAT Null; → DB::Exception: Query memory limit exceeded: would use 53.95 MiB (attempt to allocate chunk of 0.00 B), maximum: 47.68 MiB: While executing AggregatingTransform. (MEMORY_LIMIT_EXCEEDED) 真实的完整审计记录: SELECT type, exception_code, exception FROM system.query_log WHERE ...; → ExceptionWhileProcessing 241 Query memory limit exceeded...
每一步都是本文上面用真实内存限制配置跑出来的原始结果。
max_memory_usage/max_memory_usage_for_user/max_server_memory_usage 三层限制