當前位置: 妍妍網 > 碼農

docker 是怎麽實作 cpu 隔離的?

2024-05-30碼農


連結:https://juejin.cn/post/7323044972667830326

docker是怎麽實作cpu隔離的?

Docker 使用 cgroups(控制組)來實作 CPU 隔離。cgroups 是 Linux 內核的一個功能,用於限制、統計和隔離一個 行程組 的系統資源。對於 CPU 隔離,cgroups 提供了 CPU 子系統,Docker 利用這個子系統來限制容器的 CPU 使用。

具體來說,Docker 使用以下步驟來實作 CPU 隔離:

  1. Cgroups 資源分配: 在啟動容器時,Docker 使用 cgroups 來為容器分配 CPU 資源。這涉及將容器的行程組添加到 cgroups 中,以便內核可以對其進行資源管理。

  2. 設定 CPU 限制: Docker 允許使用者透過參數(如 --cpus )指定容器可以使用的 CPU 核心數量。這透過 cgroups 的 CPU 子系統來實作,限制容器行程組對 CPU 的存取。

  3. CPU 排程: Docker 利用 cgroups 中的 CPU 排程機制,確保容器只能在其分配的 CPU 範圍內執行。這有助於防止容器占用主機上的所有 CPU 資源。

透過這些步驟,Docker 利用 Linux 內核的 cgroups 功能,實作了對容器的 CPU 隔離,使得容器能夠在受限的資源環境中執行。

被分配給docker的cpu,其他行程還能使用這些cpu嗎?

Docker 使用 cgroups 來進行 CPU 隔離,而 cgroups 允許將系統中的 CPU 資源劃分為不同的組。當你為 Docker 容器分配 CPU 時,Docker 將建立一個 cgroup,並將容器的行程組添加到該 cgroup 中。這意味著該 cgroup 內的行程,即 Docker 容器內的行程,受到 CPU 限制。

其他未被 Docker 分配的行程,仍然在預設的 cgroup 中,可以使用系統中的所有 CPU 資源。因此,Docker 分配給容器的 CPU 並不會影響系統上執行的其他行程,它們仍然可以使用未被 Docker 占用的 CPU 資源。

總的來說,Docker 的 CPU 分配是一種限制容器內行程對 CPU 資源的存取,而不會影響系統上其他行程對未被分配的 CPU 資源的使用。

不同的docker,只能專用自己的cpu,是嗎?

是的,每個 Docker 容器都可以被配置為專用自己的 CPU 資源,這是透過 Docker 的 CPU 隔離功能實作的。當你為 Docker 容器分配 CPU 時,你可以使用 --cpus 參數來指定容器可以使用的 CPU 核心數量。這樣,容器內的行程將受到這一限制,只能在指定數量的 CPU 核心上執行。

例如,你可以執行以下命令來啟動一個名為 "my_container" 的 Docker 容器,並限制它只能使用 2 個 CPU 核心:

docker run --cpus=2 --name my_container my_image


這就意味著 "my_container" 中的行程只能在兩個 CPU 核心上執行,而不會占用系統上的所有可用 CPU 資源。其他未被分配的 CPU 資源仍然可供系統上的其他行程使用。

被分配的2個cpu,是固定被該docker容器使用,還是說上限是只能使用2個cpu,但是這2個cpu不是固定綁死的?

當你使用 --cpus 參數為 Docker 容器分配 CPU 核心時,這是設定容器的 CPU 上限,而不是具體固定的 CPU。具體來說:

  1. 上限限制: 使用 --cpus 參數,你指定了容器可以使用的最大 CPU 核心數量。在你的例子中, --cpus=2 表示容器的上限是 2 個 CPU 核心。

  2. 動態排程: 這兩個 CPU 核心並不是固定繫結給容器的,而是可以在這個範圍內進行動態排程。容器的行程可以在這兩個核心之間進行切換,但總體而言,它們不會超過指定的上限。

這種動態排程的方式使得容器可以根據系統負載和資源可用性動態分配和釋放 CPU 資源,以更好地適應變化的工作負載。總之, --cpus 參數提供了一個上限限制,容器內的行程可以在這個範圍內靈活排程。

問題:我的意思是,假設現在有8個cpu,分別是cpu1到cpu8,然後分配2個cpu給某個docker行程,這2個cpu是固定的某2個cpu,還是說數量上限是2個cpu,但是具體是哪2個cpu,這個是動態變化的,是這樣嗎?

我明白了你的意思。當你使用 --cpus 參數為 Docker 容器分配 CPU 核心時,這是設定容器的 CPU 上限,而不是指定具體的 CPU 核心。具體來說:

  1. 上限限制: 使用 --cpus 參數,你指定了容器可以使用的最大 CPU 核心數量。在你的例子中, --cpus=2 表示容器的上限是 2 個 CPU 核心。

  2. 動態分配: 具體使用哪兩個 CPU 核心是動態變化的。Docker 和 Linux 的 cgroups 機制會在可用的 CPU 核心中動態排程容器內的行程。這意味著容器內的行程可以在指定的上限內,根據系統負載和資源可用性在可用的 CPU 核心之間動態分配。

所以,雖然你設定了容器的 CPU 上限為 2 個核心,但具體是哪兩個核心是由 Docker 和 Linux 內核根據系統條件動態確定的。這種動態分配的方式可以更好地適應系統的變化和負載情況。

總結

cpu隔離指的是,數量有限制。

一個docker行程,只能使用指定上限的cpu數量。

但是一個cpu,不是和某一個docker行程繫結死的。

也就是說,具體使用了哪幾個cpu,這個不是固定的。但是能使用的cpu數量上限,是固定的。

為什麽要有上限?就是不能讓某個docker行程,把所有cpu資源都給全部霸占了。

這也是cpu隔離的意義所在。