Trino Worker 規避 OOM 思路
背景
Trino 集群如果不做任何配置優化,按照默認配置上線,Master 和 Worker 節點都很容易發生 OOM。本文從 Trino 內存設計出發, 分析 Trino 內存管理機制,到限制與優化內存分配,使 Worker 節點不易發生 OOM。
Trino 內存類型
Trino(version 400)只有一個內存池,由 Coordinator 來管理這個內存池,即管理集群內存。
Coordinator 協調員一般為集群 Master 節點,Master 節點負責 SQL 解析、分析、優化以及分配查詢 Task 給 Worker 節點;Worker 節點負責處理 Task,主要為 load 數據和計算數據,這也是集群內最吃資源的一塊。所以我們也是針對這塊進行優化處理。
Trino 內存管理機制
Trino 會每 2s 做一次內存分析:
- 分析當前集群內存是否溢出
- 當前內存集群內存溢出:Trino 會檢查當前集群內存溢出的持續時間,如果持續時間超過了預設值(默認5min),則會根據配置好的 Kill Query策略去 Kill 掉查詢。
- query-low-memory-killer-policy:
- none :不會殺死任何查詢
- total-reservation :終止當前使用最多總內存的查詢。
- total-reservation-on-blocked-nodes:終止當前在內存不足的節點上使用最多內存的查詢
- query-low-memory-killer-policy:
- 當前內存集群內存溢出:Trino 會檢查當前集群內存溢出的持續時間,如果持續時間超過了預設值(默認5min),則會根據配置好的 Kill Query策略去 Kill 掉查詢。
- 分析當前時刻的所有查詢是否超出了預設的內存上限
- 分析查詢是否超出了 query.max-memory-per-node / query.max-memory / query.max-total-memory,超出則 kill 掉
- 這裡 kill 掉查詢的動作是有等待時間的。Trino 默認設置是等待5分鐘,5分鐘後集群依舊是oom狀態才會去 kill 掉查詢,可以設置 query.low-memory-killer.delay 值來減少等待時間。
以上的內存管理是針對 query 的,不針對 master 節點解析SQL、分析、優化和調度的操作
Trino 資源組限制內存
Trino 資源組也可以限制用戶使用內存
主要是通過 softMemoryLimit 限制內存的使用。
官方文檔
softMemoryLimit (required): maximum amount of distributed memory this group may use, before new queries become queued. May be specified as an absolute value (i.e. 1GB) or as a percentage (i.e. 10%) of the cluster』s memory.
意思是:在每個查詢開始之前,會判斷當前用戶組使用集群的內存情況,如果超過了設定值,則在隊列內等待。直至該用戶組使用集群內存降下到預設值。
如:下面配置的意思是,所有的用戶都屬於admin組,admin組限制了在集群內最高並發50條查詢,最長等待隊列是300;當admin使用集群內存超過80%時,查詢需要在隊列中等待。
{
"rootGroups": [
{
"name": "admin",
"softMemoryLimit": "80%",
"hardConcurrencyLimit": 50,
"maxQueued": 300,
}
],
"selectors": [
{
"user": ".*",
"group": "admin"
}
]
}
優化思路:
- 配置每個查詢的使用的內存上限
a. query.low-memory-killer.delay = 4GB
b. query.max-memory = 8GB
c. query.max-memory = 8GB - 降低當集群內存不足時, 降低 Trino kill query 的等待時間和 kill 查詢的策略
a. query.low-memory-killer.delay = query.low-memory-killer.delay
b. query.low-memory-killer.delay = 10s - 配置資源組,避免當集群內存負載高時插入新查詢
- 開啟 spill 選項,允許內存 load 到磁盤
通過以上配置,Trino Worker 就能變得穩定起來。另外可以通過 event listen 機制收集並持久化 query 日誌,觀察和分析 Trino 壓力與瓶頸,從而針對性提升 Trino 的性能。Trino 調優我覺得是很艱難的一件事,我一步步摸索着過來,路漫漫而遠兮,吾將上下而求索。