Linux作業系統之容器化
阿新 • • 發佈:2020-10-19
文章目錄
容器
- 容器實現封閉的環境主要要靠兩種技術,一種是看起來是隔離的技術,稱為namespace(名稱空間)。在每個 namespace 中的應用看到的,都是不同的 IP 地址、使用者空間、程序 ID 等。另一種是用起來是隔離的技術,稱為cgroup(網路資源限制),即明明整臺機器有很多的 CPU、記憶體,但是一個應用只能用其中的一部分。
多個容器執行在一臺機器上,不會相互影響嗎?如何限制 CPU 和記憶體的使用呢?
- Docker 可以限制對於 CPU 的使用,我們可以分幾種的方式。
- Docker 允許使用者為每個容器設定一個數字,代表容器的 CPU share,預設情況下每個容器的 share 是 1024。這個數值是相對的,本身並不能代表任何確定的意義。當主機上有多個容器執行時,每個容器佔用的 CPU 時間比例為它的 share 在總額中的比例。Docker 為容器設定 CPU share 的引數是
-c --cpu-shares
- Docker 提供了
--cpus
引數可以限定容器能使用的 CPU 核數。 - Docker 可以通過
--cpuset
引數讓容器只執行在某些核上
Namespace
為了隔離不同型別的資源,Linux 核心裡面實現了以下幾種不同型別的 namespace
- UTS,對應的巨集為 CLONE_NEWUTS,表示不同的 namespace 可以配置不同的 hostname。
- User,對應的巨集為 CLONE_NEWUSER,表示不同的 namespace 可以配置不同的使用者和組。
- Mount,對應的巨集為 CLONE_NEWNS,表示不同的 namespace 的檔案系統掛載點是隔離的
- PID,對應的巨集為 CLONE_NEWPID,表示不同的 namespace 有完全獨立的 pid,也即一個 namespace 的程序和另一個 namespace 的程序,pid 可以是一樣的,但是代表不同的程序。
- Network,對應的巨集為 CLONE_NEWNET,表示不同的 namespace 有獨立的網路協議棧
建立 namespace 的時候,我們在核心中會呼叫 copy_namespaces,呼叫順序依次是 copy_mnt_ns、copy_utsname、copy_ipcs、copy_pid_ns、copy_cgroup_ns 和 copy_net_ns,來複制 namespace。
CGroup
cgroups 定義了下面的一系列子系統,每個子系統用於控制某一類資源。
- cpu 子系統,主要限制程序的 cpu 使用率。
- cpuacct 子系統,可以統計 cgroups 中的程序的 cpu 使用報告。
- cpuset 子系統,可以為 cgroups 中的程序分配單獨的 cpu 節點或者記憶體節點。
- memory 子系統,可以限制程序的 memory 使用量。
- blkio 子系統,可以限制程序的塊裝置 io。
- devices 子系統,可以控制程序能夠訪問某些裝置。
- net_cls 子系統,可以標記 cgroups 中程序的網路資料包,然後可以使用 tc 模組(traffic control)對資料包進行控制。
- reezer 子系統,可以掛起或者恢復 cgroups 中的程序。
核心中 cgroup 的工作機制
- 第一步,系統初始化的時候,初始化 cgroup 的各個子系統的操作函式,分配各個子系統的資料結構。
- 第二步,mount cgroup 檔案系統,建立檔案系統的樹形結構,以及操作函式。
- 第三步,寫入 cgroup 檔案,設定 cpu 或者 memory 的相關引數,這個時候檔案系統的操作函式會呼叫到 cgroup 子系統的操作函式,從而將引數設定到 cgroup 子系統的資料結構中。
- 第四步,寫入 tasks 檔案,將程序交給某個 cgroup 進行管理,因為 tasks 檔案也是一個 cgroup 檔案,統一會呼叫檔案系統的操作函式進而呼叫 cgroup 子系統的操作函式,將 cgroup 子系統的資料結構和程序關聯起來。
- 第五步,對於 cpu 來講,會修改 scheduled entity,放入相應的佇列裡面去,從而下次排程的時候就起作用了。對於記憶體的 cgroup 設定,只有在申請記憶體的時候才起作用。
資料中心作業系統
資料中心作業系統的功能
你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步