精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何限制容器可以使用的CPU資源

馬哥Linux運維 ? 來源:博客園sparkdev ? 2024-10-24 17:04 ? 次閱讀

默認情況下容器可以使用的主機 CPU 資源是不受限制的。和內存資源的使用一樣,如果不對容器可以使用的 CPU 資源進行限制,一旦發生容器內程序異常使用 CPU 的情況,很可能把整個主機的 CPU 資源耗盡,從而導致更大的災難。本文將介紹如何限制容器可以使用的 CPU 資源。
本文的 demo 中會繼續使用《Docker: 限制容器可用的內存》一文中創建的 docker 鏡像 u-stress 進行壓力測試,文中就不再過多的解釋了。

限制可用的 CPU 個數

在 docker 1.13 及更高的版本上,能夠很容易的限制容器可以使用的主機 CPU 個數。只需要通過 --cpus 選項指定容器可以使用的 CPU 個數就可以了,并且還可以指定如 1.5 之類的小數。接下來我們在一臺有四個 CPU 且負載很低的主機上進行 demo 演示:

61fef396-90f7-11ef-a511-92fbcf53809c.png

通過下面的命令創建容器,--cpus=2 表示容器最多可以使用主機上兩個 CPU:

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

然后由 stress 命令創建四個繁忙的進程消耗 CPU 資源:

# stress -c 4

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

621bfb30-90f7-11ef-a511-92fbcf53809c.png

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

6238e4a2-90f7-11ef-a511-92fbcf53809c.png

哈哈,有點大跌眼鏡!實際的情況并不是兩個 CPU 負載 100%,而另外兩個負載 0%。四個 CPU 的負載都是 50%,加起來容器消耗的 CPU 總量就是兩個 CPU 100% 的負載。

看來對于進程來說是沒有 CPU 個數這一概念的,內核只能通過進程消耗的 CPU 時間片來統計出進程占用 CPU 的百分比。這也是我們看到的各種工具中都使用百分比來說明 CPU 使用率的原因。
嚴謹起見,我們看看 docker 的官方文檔中是如何解釋 --cpus 選項的:
Specify how much of the available CPU resources a container can use.
果然,人家用的是 "how much",不可數的!并且 --cpus 選項支持設為小數也從側面說明了對 CPU 的計量只能是百分比。
看來筆者在本文中寫的 "CPU 個數" 都是不準確的。既然不準確,為什么還要用?當然是為了容易理解。況且筆者認為在 --cpus 選項的上下文中理解為 "CPU 個數" 并沒有問題(有興趣的同學可以讀讀--cpus 選項的由來,人家的初衷也是要表示 CPU 個數的)。

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

$ docker run -it --rm --cpu-period=100000 --cpu-quota=200000 u-stress:latest /bin/bash

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

指定固定的 CPU

通過 --cpus 選項我們無法讓容器始終在一個或某幾個 CPU 上運行,但是通過 --cpuset-cpus 選項卻可以做到!這是非常有意義的,因為現在的多核系統中每個核心都有自己的緩存,如果頻繁的調度進程在不同的核心上執行勢必會帶來緩存失效等開銷。下面我們就演示如何設置容器使用固定的 CPU,下面的命令為容器設置了 --cpuset-cpus 選項,指定運行容器的 CPU 編號為 1:

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

再啟動壓力測試命令:

# stress -c 4

然后查看主機 CPU 的負載情況:

6255441c-90f7-11ef-a511-92fbcf53809c.png

這次只有 Cpu1 達到了 100%,其它的 CPU 并未被容器使用。我們還可以反復的執行 stress -c 4 命令,但是始終都是 Cpu1 在干活。
再看看容器的 CPU 負載,也是只有 100%:

626f2d3c-90f7-11ef-a511-92fbcf53809c.png

--cpuset-cpus 選項還可以一次指定多個 CPU:

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

這次我們指定了 1,3 兩個 CPU,運行 stress -c 4 命令,然后檢查主機的 CPU 負載:

628290de-90f7-11ef-a511-92fbcf53809c.png

Cpu1 和 Cpu3 的負載都達到了 100%。
容器的 CPU 負載也達到了 200%:

629e6cb4-90f7-11ef-a511-92fbcf53809c.png

--cpuset-cpus 選項的一個缺點是必須指定 CPU 在操作系統中的編號,這對于動態調度的環境(無法預測容器會在哪些主機上運行,只能通過程序動態的檢測系統中的 CPU 編號,并生成 docker run 命令)會帶來一些不便。

設置使用 CPU 的權重

當 CPU 資源充足時,設置 CPU 的權重是沒有意義的。只有在容器爭用 CPU 資源的情況下, CPU 的權重才能讓不同的容器分到不同的 CPU 用量。--cpu-shares 選項用來設置 CPU 權重,它的默認值為 1024。我們可以把它設置為 2 表示很低的權重,但是設置為 0 表示使用默認值 1024。
下面我們分別運行兩個容器,指定它們都使用 Cpu0,并分別設置 --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

在兩個容器中都運行 stress -c 4 命令。

此時主機 Cpu0 的負載為 100%:

62b968fc-90f7-11ef-a511-92fbcf53809c.png

容器中 CPU 的負載為:

62d2ef5c-90f7-11ef-a511-92fbcf53809c.png

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

總結

相比限制容器用的內存,限制 CPU 的選項要簡潔很多。但是簡潔絕對不是簡單,大多數把復雜東西整簡單的過程都會丟失細節或是模糊一些概念,比如從 --cpu-period 和 --cpu-quota 選項到 --cpus 選項的進化。對于使用者來說這當然是好事,可以減緩我們的學習曲線,快速入手。

