欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker 限制容器可用的CPU的方式

 更新時(shí)間:2018年02月24日 10:55:00   作者:sparkdev  
這篇文章主要介紹了Docker 限制容器可用的CPU的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

默認(rèn)情況下容器可以使用的主機(jī) CPU 資源是不受限制的。和內(nèi)存資源的使用一樣,如果不對(duì)容器可以使用的 CPU 資源進(jìn)行限制,一旦發(fā)生容器內(nèi)程序異常使用 CPU 的情況,很可能把整個(gè)主機(jī)的 CPU 資源耗盡,從而導(dǎo)致更大的災(zāi)難。本文將介紹如何限制容器可以使用的 CPU 資源。

本文的 demo 中會(huì)繼續(xù)使用《Docker: 限制容器可用的內(nèi)存》一文中創(chuàng)建的 docker 鏡像 u-stress 進(jìn)行壓力測(cè)試,文中就不再過多的解釋了。

限制可用的 CPU 個(gè)數(shù)

在 docker 1.13 及更高的版本上,能夠很容易的限制容器可以使用的主機(jī) CPU 個(gè)數(shù)。只需要通過 --cpus 選項(xiàng)指定容器可以使用的 CPU 個(gè)數(shù)就可以了,并且還可以指定如 1.5 之類的小數(shù)。接下來我們?cè)谝慌_(tái)有四個(gè) CPU 且負(fù)載很低的主機(jī)上進(jìn)行 demo 演示:

通過下面的命令創(chuàng)建容器,--cpus=2 表示容器最多可以使用主機(jī)上兩個(gè) CPU:

$ docker run -it --rm --cpus=2 u-stress:latest /bin/bash

然后由 stress 命令創(chuàng)建四個(gè)繁忙的進(jìn)程消耗 CPU 資源:

# stress -c 4

我們先來看看 docker stats 命令的輸出:

容器 CPU 的負(fù)載為 200%,它的含義為單個(gè) CPU 負(fù)載的兩倍。我們也可以把它理解為有兩顆 CPU 在 100% 的為它工作。
再讓我們通過 top 命令看看主機(jī) CPU 的真實(shí)負(fù)載情況:

哈哈,有點(diǎn)大跌眼鏡!實(shí)際的情況并不是兩個(gè) CPU 負(fù)載 100%,而另外兩個(gè)負(fù)載 0%。四個(gè) CPU 的負(fù)載都是 50%,加起來容器消耗的 CPU 總量就是兩個(gè) CPU 100% 的負(fù)載。

看來對(duì)于進(jìn)程來說是沒有 CPU 個(gè)數(shù)這一概念的,內(nèi)核只能通過進(jìn)程消耗的 CPU 時(shí)間片來統(tǒng)計(jì)出進(jìn)程占用 CPU 的百分比。這也是我們看到的各種工具中都使用百分比來說明 CPU 使用率的原因。

嚴(yán)謹(jǐn)起見,我們看看 docker 的官方文檔中是如何解釋 --cpus 選項(xiàng)的:

Specify how much of the available CPU resources a container can use.

果然,人家用的是 "how much",不可數(shù)的!并且 --cpus 選項(xiàng)支持設(shè)為小數(shù)也從側(cè)面說明了對(duì) CPU 的計(jì)量只能是百分比。
看來筆者在本文中寫的 "CPU 個(gè)數(shù)" 都是不準(zhǔn)確的。既然不準(zhǔn)確,為什么還要用?當(dāng)然是為了容易理解。況且筆者認(rèn)為在 --cpus 選項(xiàng)的上下文中理解為 "CPU 個(gè)數(shù)" 并沒有問題(有興趣的同學(xué)可以讀讀 --cpus 選項(xiàng)的由來,人家的初衷也是要表示 CPU 個(gè)數(shù)的)。

雖然 --cpus 選項(xiàng)用起來很爽,但它畢竟是 1.13 才開始支持的。對(duì)于更早的版本完成同樣的功能我們需要配合使用兩個(gè)選項(xiàng):--cpu-period 和 --cpu-quota(1.13 及之后的版本仍然支持這兩個(gè)選項(xiàng))。下面的命令實(shí)現(xiàn)相同的結(jié)果:

復(fù)制代碼 代碼如下:
$ docker run -it --rm --cpu-period=100000 --cpu-quota=200000 u-stress:latest /bin/bash

