容器監測工具&資源限制命令

一、容器監控工具

​ 監控對於基礎架構非常重要,而容器的動態特徵對監控有更高的要求。針對容器環境,有很多監控工具和方案,docker ps/top/stats 是docker原生的命令行監控工具,docker也提供了stats API,用戶可以通過HTTP請求獲取容器的狀態信息。sysdig、cAdvisor/Heapster和Weave Scope是第三方的開源容器監控方案。

docker container ls 命令比docker ps命令更準確。

docker container stats用於顯示每個容器各種資源的使用情況。

二、使用 docker 對容器資源進行限制

​ 在使用 docker 運行容器時,一臺主機上可能會運行幾百個容器,這些容器雖然互相隔離,但是底層卻使用着相同的 CPU、內存和磁盤資源。如果不對容器使用的資源進行限制,那麼容器之間會互相影響,小的來說會導致容器資源使用不公平;大的來說,可能會導致主機和集羣資源耗盡,服務完全不可用。

1.docker 限制 CPU Share

​ docker 允許用戶爲每個容器設置一個數字,代表容器的 CPU share,默認情況下每個容器的 share 是 1024。要注意,這個 share 是相對的,本身並不能代表任何確定的意義。當主機上有多個容器運行時,每個容器佔用的 CPU 時間比例爲它的 share 在總額中的比例。舉個例子,如果主機上有兩個一直使用 CPU 的容器(爲了簡化理解,不考慮主機上其他進程),其 CPU share 都是 1024,那麼兩個容器 CPU 使用率都是 50%;如果把其中一個容器的 share 設置爲 512,那麼兩者 CPU 的使用率分別爲 67% 和 33%;如果刪除 share 爲 1024 的容器,剩下來容器的 CPU 使用率將會是 100%。

​ docker 會根據主機上運行的容器和進程動態調整每個容器使用 CPU 的時間比例。這樣的好處是能保證 CPU 儘可能處於運行狀態,充分利用 CPU 資源,而且保證所有容器的相對公平;缺點是無法指定容器使用 CPU 的確定值。

​ docker 爲容器設置 CPU share 的參數是 -c --cpu-shares,它的值是一個整數。 -c --cpu-shares 參數只能限制容器使用 CPU 的比例,或者說優先級,無法確定地限制容器使用 CPU 的具體核數;從 1.13 版本之後,docker 提供了 --cpus 參數可以限定容器能使用的 CPU 核數。這個功能可以讓我們更精確地設置容器 CPU 使用量,是一種更容易理解也因此更常用的手段。

htop命令能查看CPU資源使用情況:

在這裏插入圖片描述

2.docker 限制內存資源

​ 默認情況下,docker 並沒有對容器內存進行限制,也就是說容器可以使用主機提供的所有內存。這當然是非常危險的事情,如果某個容器運行了惡意的內存消耗軟件,或者代碼有內存泄露,很可能會導致主機內存耗盡,因此導致服務不可用。對於這種情況,docker 會設置 docker daemon 的 OOM(out of memory) 值,使其在內存不足的時候被殺死的優先級降低。另外,就是你可以爲每個容器設置內存使用的上限,一旦超過這個上限,容器會被殺死,而不是耗盡主機的內存。

​ 限制內存上限雖然能保護主機,但是也可能會傷害到容器裏的服務。如果爲服務設置的內存上限太小,會導致服務還在正常工作的時候就被 OOM 殺死;如果設置的過大,會因爲調度器算法浪費內存。因此,合理的做法包括:

  • 爲應用做內存壓力測試,理解正常業務需求下使用的內存情況,然後才能進入生產環境使用
  • 一定要限制容器的內存使用上限
  • 儘量保證主機的資源充足,一旦通過監控發現資源不足,就進行擴容或者對容器進行遷移
  • 如果可以(內存資源充足的情況),儘量不要使用 swap,swap 的使用會導致內存計算複雜,對調度器非常不友好

在 docker 啓動參數中,和內存限制有關的包括(參數的值一般是內存大小,也就是一個正數,後面跟着內存單位

b、k、m、g,分別對應 bytes、KB、MB、和 GB):

  • -m --memory:容器能使用的最大內存大小,最小值爲 4m
  • --memory-swap:容器能夠使用的 swap 大小
  • --memory-swappiness:默認情況下,主機可以把容器使用的匿名頁(anonymous page)swap 出來,你可以設置一個 0-100 之間的值,代表允許 swap 出來的比例
  • --memory-reservation:設置一個內存使用的 soft limit,如果 docker 發現主機內存不足,會執行 OOM 操作。這個值必須小於 --memory 設置的值
  • --kernel-memory:容器能夠使用的 kernel memory 大小,最小值爲 4m。
  • --oom-kill-disable:是否運行 OOM 的時候殺死容器。只有設置了 -m,纔可以把這個選項設置爲 false,否則容器會耗盡主機內存,而且導致主機應用被殺死

關於 --memory-swap 必須在 --memory也配置的情況下纔能有用。

  • 如果 --memory-swap 的值大於 --memory,那麼容器能使用的總內存(內存 + swap)爲 --memory-swap 的值,能使用的 swap 值爲 --memory-swap 減去 --memory 的值
  • 如果 --memory-swap 爲 0,或者和 --memory 的值相同,那麼容器能使用兩倍於內存的 swap 大小,如果 --memory 對應的值是 200M,那麼容器可以使用 400M swap
  • 如果 --memory-swap 的值爲 -1,那麼不限制 swap 的使用,也就是說主機有多少 swap,容器都可以使用.

對於 docker 來說,它的內存限制也是存放在 cgroups 文件系統的。對於某個容器,可以在 sys/fs/cgroup/memory/docker/<container_id> 目錄下看到容器內存相關的文件。

3.IO 資源(磁盤)

對於磁盤來說,考量的參數是容量和讀寫速度,因此對容器的磁盤限制也應該從這兩個維度出發。目前 docker 支持對磁盤的讀寫速度進行限制,但是並沒有方法能限制容器能使用的磁盤容量(一旦磁盤 mount 到容器裏,容器就能夠使用磁盤的所有容量)。

  • --device-read-bps:磁盤每秒最多可以讀多少比特(bytes)
  • --device-write-bps:磁盤每秒最多可以寫多少比特(bytes)
  • --device-read-iops:磁盤每秒最多可以執行多少 IO 讀操作
  • --device-write-iops:磁盤每秒最多可以執行多少 IO 寫操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章