深入理解Presto 3 Presto記憶體管理

2021-09-19 20:15:39 字數 1353 閱讀 2164

presto採用邏輯的記憶體池,來管理不同型別的記憶體需求。

presto把整個記憶體劃分成三個記憶體池,分別是system pool ,reserved pool, general pool。

system pool 是用來保留給系統使用的,預設為40%的記憶體空間留給系統使用。

reserved pool和general pool 是用來分配query執行時記憶體的。

其中大部分的query使用general pool。 而最大的乙個query,使用reserved pool, 所以reserved pool的空間等同於乙個query在乙個機器上執行使用的最大空間大小,預設是10%的空間。

general則享有除了system pool和general pool之外的其他記憶體空間。

system pool自然不必說,名義上是規定系統所用記憶體,實際是為了劃定出query能夠使用的記憶體上限。避免query使用記憶體太多,造成oom。

那麼,為什麼需要保留區記憶體呢?並且保留區記憶體正好等於query在機器上使用的最大記憶體?

如果沒有reserved pool, 那麼當query非常多,並且把記憶體空間幾乎快要佔完的時候,某乙個記憶體消耗比較大的query開始執行。但是這時候已經沒有記憶體空間可供這個query執行了,這個query一直處於掛起狀態,等待可用的記憶體。 但是其他的小記憶體query跑完後,又有新的小記憶體query加進來。由於小記憶體query占用記憶體小,很容易找到可用記憶體。 這種情況下,大記憶體query就一直掛起直到餓死。

所以為了防止出現這種餓死的情況,必須預留出來一塊空間,共大記憶體query執行。 預留的空間大小等於query允許使用的最大記憶體。presto每秒鐘,挑出來乙個記憶體占用最大的query,允許它使用reserved pool,避免一直沒有可用記憶體供該query執行。

presto記憶體管理,分兩部分:

機器記憶體管理

當query記憶體和機器記憶體彙總之後,coordinator會挑選出乙個記憶體使用最大的query,分配給reserved pool。

記憶體管理是由coordinator來管理的, coordinator每秒鐘做一次判斷,指定某個query在所有的機器上都能使用reserved 記憶體。那麼問題來了,如果某台機器上,,沒有執行該query,那豈不是該機器預留的記憶體浪費了?為什麼不在單台機器上挑出來乙個最大的task執行。原因還是死鎖,假如query,在其他機器上享有reserved記憶體,很快執行結束。但是在某一台機器上不是最大的task,一直得不到執行,導致該query無法結束。

深入理解Linux核心3

unix核心提供了應用程式可以執行的環境,因此,核心必須實現一組服務及相應的介面。應用程式使用這些介面而不會跟硬體資源直接互動。啟用核心例程的幾種方式 核心恢復乙個程序執行時,用程序描述符中的合適字段裝載cpu暫存器 等待狀態可能會有很多,有程序描述符佇列實現 自旋鎖 檢查訊號量耗時多,對於時間較短...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...