假如設置最大Heap內存爲35G
需要考慮的Heap最大值因素,因爲需要給系統與其他守護進程留有空間,所以最好不要將內存設置爲機器內存大小
prestor參數
query.max-memory-per-node
每個機器上用於執行用戶任務的內存大小,比如:排序等操作,
超出限制將kill
query.max-total-memory-per-node
每個節點上用於系統與用戶任務的內存大小,該參數據包括上一個參數,多出系統所用內存,比如系統分配讀寫等,超出限制將kill
query.max-memory
整個集羣可以使用的最大用戶執行內存
query.max-total-memory
整個集羣可以使用的最大的系統和用戶執行內存
memory.heap-headroom-per-node
各人理解是預保留的內存區域,用於一些非用戶查詢,有點像jvm perm(錯誤的理解)
該區域爲不監控內存區,主要保存一些輔助信息,比如幫助jvm gc回收等
presto內存分類:通用pool,系統 pool,預留pool
通用pool主要是執行查詢
系統pool主要執行查詢的系統調用
預留pool與上面的memory.heap-headroom-per-node對應(錯誤的理解)
預留pool是爲一些大的查詢預留的內存空間,比如有很多併發查詢,佔用了大多數的空間,當有一個大的查詢它一直獲得不到
資源會將它分配預留空間,但是該空間的查詢只 能是排隊執行的
參數與pool的對應關係
0.201 前 query.max-memory-per-node 代表預留pool的大小
0201後 query.max-total-memory-per-node代表預留pool的大小
0.201後系統pool被廢除,可以看到 query.max-total-memory/query.max-total-memory-per-node
來控制用戶加系統內存大小
所以通用pool 在最新版本 = max heap - query.max-total-memory-per-node - memory.heap-headroom-per-node
- query.max-memory-per-node = 12GB
- query.max-total-memory-per-node =15GB
- memory.heap-headroom-per-node = 8GB
計算通用pool=35G - 15G - 8G
假如我們確定query.max-memory
48G還需要考慮query.initial-hash-partitions 的設置
如果query.initial-hash-partitions =8那麼
48G / 8 =6G
那麼 12G/6G =2,這表示如果在hash partition的時候,現有通用pool大小可以容忍兩倍的數據傾斜。
初次察看presto相關文檔,不對之處,請大家指證。