天天看點

新鮮出爐!Docker容器資源限制-記憶體篇

前言

cgroups 是Docker的兩大核心之一,另一個是namespace ,在講解網絡篇時有提到。cgroups是控制群組,是linux 核心用來限制資源,如記憶體,磁盤,網絡等。

linux 記憶體限制

在 Cpu 資源限制篇中有提到,linux 通過 cgroup進行cpu限制,對于記憶體的限制,也是通過 memory cgroup進行處理的,而這個的目錄是在 /sys/fs/cgroup/memory, 主要分析幾個參數, memory.limit_in_bytes, memory.oom_control 和 memory.usage_in_bytes

  • memory.limit_in_bytes 限制控制組裡的使用記憶體的最大值,那達到這個限制後,作業系統會怎麼做呢?需要配合 memory.oom_control 來進行處理
  • memory.oom_control 當 memory.limit_in_bytes 達到最大值後,決定要不要觸發 oom killer, 如果沒有設定的話,預設是 OOM Killer ,可以殺死哪些程序,通過 cgroup.procs 來決定。 當這裡的值設定成 1後,那這個控制組内的程序都不會被殺掉。
  • memory.usage_in_bytes 這個是一個隻讀,它表目前控制組裡所有程序實際使用的記憶體總和。

當 memory.usage_in_bytes 和 memory.limit_in_bytes越接近時, OOM的風險就越高。

因為 cgroup 是樹狀的,父節點控制組内的 memory.limit_in_bytes 可以限制它的子節點中所有程序的記憶體使用。

新鮮出爐!Docker容器資源限制-記憶體篇

如上面的 g1限制為 100M,即使 g3限制為 200M,也不能超過g1的100M。

當然,如果在一個控制内的程序比較多,哪個程序會被選擇進行 OOM killer,也是一個計算的過程,而影響這個計算的參數是在 /proc/{pid}/oom_score_adj 的值,控制組中總的可用頁面和程序的 oom_score_adj 的乘積,再加上程序已經使用的實體記憶體得到的最大值對應的程序,就會被系統進行 killer .

可以通過 journalctl -k 或是 檢視 /var/log/message 檔案檢視 oom kill 的資訊。

docker 設定記憶體限制

  1. 設定 docker的記憶體大小
新鮮出爐!Docker容器資源限制-記憶體篇
  1. 檢視指定容器的 memory cgroup
新鮮出爐!Docker容器資源限制-記憶體篇
  1. 檢視 memory.limit_in_bytes 為 10M
新鮮出爐!Docker容器資源限制-記憶體篇
  1. 檢視對應的程序清單
新鮮出爐!Docker容器資源限制-記憶體篇