本文介绍如何通过SQL分析ByteHouse 企业版查询内存占用分析方法。
以下示例以 192.18.. 节点为基础环境,在实际使用过程中,请根据您的场景修改对应参数。如果您不知道如何获取节点名称,可以通过以下方式获取。
SELECT * FROM system.clusters;
内存的使用情况会直接影响系统的性能和稳定性。通过查看并分析system.asynchronous_metrics
表数据,帮助您辨识占用内存多的操作或数据,为您释放内存提供依据。
查看 192.18.. 节点中各内存占用情况。
SELECT *, formatReadableSize(value) FROM clusterAllReplicas('<cluster_name>', system.asynchronous_metrics) WHERE (metric like '%Cach%' OR metric like '%Mem%') AND host() = '192.18.*.*' ORDER BY metric;
┌─metric───────────────────────┬───value─────┬─formatReadableSize(value)─┐ │ CGroupMemoryTotal │ 34359738368 │ 32.00 GiB │ │ CGroupMemoryUsed │ 4641132544 │ 4.32 GiB │ │ CompiledExpressionCacheBytes │ 16384 │ 16.00 KiB │ │ CompiledExpressionCacheCount │ 2 │ 2.00 B │ │ FilesystemCacheBytes │ 0 │ 0.00 B │ │ FilesystemCacheFiles │ 0 │ 0.00 B │ │ HashTableStatsCacheEntries │ 8 │ 8.00 B │ │ HashTableStatsCacheHits │ 528011 │ 515.64 KiB │ │ HashTableStatsCacheMisses │ 15 │ 15.00 B │ │ IndexMarkCacheBytes │ 0 │ 0.00 B │ │ IndexMarkCacheFiles │ 0 │ 0.00 B │ │ IndexUncompressedCacheBytes │ 0 │ 0.00 B │ │ IndexUncompressedCacheCells │ 0 │ 0.00 B │ │ MMapCacheCells │ 0 │ 0.00 B │ │ MarkCacheBytes │ 7968 │ 7.78 KiB │ │ MarkCacheFiles │ 24 │ 24.00 B │ │ MemoryCode │ 390758400 │ 372.66 MiB │ │ MemoryDataAndStack │ 14373392384 │ 13.39 GiB │ │ MemoryResident │ 761221120 │ 725.96 MiB │ │ MemoryShared │ 377688064 │ 360.19 MiB │ │ MemoryVirtual │ 18072178688 │ 16.83 GiB │ │ OSMemoryAvailable │ 32480075776 │ 30.25 GiB │ │ OSMemoryCached │ 4239949824 │ 3.95 GiB │ │ OSMemoryFreePlusCached │ 32480169984 │ 30.25 GiB │ │ OSMemoryFreeWithoutCached │ 28240220160 │ 26.30 GiB │ │ OSMemoryTotal │ 32881352704 │ 30.62 GiB │ │ QueryCacheBytes │ 0 │ 0.00 B │ │ QueryCacheEntries │ 0 │ 0.00 B │ │ UncompressedCacheBytes │ 349487 │ 341.30 KiB │ │ UncompressedCacheCells │ 114 │ 114.00 B │ └──────────────────────────────┴─────────────┴───────────────────────────┘
分析内存占用时重点关注以下参数。
参数 | 说明 |
---|---|
cluster_name | 集群名称 |
MarkCacheBytes | 标记缓存。
|
UncompressedCacheBytes | 未压缩缓存。
|
经分析内存占用情况后,如果您需要释放缓存,可以通过以下SQL语句释放缓存。
注意
ByteHouse 支持释放单个节点的缓存,你可是在查询页面选择全节点或选择一个节点模式执行如下指令,释放集群单节点或全部节点的缓存。释放缓存将对性能产生一定影响,可能导致SQL执行速度变慢,请您根据业务场景谨慎使用。
释放标记缓存。
SYSTEM DROP MARK CACHE;
释放未压缩缓存。
SYSTEM DROP UNCOMPRESSED CACHE;
ByteHouse的Merge操作主要作用是合并数据片段(parts)以提高查询性能和减少存储空间。它是一个定期执行的后台进程,可能会占用大量内存。
了解Merge操作的内存使用情况,可以帮助您识别是否是因Merge操作导致了系统的高内存消耗。您可以通过查看system.merges
表数据了解Merge操作的内存占用的具体情况。
查看192.18.*.*节点上当前Merge占用内存的总和。
SELECT formatReadableSize (sum(memory_usage)) FROM clusterAllReplicas ('<cluster_name>', system.merges) WHERE host() = '192.18.*.*';
查看192.18.*.*节点上,2023-09-17 01:15:00
至2023-09-17 01:30:00
内Merge内存占用的详细情况。
SELECT * FROM clusterAllReplicas ('<cluster_name>', system.part_log) -- 从system.part_log系统表中选择记录 WHERE (event_type = 'MergeParts') -- 查找event_type为'MergeParts'的事件 AND (event_time >= '2023-09-17 01:15:00') -- 事件时间大于或等于2023年9月17日01:15:00 AND (event_time <= '2023-09-17 01:30:00') -- 且事件时间小于或等于2023年9月17日01:30:00 AND host() = '192.18.*.*' ORDER BY peak_memory_usage DESC -- 根据peak_memory_usage字段降序排序 LIMIT 1
参数 | 说明 |
---|---|
cluster_name | 集群名称 |
event_type | 事件类型。
|
event_time | 事件发生时间。 |
在ByteHouse中,InMemory datapart
通常用于提高查询性能,它的内存占用是ByteHouse的一个重要的性能指标。了解并监控InMemory datapart
的内存占用,可以帮助您更好的管理、分配系统资源以及系统优化做有效依据。system.parts
系统表提供了有关表中分区和数据段的信息,您可以通过查看此表,查看InMemory datapart
的内存占用详细情况。
查看192.18.*.*节点上被加载到内存中InMemory datapart
的大小。
SELECT sum(data_uncompressed_bytes) FROM clusterAllReplicas ('<cluster_name>', system.parts) WHERE part_type = 'InMemory' AND host() = '192.18.*.*';
在ByteHouse中,字典是一种重要的数据结构,用于优化查询性能,特别是在处理维度表和外键时。通过查看system.dictionaries
表数据,能够帮助您了解各个字典的加载状态和内存占用情况。
查询192.18.*.*节点上字典内存的占用大小。
SELECT formatReadableSize(sum(bytes_allocated)) FROM clusterAllReplicas('<cluster_name>', system.dictionaries) WHERE host() = '192.18.*.*';
在ByteHouse 中,有一种特殊的数据类型BitMap64,底层使用BitEngine 字典,解决bitmap存储的元素过于稀疏。可通过查看system.bitengine表数据,能够帮助内存占用情况。
SELECT database, table, arraySum(encoded_columns_size) as dict_size, formatReadableSize(ceil(dict_size / 10000000.0) * 600 * 1024 * 1024) as memory_usage FROM clusterAllReplicas('<cluster_name>',system.bitengine) WHERE host() = '192.18.*.*'; ORDER BY dict_size DES;
在ByteHouse中,Memory、Set、Join等引擎表的内存使用是有限的,监控这些指标可以帮助您预防因内存溢出导致的错误或异常行为。
查看Memory、Set和Join引擎表的内存占用情况。
SELECT `database`, name, formatReadableSize(total_bytes) FROM clusterAllReplicas('<cluster_name>',system.tables) WHERE engine IN ('Memory','Set','Join');
针对性地分析特定时间段内的Query内存占用情况,有助于识别特定时间段内可能的内存瓶颈或异常使用模式。
在ByteHouse中,system.query_log
表记录了Query的详细信息。这个表可以帮助你审计和分析数据库的使用情况,了解查询性能,从而解决潜在的问题。
查看192.18.*.*节点上正在运行的Query占用内存的总量。
SELECT formatReadableSize(sum(memory_usage)) -- 当前运行query内存占用总量 FROM clusterAllReplicas('<cluster_name>', system.processes) WHERE host() = '192.18.*.*';
查看192.18.*.*节点上正在运行的Query占用内存的详情。
-- 当前运行query内存占用 SELECT initial_query_id, elapsed, --query耗时 formatReadableSize(memory_usage), --内存消耗 formatReadableSize(peak_memory_usage), --申请内存 query --query详情 FROM clusterAllReplicas('<cluster_name>', system.processes) WHERE host() = '192.18.*.*' ORDER BY peak_memory_usage DESC LIMIT 10;
查看192.18.*.*节点在2024-01-05 17:00:00
和2024-01-05 17:40:00
时间段内,运行的Query占用内存的详情。
-- 历史query内存占用 SELECT type, event_time, initial_query_id, formatReadableSize(memory_usage), query FROM clusterAllReplicas('<cluster_name>', system.query_log) WHERE (event_time >= '2024-01-05 17:00:00') AND (event_time <= '2024-01-05 17:40:00') AND host() = '192.18.*.*' ORDER BY memory_usage DESC LIMIT 10;