天天看點

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

memory cgroup是cgroup的資源限制功能之一,可以控制特定程序可以使用的記憶體量。

memory cgroup

memory cgroup是cgroup(參考hack #7)之一,用來控制程序所使用的記憶體(lru管理的緩存)數量。

其用法有很多種,例如,可以用來避免因一時處理較大檔案或大量檔案,而導緻無用的頁面緩存增大,記憶體資源緊張的情況。另外,還可以在多使用者環境中限制各使用者可以使用的記憶體量。

用法

memory cgroup是cgroup的一種,是以使用前必須挂載cgroup檔案系統。啟用memory cgroup時,可以為挂載指令指定memory選項,也可以不指定選項以啟用cgroup的所有功能。

本節使用下列方式挂載到/cgroup。

挂載cgroup後,通過在/cgroup下建立新目錄來建立新的分組。memory cgroup可以通過對該目錄下的檔案設定參數,來控制記憶體使用量。

另外,能否通過cgroup檔案系統控制以及特殊檔案的種類多少,會根據核心版本和核心config的不同有所差異。

cgroup檔案系統中關于memory cgroup配置的主要特殊檔案如表2-3所示。

表2-3 關于memory cgroup的主要檔案

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

限制記憶體使用量

記憶體使用量可以使用memory.limit_in_bytes進行限制。這裡建立一個名稱為groupa的分組,嘗試将記憶體使用量限制為10mb。可以通過如下指令行實作。

下面看一下memory cgroup限制記憶體使用量的效果。

1.擷取較大的檔案

首先,看一下不對記憶體使用量進行限制時的結果。

從free來看,原本有約600mb的空閑記憶體減少到約60mb。而cached的值大幅增加,可以看出對wget指令擷取的約700mb的檔案進行緩存時使用了空閑記憶體。

下面看一下将記憶體使用量限制為10mb時的結果。

從free指令中cached的差别可以看出記憶體使用量限制在約10mb。

2.備份處理

在通過tar指令建立資料庫時也可以使用。以linux核心源代碼資料庫為例進行說明。

不限制記憶體使用量時:

記憶體使用量限制為10mb時:

可以發現記憶體同樣限制為10mb。

層次結構

通過memory cgroup控制的分組可以采用層次結構。可以在memory.use_hierarchy中寫入1,啟用分組的層次結構。

例如,通過執行下列指令審校者注1,可以建立如圖2-1所示的分組結構。

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

圖2-1 建立的分組結構

顯示統計資訊

關于各分組記憶體使用量的統計資訊可以從memory.stat檔案中讀取(見表2-4)。

表2-4 記憶體使用量的統計資訊

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

下列内容在使用層次結構時有效,将顯示層次結構中處于上層的分組所限制的值(見表2-5)。

表2-5 使用層次結構時的分組限制值

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

表2-6所示為層次結構中分組的合計,在本分組下建立的所有分組的合計值。

表2-6 層次結構中分組下的合計值

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #12 使用Memory Cgroup限制記憶體使用量

小結

本節介紹了memory cgroup。使用memory cgroup設定記憶體使用量的上限,就可以避免産生多餘的頁面緩存,減少對其他處理的影響。

參考文獻

documentation/cgroup/memory.txt

—hiroshi shimamoto