可能影響容器化應用程式的cgroup記憶體管理問題

2021-09-30 22:17:14 字數 1172 閱讀 2556

近日,linkedin工程團隊發表了一篇題為「不要讓linux控制組不受控制地執行」的文章。控制組(cgroup)是linux的一項特性,像docker和coreos這樣的專案使用該特性限制程序的資源使用。該文概括地介紹了cgroup在記憶體管理方面存在的幾個可能導致效能退化的問題以及可能的解決方案。

cgroup是一種可以確保應用程式使用的資源不超出限額的機制,但不保證隔離性。乙個作業系統例項中可以執行多個cgroup,其中每乙個所使用的記憶體、cpu等都有不同的限額。不過,當有額外的記憶體需求(文章作者稱之為「記憶體壓力」)時,作業系統的行為可能會導致在cgroup中執行的應用程式出現意料之外的不良結果。

cgroup是按層次組織的,作業系統在「根」cgroup中執行,其他cgroup都是根cgroup的子節點。例如,docker容器會執行在根cgroup的乙個子cgroup中。

該文**的問題涉及「匿名記憶體」和「頁面快取」,前者是程式請求的記憶體,後者用來儲存程式資料的快取版本。通常,這些資料是儲存在類似硬碟這樣的永久性儲存上,供程式執行時使用。快取用於提高那些資料的訪問速度。這兩種記憶體型別的分配總是可以被根cgroup或作業系統作廢。

當主存可用時,作業系統會將頁面快取載入到ram,但當應用程式請求額外的記憶體時,它會**記憶體。記憶體**會導致頁面快取被刪除,這是跨cgroup的,因為在這種情況下,os不會遵守cgroup自己的設定。這可能導致cgroup的頁面快取被**,影響了應用程式的效能。

當通過**頁面快取滿足了cgroup的記憶體需求時,另乙個問題出現了。用於儲存頁面快取的記憶體是cgroup記憶體限額的一部分。因此,如果cgroup(在docker環境裡,則是容器)分得了8gb記憶體,則它需要將這8gb的空間同時用於頁面快取和匿名記憶體。這一點很容易忽視,因而可能會導致錯誤的效能預期。

當需要的主存超過系統可用的記憶體時,作業系統會執行交換操作,將儲存在主存中的程式資料寫入輔存,如硬碟。作業系統可以從任意子cgroup把使用者記憶體交換出去,導致那些組中的應用程式效能退化。

對於這些問題,文章作者提出了幾項建議,其中包括「預觸(pre-touching)」記憶體,即確保內存在程序啟動時分配,而不是在程式請求時。在不同的平台上,具體的做法也不相同。另外,也可以更好地估計應用程式的記憶體占用,那樣,記憶體分配就可以更準確。頁面快取不容易估計,但匿名記憶體很容易。匿名記憶體可以通過類似駐留集大小(rss)這樣的系統指標來估計。

新版本的cgroup已經發布。該版本包含若干改進,但尚未針對這些情況進行測試。

可能影響容器化應用程式的cgroup記憶體管理問題

近日,linkedin工程團隊發表了一篇題為 不要讓linux控制組不受控制地執行 的文章。控制組 cgroup 是linux的一項特性,像docker和coreos這樣的專案使用該特性限制程序的資源使用。該文概括地介紹了cgroup在記憶體管理方面存在的幾個可能導致效能退化的問題以及可能的解決方案...

Docker應用程式容器技術 轉

docker 是乙個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到乙個可移植的容器中,然後發布到任何流行的 linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。docker 是 paas 提供商 dotcloud 開源的乙個基於 lxc 的高階容器引擎,...

應用程式現代化

本篇文章版權由 ecf和 hp所有 john dodge,ecf社群經理 應用程式現代化是大多數cio頭腦中最關注的,但實施的節奏及其優先性取決於幾個不同的因素。換言之,應用程式現代化很重要,但根據三位cio 他們同時也是enterprise cio forum ecf council 成員 的看法...