鏈接:https://www.cnblogs.com/sparkdev/p/8052522.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10826

    瀏覽量

    211160
  • 內存
    +關注

    關注

    8

    文章

    3002

    瀏覽量

    73887
  • 程序
    +關注

    關注

    116

    文章

    3777

    瀏覽量

    80853
  • 容器
    +關注

    關注

    0

    文章

    494

    瀏覽量

    22045
  • Docker
    +關注

    關注

    0

    文章

    454

    瀏覽量

    11815

原文標題:Docker: 限制容器可用的 CPU

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Kubernetes之路 1 - Java應用資源限制的迷思

    奇妙地被OOM Killer干掉。這背后一個非常常見的原因是:沒有正確設置容器資源限制以及對應的JVM的堆空間大小。我們拿一個tomcat應用為例,其實例代碼和Kubernetes部署文件
    發表于 03-29 13:06

    Kubernetes之路 2 - 利用LXCFS提升容器資源可見性

    通過 lxcfs 提供容器資源可見性的方法,可以幫助一些遺留系統更好的識別容器運行時的資源限制
    發表于 04-17 14:05

    阿里云容器Kubernetes監控(一) - 資源監控

    %的工作處理的是容器前和容器后的問題,容器前指的是如何本地開發、集成、測試并部署到容器環境;而容器后指的是如何對部署到
    發表于 04-23 14:35

    阿里云容器Kubernetes監控(一) - 資源監控

    %的工作處理的是容器前和容器后的問題,容器前指的是如何本地開發、集成、測試并部署到容器環境;而容器后指的是如何對部署到
    發表于 04-23 14:35

    阿里云容器Kubernetes監控(一) - 資源監控

    %的工作處理的是容器前和容器后的問題,容器前指的是如何本地開發、集成、測試并部署到容器環境;而容器后指的是如何對部署到
    發表于 04-23 14:35

    是否可以使用內部FPGA的資源連接到總線

    你好!我正在設計一個MIL-STD控制器。該標準意味著使用直接或變壓器耦合連接到總線。我是否可以使用內部FPGA的資源來完成此連接方法,ori是否必須使用其他外部設備?先謝謝你!以上來自于谷歌翻譯
    發表于 09-30 11:19

    超大規模商用 K8s 場景下,阿里巴巴如何動態解決容器資源的按需分配問題?

    肯定有些地方出問題了。于是我們就要剖析,問題究竟出在哪里。針對于內存的 OOM,CPU 資源被 throttle,我們可以推斷我們給與容器分配的初始
    發表于 10-15 14:47

    請問使用USB功能時VBUS可以使用多少電容器

    當使用USB功能時,VBUS可以使用多少電容器
    發表于 12-09 07:23

    在STM32G474的SBSFU示例中可以使用SPI還是有任何限制

    您好,我想問一下,在用戶應用程序中 STM32G474 的 SBSFU 示例中,固件更新是使用 ymodem 協議完成的,即 UART 我們可以使用 SPI 協議而不是這個嗎?這可以使用 SPI 還是有任何限制?????請建議
    發表于 12-08 08:36

    多少電容器通風裝置可以使用USB功能?

    uF。 用戶需要設計自己的電路并調整 VBUS 電容器。用USB-IF 提供的 USB 分析工具 USBET20 , 用戶可以查看VBUS 電容器是否符合 USB-IF 規格 。
    發表于 08-28 08:08

    CPU提供了哪些資源,如何評估CPU資源的消耗

    上面的圖和文字摘自ETSI GS NFV-TST 008,呈現的是一個物理CPU注1能夠被測量的幾個資源維度和他們之間的對應關系。
    的頭像 發表于 01-22 09:09 ?9955次閱讀
    <b class='flag-5'>CPU</b>提供了哪些<b class='flag-5'>資源</b>,如何評估<b class='flag-5'>CPU</b><b class='flag-5'>資源</b>的消耗

    IoT 可以使用 WPT

    IoT 可以使用 WPT
    發表于 03-19 12:08 ?0次下載
    IoT <b class='flag-5'>可以使</b>用 WPT

    逆變器使用28377S時CLA與CPU資源分配

    CLA使用后會大大提高計算能力,特別在在倍頻采樣中。逆變器設計時,CLA中主要處理采樣數據和SVPWM計算,CPU主要處理環路控制。可以使用軟件觸發CLA方式,使CPU中斷和CLA中斷同步,同時
    發表于 11-08 14:06 ?8次下載
    逆變器使用28377S時CLA與<b class='flag-5'>CPU</b><b class='flag-5'>資源</b>分配

    Linux內核是如何限制進程對CPU資源使用的?

    在使用 Kubernetes(簡稱K8s) 時,通常會在同一臺機器上部署多個 Pod。如果某個 Pod 中的服務出現問題(如出現死循環),將會導致占用大量的 CPU 時間,從而影響到其他 Pod 的正常運行。
    發表于 05-08 18:14 ?1226次閱讀
    Linux內核是如何<b class='flag-5'>限制</b>進程對<b class='flag-5'>CPU</b><b class='flag-5'>資源</b>使用的?

    Linux是如何對容器下的進程進行CPU限制的,底層是如何工作的?

    現在很多公司的服務都是跑在容器下,我來問幾個容器 CPU 相關的問題,看大家對天天在用的技術是否熟悉。
    的頭像 發表于 11-29 14:31 ?1342次閱讀
    Linux是如何對<b class='flag-5'>容器</b>下的進程進行<b class='flag-5'>CPU</b><b class='flag-5'>限制</b>的,底層是如何工作的?