全部產品
Search
文件中心

ApsaraDB for ClickHouse:記憶體佔用分析

更新時間:Sep 10, 2024

監控雲資料庫ClickHouse的記憶體佔用情況是確保系統高效運行和維護資料庫效能的重要手段。本文介紹如何使用SQL語句查看雲資料庫ClickHouse記憶體佔用情況。

樣本環境

以下樣本以s-2-r-0節點為基礎環境,在實際使用過程中,請根據您的情境修改對應參數。如果您不知道如何擷取節點名稱,可以通過以下方式擷取。

  • 通過控制台:您可以在叢集監控頁面,擷取節點名稱。如何進入叢集監控頁面,請參見查看叢集監控資訊

  • 通過SQL語句:您可以執行以下語句,擷取叢集所有節點的名稱。

    SELECT * FROM system.clusters;

查看與釋放系統記憶體

記憶體的使用方式會直接影響系統的效能和穩定性。通過查看並分析system.asynchronous_metrics表資料,協助您辨識佔用記憶體多的操作或資料,為您釋放記憶體提供依據。

  • 查看記憶體佔用情況

    查看s-2-r-0節點中各記憶體佔用情況。

    SELECT *,
           formatReadableSize(value)
    FROM clusterAllReplicas('default', system.asynchronous_metrics)
    WHERE (metric like '%Cach%'
      OR metric like '%Mem%')
      AND substring(hostname(), 38, 8) = 's-2-r-0'
    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                  │
    └──────────────────────────────┴─────────────┴───────────────────────────┘

    分析記憶體佔用時重點關注以下參數。

    參數

    說明

    MarkCacheBytes

    標記緩衝。

    • 記錄當前標記緩衝所使用的位元組數。

    • ClickHouse使用標記緩衝來儲存資料檔案中的索引標記。

    UncompressedCacheBytes

    未壓縮緩衝。

    • 記錄當前未壓縮緩衝所使用的位元組數。

    • ClickHouse的資料在預存程序中通常採用壓縮技術,以節省儲存空間並提高I/O效率。未壓縮緩衝用於儲存從磁碟讀取並解壓的資料區塊,這樣在下一次需要相同的資料區塊時,可以直接從記憶體中擷取,不必重新從磁碟讀取和解壓,從而進一步提升了查詢效能。

  • 釋放緩衝

    經分析記憶體佔用情況後,如果您需要釋放緩衝,可以通過以下SQL語句釋放緩衝。

    重要
    • ClickHouse不支援釋放單個節點的緩衝,以下指令會以分布式DDL的形式下發,釋放叢集所有節點的緩衝。

    • 釋放緩衝將對效能產生一定影響,可能導致SQL執行速度變慢,請您根據業務情境謹慎使用。

    釋放標記緩衝。

    SYSTEM DROP MARK CACHE;

    釋放未壓縮緩衝。

    SYSTEM DROP UNCOMPRESSED CACHE;

查看Merge過程的記憶體佔用情況

ClickHouse的Merge操作主要作用是合并資料片段(parts)以提高查詢效能和減少儲存空間。它是一個定期執行的後台進程,可能會佔用大量記憶體。

