閒聊docker所依賴的linux內核技術--namespaces+cgroup

概述

docker本質就是宿主機的一個進程,docker是通過namespace實現資源隔離,通過cgroup實現資源限制,通過寫時複製技術(copy-on-write)實現了高效的文件操作(類似虛擬機的磁盤比如分配500g並不是實際佔用物理磁盤500g)

閒聊docker所依賴的linux內核技術--namespaces+cgroup


1、namespaces 名稱空間

很多編程語言都包含了命名空間的概念,我們可以認為命名空間是一種封裝,封裝本身實際上實現了代碼的隔離,

在操作系統中命名空間命名空間提供的是系統資源的隔離,其中系統資源包括了:進程、網絡、文件系統......

實際上linux系統實現命名空間主要目的之一就是為了實現輕量級虛擬化服務,也就是我們說的容器,在同一個命名空間下的進程可以感知彼此的變化,而對其他命名空間的進程一無所知,這樣就可以讓容器中的進程產生一個錯覺,彷彿他自己置身於一個獨立的系統環境當中,以此達到獨立和隔離的目的。

閒聊docker所依賴的linux內核技術--namespaces+cgroup

這些隔離是怎麼管理起來的呢?這裡就需要用到Control groups控制組。


2、control Group 控制組

一種linux內核提供的一種可以限制、記錄、隔離進程組所使用的理資源的機制。為容器而生,沒有cgroups就沒有今天的容器技術。

閒聊docker所依賴的linux內核技術--namespaces+cgroup

2.1、cgroup的特點是:

cgroup的api以一個偽文件系統的實現方式,用戶的程序可以通過文件系統實現cgroup的組件管理。

cgroup的組件管理操作單元可以細粒度到線程級別,另外用戶可以創建和銷燬cgroup,從而實現資源載分配和再利用

所有資源管理的功能都以子系統的方式實現,接口統一子任務創建之初與其父任務處於同一個cgroup的控制組

2.2、cgroups子系統

  1. cpu 子系統,主要限制進程的 cpu 使用率。
  2. cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。
  3. cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者內存節點。
  4. memory 子系統,可以限制進程的 memory 使用量。
  5. blkio 子系統,可以限制進程的塊設備 io。
  6. devices 子系統,可以控制進程能夠訪問某些設備。
  7. net_cls 子系統,可以標記 cgroups 中進程的網絡數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制。
  8. net_prio — 這個子系統用來設計網絡流量的優先級
  9. freezer 子系統,可以掛起或者恢復 cgroups 中的進程。
  10. ns 子系統,可以使不同 cgroups 下面的進程使用不同的 namespace
  11. hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。

2.3、四大功能:

  • 資源限制:可以對任務使用的資源總額進行限制
  • 優先級分配:通過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上相當於控制了任務運行優先級
  • 資源統計:可以統計系統的資源使用量,如cpu時長,內存用量等
  • 任務控制:cgroup可以對任務執行掛起、恢復等操作

覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

閒聊docker所依賴的linux內核技術--namespaces+cgroup

"


分享到:


相關文章: