当我移动数据时发生错误,但之后内存永远不会自动释放
SQL插入到data_center。local_table SELECT * FROM data_center。where create_time>= 1667664000 AND create_time <1667750400
AND错误信息从服务器收到异常(版本21.8.2):代码:241。DB::Exception: Received from casd2412asdas.clickhouse.myid.com:9000。DB::异常:内存限制(总数)超过:将使用55.47 GiB(尝试分配4718592字节的块),最大:55.47 GiB:在执行SinkToOutputStream时。(MEMORY_LIMIT_EXCEEDED)
然后我试着观察记忆。我使用clickhouse-clinet
选择*,formatReadableSize(值)从system.asynchronous_metricsWHERE(度量类似'% each %')或(度量类似'%Mem%')按公制ASC订购格式PrettyCompactMonoBlock
┌─metric───────────────────────┬───────value─┬─formatReadableSize(value)─┐
│ CompiledExpressionCacheBytes │ 49152 │ 48.00 KiB │
│ CompiledExpressionCacheCount │ 10 │ 10.00 B │
│ MMapCacheCells │ 0 │ 0.00 B │
│ MarkCacheBytes │ 356803712 │ 340.27 MiB │
│ MarkCacheFiles │ 38894 │ 37.98 KiB │
│ MemoryCode │ 366669824 │ 349.68 MiB │
│ MemoryDataAndStack │ 87388315648 │ 81.39 GiB │
│ MemoryResident │ 56737828864 │ 52.84 GiB │
│ MemoryShared │ 267223040 │ 254.84 MiB │
│ MemoryVirtual │ 92213809152 │ 85.88 GiB │
│ OSMemoryAvailable │ 8797671424 │ 8.19 GiB │
│ OSMemoryCached │ 4891324416 │ 4.56 GiB │
│ OSMemoryFreePlusCached │ 9688956928 │ 9.02 GiB │
│ OSMemoryFreeWithoutCached │ 4797632512 │ 4.47 GiB │
│ OSMemoryTotal │ 66174210048 │ 61.63 GiB │
│ UncompressedCacheBytes │ 6871911688 │ 6.40 GiB │
│ UncompressedCacheCells │ 60288 │ 58.88 KiB │
└──────────────────────────────┴─────────────┴───────────────────────────┘
OSMemoryAvailable永远不会启动。
可以手动释放内存吗?
一般来说,一旦分配ClickHouse进程将不会返回系统内存。根据config.xml设置max_server_memory_usage_to_ram_ratio(默认为.9),ClickHouse通常会使用检测到的系统内存的90%
ClickHouse在任何时候使用的实际内存都是内部跟踪的,当查询正常或异常完成时将被释放。所以你看到的错误信息是:
DB::Exception: Memory limit (total) exceeded:将使用55.47 GiB(尝试分配4718592字节的块),最大:55.47 GiB;在执行SinkToOutputStream时。(MEMORY_LIMIT_EXCEEDED)
表示当前正在执行的任何查询、合并和更改实际上使用了55+ GB。您应该检查system.processes
表,以确定在出现错误消息时哪些操作正在消耗内存。