瞭解Merge操作的記憶體使用量情況,可以協助您識別是否是因Merge操作導致了系統的高記憶體消耗。您可以通過查看system.merges表資料瞭解Merge操作的記憶體佔用的具體情況。

  • 查看前Merge佔用記憶體總和

    查看s-2-r-0節點上當前Merge佔用記憶體的總和。

    SELECT
      formatReadableSize (sum(memory_usage))
    FROM
      clusterAllReplicas ('default', system.merges)
    WHERE
      substring(hostname (), 38, 8) = 's-2-r-0';
  • 查看Merge記憶體佔用詳情

    查看s-2-r-0節點上,2023-09-17 01:15:002023-09-17 01:30:00內Merge記憶體佔用的詳細情況。

    SELECT *
    FROM   clusterAllReplicas ('default', 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 substring(hostname (), 38, 8) = 's-2-r-0'
    ORDER BY peak_memory_usage DESC                             -- 根據peak_memory_usage欄位降序排序
    LIMIT 1    

    參數說明

    參數

    說明

    event_type

    事件類型。

    通過不同事件類型來擷取相對應的事件資訊。您可以通過以下SQL語句擷取ClickHouse中的事件類型。

    SELECT DISTINCT event_type FROM clusterAllReplicas ('default', system.part_log) where substring(hostname (), 38, 8) = 's-2-r-0';

    event_time

    事件發生時間。

查看InMemory datapart的記憶體佔用

ClickHouse中,InMemory datapart通常用於提高查詢效能,它的記憶體佔用是ClickHouse的一個重要的效能指標。瞭解並監控InMemory datapart的記憶體佔用,可以協助您更好的管理、分配系統資源以及系統最佳化做有效依據。

system.parts系統資料表提供了有關表中分區和資料區段的資訊,您可以通過查看此表,查看InMemory datapart的記憶體佔用詳細情況。

查看s-2-r-0節點上被載入到記憶體中InMemory datapart的大小。

SELECT
  sum(data_uncompressed_bytes)
FROM
  clusterAllReplicas ('default', system.parts)
WHERE
  part_type = 'InMemory'
  AND substring(hostname (), 38, 8) = 's-2-r-0';

查看字典記憶體佔用總量

ClickHouse中,字典是一種重要的資料結構,用於最佳化查詢效能,特別是在處理維度資料表和外鍵時。通過查看system.dictionaries表資料,能夠協助您瞭解各個字典的載入狀態和記憶體佔用情況。

查詢s-2-r-0節點上字典記憶體的佔用大小。

SELECT 
  formatReadableSize(sum(bytes_allocated))
FROM clusterAllReplicas('default', system.dictionaries)
WHERE substring(hostname(), 38, 8) = 's-2-r-0';

查看記憶體表記憶體佔用詳情

ClickHouse中,Memory、Set、Join等引擎表的記憶體使用量是有限的,監控這些指標可以協助您預防因記憶體溢出導致的錯誤或異常行為。

查看Memory、Set和Join引擎表的記憶體佔用情況。

SELECT
   `database`,
    name,
    formatReadableSize(total_bytes)
FROM clusterAllReplicas('default',system.tables)
WHERE engine IN ('Memory','Set','Join');

查看Query記憶體佔用情況

針對性地分析特定時間段內的Query記憶體佔用情況,有助於識別特定時間段內可能的記憶體瓶頸或異常使用模式。

ClickHouse中,system.query_log表記錄了Query的詳細資料。這個表可以協助你審計和分析資料庫的使用方式,瞭解查詢效能,從而解決潛在的問題。

查看當前運行Query的記憶體佔用總量

查看s-2-r-0節點上正在啟動並執行Query佔用記憶體的總量。

SELECT formatReadableSize(sum(memory_usage)) -- 當前運行query記憶體佔用總量
FROM clusterAllReplicas('default', system.processes)
WHERE substring(hostname(), 38, 8) = 's-2-r-0';

查看當前運行Query的記憶體佔用詳情

查看s-2-r-0節點上正在啟動並執行Query佔用記憶體的詳情。

-- 當前運行query記憶體佔用
SELECT initial_query_id,
       elapsed,                               --query耗時
       formatReadableSize(memory_usage),      --記憶體消耗
       formatReadableSize(peak_memory_usage), --申請記憶體
       query                                  --query詳情
FROM clusterAllReplicas('default', system.processes)
WHERE substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY peak_memory_usage DESC
LIMIT 10;

查看歷史Query的記憶體佔用詳情

查看s-2-r-0節點在2024-01-05 17:00:002024-01-05 17:40:00時間段內,啟動並執行Query佔用記憶體的詳情。

-- 歷史query記憶體佔用
SELECT type,
       event_time,
       initial_query_id,
       formatReadableSize(memory_usage),
       query
FROM clusterAllReplicas('default', system.query_log)
WHERE (event_time >= '2024-01-05 17:00:00')
  AND (event_time <= '2024-01-05 17:40:00')
  AND substring(hostname(), 38, 8) = 's-2-r-0'
ORDER BY memory_usage DESC
LIMIT 10;