這樣的配置選項(xiàng)是不是讓人很傻眼呀!100000 是什么?200000 又是什么? 它們的單位是微秒,100000 表示 100 毫秒,200000 表示 200 毫秒。它們?cè)谶@里的含義是:在每 100 毫秒的時(shí)間里,運(yùn)行進(jìn)程使用的 CPU 時(shí)間最多為 200 毫秒(需要兩個(gè) CPU 各執(zhí)行 100 毫秒)。要想徹底搞明白這兩個(gè)選項(xiàng)的同學(xué)可以參考:CFS BandWith Control。我們要知道這兩個(gè)選項(xiàng)才是事實(shí)的真相,但是真相往往很殘忍!還好 --cpus 選項(xiàng)成功的解救了我們,其實(shí)它就是包裝了 --cpu-period 和 --cpu-quota。

指定固定的 CPU

通過 --cpus 選項(xiàng)我們無法讓容器始終在一個(gè)或某幾個(gè) CPU 上運(yùn)行,但是通過 --cpuset-cpus 選項(xiàng)卻可以做到!這是非常有意義的,因?yàn)楝F(xiàn)在的多核系統(tǒng)中每個(gè)核心都有自己的緩存,如果頻繁的調(diào)度進(jìn)程在不同的核心上執(zhí)行勢(shì)必會(huì)帶來緩存失效等開銷。下面我們就演示如何設(shè)置容器使用固定的 CPU,下面的命令為容器設(shè)置了 --cpuset-cpus 選項(xiàng),指定運(yùn)行容器的 CPU 編號(hào)為 1:

$ docker run -it --rm --cpuset-cpus="1" u-stress:latest /bin/bash

再啟動(dòng)壓力測(cè)試命令:

# stress -c 4

然后查看主機(jī) CPU 的負(fù)載情況:

這次只有 Cpu1 達(dá)到了 100%,其它的 CPU 并未被容器使用。我們還可以反復(fù)的執(zhí)行 stress -c 4 命令,但是始終都是 Cpu1 在干活。

再看看容器的 CPU 負(fù)載,也是只有 100%:

--cpuset-cpus 選項(xiàng)還可以一次指定多個(gè) CPU:

$ docker run -it --rm --cpuset-cpus="1,3" u-stress:latest /bin/bash

這次我們指定了 1,3 兩個(gè) CPU,運(yùn)行 stress -c 4 命令,然后檢查主機(jī)的 CPU 負(fù)載:

Cpu1 和 Cpu3 的負(fù)載都達(dá)到了 100%。

容器的 CPU 負(fù)載也達(dá)到了 200%:

--cpuset-cpus 選項(xiàng)的一個(gè)缺點(diǎn)是必須指定 CPU 在操作系統(tǒng)中的編號(hào),這對(duì)于動(dòng)態(tài)調(diào)度的環(huán)境(無法預(yù)測(cè)容器會(huì)在哪些主機(jī)上運(yùn)行,只能通過程序動(dòng)態(tài)的檢測(cè)系統(tǒng)中的 CPU 編號(hào),并生成 docker run 命令)會(huì)帶來一些不便。

設(shè)置使用 CPU 的權(quán)重

當(dāng) CPU 資源充足時(shí),設(shè)置 CPU 的權(quán)重是沒有意義的。只有在容器爭(zhēng)用 CPU 資源的情況下, CPU 的權(quán)重才能讓不同的容器分到不同的 CPU 用量。--cpu-shares 選項(xiàng)用來設(shè)置 CPU 權(quán)重,它的默認(rèn)值為 1024。我們可以把它設(shè)置為 2 表示很低的權(quán)重,但是設(shè)置為 0 表示使用默認(rèn)值 1024。
下面我們分別運(yùn)行兩個(gè)容器,指定它們都使用 Cpu0,并分別設(shè)置 --cpu-shares 為 512 和 1024:

$ docker run -it --rm --cpuset-cpus="0" --cpu-shares=512 u-stress:latest /bin/bash
$ docker run -it --rm --cpuset-cpus="0" --cpu-shares=1024 u-stress:latest /bin/bash

在兩個(gè)容器中都運(yùn)行 stress -c 4 命令。

此時(shí)主機(jī) Cpu0 的負(fù)載為 100%:

容器中 CPU 的負(fù)載為:

