docker的資源隔離

六種名稱空間

namespace 系統調用參數 隔離內容 內核版本
UTS CLONE_NEWUTS 主機名和域名 2.6.19
IPC CLONE_NEWIPC 信號量,消息隊列,共享內存 2.6.19
Mount CLONE_NEWNS 掛載點(文件系統) 2.4.19
PID CLONE_NEWPID 進程編號 2.6.24
Network CLONE_NEWNET 網絡設備,網絡棧,端口 .6.29
User USER 用戶和用戶組 3.8

簡單來說,容器技術就是一種資源的隔離技術,就是通過對以上內核的隔離,來實現的。

隔離限制

有了資源隔離,肯定要對隔離出來的出來的資源進行限制,不能放任某一個隔離環境對資源的無限消耗使用。最常見的資源就是CPU和內存了。
比如一個宿主機共有32C64G,在他上面隔離出了兩個名稱空間,我們可以按照比例給這兩個名稱空間分配資源,比如說CPU,各佔50%,此時兩個名稱空間內的進程就只能使用16個CPU的資源,超過16個CPU,可能就會擠佔其他的名稱空間的CPU,如果其他名稱空間沒有多餘的CPU,那麼此時該名稱空間內的進程就需要排隊等待CPU,或者給兩個各25%的CPU,還有50%可以留給宿主機。最常見的我們還是應該按照數量來分配,比如說給第一個名稱空間16個CPU,第二個也16個CPU。除此之外還有內存,內存一般都是按照大小進行劃分,給了第一個名稱空間16G,那麼他在此名稱空間內的進程就只能最多使用16G,超過16G是不可以的,因爲內存不可以壓縮,更不能搶佔,超過後,該名稱空間內使用內存最最多的進程就會被OOM掉。
linux通過一種叫做control groups(cgroups)的機制來控制資源,他有以下四種功能

  • 資源限制:cgroups 可以對任務是要的資源總額進行限制。比如設定任務運行時使用的內存上限,一旦超出就發 OOM。
  • 優先級分配:通過分配的 CPU 時間片數量和磁盤 IO 帶寬,實際上就等同於控制了任務運行的優先級。
  • 資源統計:cgoups 可以統計系統的資源使用量,比如 CPU 使用時長、內存用量等。這個功能非常適合當前雲端產品按使用量計費的方式。
  • 任務控制:cgroups 可以對任務執行掛起、恢復等操作。

cgroups通過子系統來控制不同的資源,常見的如下

  • blkio 對塊設備的 IO 進行限制。
  • cpu 限制 CPU 時間片的分配,與 cpuacct 掛載在同一目錄。
  • cpuacct 生成 cgroup 中的任務佔用 CPU 資源的報告,與 cpu 掛載在同一目錄。
  • cpuset 給 cgroup 中的任務分配獨立的 CPU(多處理器系統) 和內存節點。
  • devices 允許或禁止 cgroup 中的任務訪問設備。
  • freezer 暫停/恢復 cgroup 中的任務。
  • hugetlb 限制使用的內存頁數量。
  • memory 對 cgroup 中的任務的可用內存進行限制,並自動生成資源佔用報告。
  • net_cls 使用等級識別符(classid)標記網絡數據包,這讓 Linux 流量控制器(tc 指令)可以識別來自特定 cgroup 任務的數據包,並進行網絡限制。
  • net_prio 允許基於 cgroup 設置網絡流量(netowork traffic)的優先級。
  • perf_event 允許使用 perf 工具來監控 cgroup。
  • pids 限制任務的數量。

有了名稱空間的隔離技術,在加上對名稱空間的資源隔離,linux在3.6內核上已經將這兩個技術集成到了內核上,也就是linux已經支持這種所謂的隔離技術,距離我們的docker已經越來越近了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章