參考文檔
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,如圖所示
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。如圖所示
內存池的查看的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