presto內存配置以及調優(防止OOM等操作)

參考文檔
https://prestodb.io/blog/2019/08/19/memory-tracking
http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/#more (大佬博客,受益匪淺)

前言

良好的掌握內存配置有利於對於presto進行更好的配置和調優

Presto的內存池

在Presto引擎中,有兩種類型的內存分配:user和system。User memory是和輸入的數據強相關的。(例如,聚合的內存使用與其成正比)。system memory 是執行的副產品(比如表掃描和寫入緩衝區),並且不一定與查詢輸入聚合等操作有很強的相關性。

內存的分配直接來自於presto的worker的memory pools。 memory pools由2個pools組成 General Pool和Reserved Pool,如圖所示
image.png

General Pool:General Pool提供User memory和system memory的分配在正常模式下。
Reserved Pool : 當有一個worker的General Pool 內存耗盡,reserved pool將會發揮作用。這個時候coordinator 將會選出集羣出消耗內存最大的查詢,並將該查詢分配給所有worker的reserved pool。

Reserved Pool的值等於query.max-total-memory-per-node的大小。 query.max-total-memory-per-node是單個節點User memory 和system memory佔用的最大值。
而且Reserved Pool是啓動時系統預留的,一起動就會佔用,所以現在有一個問題,在實際中的情況來講,我們會極少使用到Reserved Pool,而且它還佔用了很多的內存資源。
所以我們可以通過配置參數

experimental.reserved-pool-enabled=false

來禁用Reserved Pool。如圖所示
image.png

內存池的查看的URL爲 discovery.uri/ui/worker.html?node.id (presto的etc配置中的),這樣我們就可以方便的查看每個worker的內存相關情況了

presto內存相關的參數

參考資料
https://prestodb.io/docs/current/admin/properties.html

query.max-memory-per-node

在單個worker上面可以使用的最大的user memory值 (默認JVM max memory * 0.1)

query.max-total-memory-per-node

在單個worker上面可以使用的最大的user memory + system memory (默認JVM max memory * 0.3)

query.max-memory

查詢在整個集羣的user memory最大使用量 (默認20G)

query.max-total-memory

查詢在整個集羣的user memory+system memory最大使用量 (默認query.max-memory * 2)

memory.heap-headroom-per-node

這個目前不太理解

query.low-memory-killer.policy

這個配置決定了當集羣內存不足時的終止策略。有三個參數none,total-reservation,total-reservation-on-blocked-nodes (後兩個參數的區別以後懂了再講)

具體配置

具體配置在presto安裝目錄/etc/config.properties裏面配置,我這邊借鑑了這篇文章的配置http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/#more
,我直接貼出他的回答(假設JVM XMX 爲80G)

query.max-memory=120GB  # 默認爲20GB,query.max-memory-per-node * 8 * 0.8 ,傾斜按照0.8算即可
query.max-memory-per-node=20GB   # 默認值0.1 * XMX,一般線上按照0.25*XMX算,這個最好結合自己併發,如果併發大,大查詢多,值最好小一點,穩定性考慮
query.max-total-memory-per-node=32GB  # 默認值0.3*XMX,一般設置爲0.4*XMX
experimental.reserved-pool-enabled=false  # 不使用RESERVED_POOL
memory.heap-headroom-per-node=16GB  # 默認0.3*XMX,一般使用的是0.2*XMX
query.low-memory-killer.policy=total-reservation-on-blocked-nodes  # Kill策略,幹掉Blocked的最大查詢,GENERAL_POOL滿了,防止OOM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章