兩個(gè)容器分享一個(gè) CPU,所以總量應(yīng)該是 100%。具體每個(gè)容器分得的負(fù)載則取決于 --cpu-shares 選項(xiàng)的設(shè)置!我們的設(shè)置分別是 512 和 1024,則它們分得的比例為 1:2。在本例中如果想讓兩個(gè)容器各占 50%,只要把 --cpu-shares 選項(xiàng)設(shè)為相同的值就可以了。

總結(jié)

相比限制容器用的內(nèi)存,限制 CPU 的選項(xiàng)要簡(jiǎn)潔很多。但是簡(jiǎn)潔絕對(duì)不是簡(jiǎn)單,大多數(shù)把復(fù)雜東西整簡(jiǎn)單的過程都會(huì)丟失細(xì)節(jié)或是模糊一些概念,比如從 --cpu-period 和 --cpu-quota 選項(xiàng)到 --cpus 選項(xiàng)的進(jìn)化。對(duì)于使用者來說這當(dāng)然是好事,可以減緩我們的學(xué)習(xí)曲線,快速入手。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決docker報(bào)錯(cuò):docker:invalid?reference?format.

    解決docker報(bào)錯(cuò):docker:invalid?reference?format.

    在導(dǎo)入鏡像的時(shí)候出現(xiàn)問題:invalid reference format,這里總結(jié)下,這篇文章主要給大家介紹了關(guān)于解決docker報(bào)錯(cuò):docker:invalid?reference?format的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • docker build鏡像時(shí),無法訪問網(wǎng)絡(luò)問題

    docker build鏡像時(shí),無法訪問網(wǎng)絡(luò)問題

    這篇文章主要介紹了docker build鏡像時(shí),無法訪問網(wǎng)絡(luò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) 實(shí)例代碼

    docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) 實(shí)例代碼

    這篇文章主要介紹了docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) ,需要的朋友可以參考下
    2019-05-05
  • Docker學(xué)習(xí)筆記之k8s部署方法

    Docker學(xué)習(xí)筆記之k8s部署方法

    這篇文章主要介紹了Docker學(xué)習(xí)筆記之k8s部署方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 手把手教你實(shí)現(xiàn)給Docker開啟IPv6網(wǎng)絡(luò)支持

    手把手教你實(shí)現(xiàn)給Docker開啟IPv6網(wǎng)絡(luò)支持

    這篇文章主要為大家介紹了Docker開啟IPv6網(wǎng)絡(luò)支持實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Docker自定義網(wǎng)絡(luò)詳解

    Docker自定義網(wǎng)絡(luò)詳解

    本文主要跟大家講解了Docker中的自定義網(wǎng)絡(luò)的相關(guān)知識(shí),包含網(wǎng)關(guān)、子網(wǎng)地址等等,非常的詳實(shí),有需要的小伙伴可以參考下
    2022-11-11
  • Docker部署Mysql數(shù)據(jù)庫步驟詳解

    Docker部署Mysql數(shù)據(jù)庫步驟詳解

    Docker是一種流行的容器化平臺(tái),可以簡(jiǎn)化應(yīng)用程序的部署和管理,在本博客中,我們將探討如何使用Docker部署兩個(gè)廣泛使用的數(shù)據(jù)庫:MySQL,我們將提供詳細(xì)的步驟和相應(yīng)的命令,以幫助您輕松地在Docker容器中設(shè)置和運(yùn)行這個(gè)數(shù)據(jù)庫
    2023-07-07
  • Docker如何打包本地環(huán)境為tar包給別人使用

    Docker如何打包本地環(huán)境為tar包給別人使用

    這篇文章主要介紹了Docker如何打包本地環(huán)境為tar包給別人使用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Windows10?Docker?Desktop安裝過程

    Windows10?Docker?Desktop安裝過程

    Docker?Desktop是Docker公司推出的一款桌面應(yīng)用程序,它提供了一個(gè)用戶友好的界面,方便開發(fā)人員在本地環(huán)境中使用容器技術(shù),這篇文章主要介紹了Windows10?Docker?Desktop安裝過程,需要的朋友可以參考下
    2024-01-01
  • Docker MySQL無法被宿主機(jī)訪問的問題解決

    Docker MySQL無法被宿主機(jī)訪問的問題解決

    本文主要介紹了Docker MySQL無法被宿主機(jī)訪問的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論