Docker原理之CGroups

  • 控制組(cgroups)是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計 等。
  • 只有能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭。
  • 控制組技術最早是由 Google 的程序員 2006 年起提出,Linux 內核自 2.6.24 開始支持。
  • 控制組可以提供對容器的內存、CPU、磁盤 IO 等資源的限制和審計管理。

我們通過 Linux 的命名空間為新創建的進程隔離了文件系統、網絡并與宿主機器之間的進程相互隔離,但是命名空間并不能夠為我們提供物理資源上的隔離,比如 CPU 或者內存,如果在同一臺機器上運行了多個對彼此以及宿主機器一無所知的『容器』,這些容器卻共同占用了宿主機器的物理資源。

12.png

如果其中的某一個容器正在執行 CPU 密集型的任務,那么就會影響其他容器中任務的性能與執行效率,導致多個容器相互影響并且搶占資源。如何對多個容器的資源使用進行限制就成了解決進程虛擬資源隔離之后的主要問題,而 Control Groups(簡稱 CGroups)就是能夠隔離宿主機器上的物理資源,例如 CPU、內存、磁盤 I/O 和網絡帶寬。

每一個 CGroup 都是一組被相同的標準和參數限制的進程,不同的 CGroup 之間是有層級關系的,也就是說它們之間可以從父類繼承一些用于限制資源使用的標準和參數。

13.png

Linux 的 CGroup 能夠為一組進程分配資源,也就是我們在上面提到的 CPU、內存、網絡帶寬等資源,通過對資源的分配,CGroup 能夠提供以下的幾種功能:

14.png

在 CGroup 中,所有的任務就是一個系統的一個進程,而 CGroup 就是一組按照某種標準劃分的進程,在 CGroup 這種機制中,所有的資源控制都是以 CGroup 作為單位實現的,每一個進程都可以隨時加入一個 CGroup 也可以隨時退出一個 CGroup。

Linux 使用文件系統來實現 CGroup,我們可以直接使用下面的命令查看當前的 CGroup 中有哪些子系統:

$ lssubsys -m
cpuset /sys/fs/cgroup/cpuset
cpu /sys/fs/cgroup/cpu
cpuacct /sys/fs/cgroup/cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb

大多數 Linux 的發行版都有著非常相似的子系統,而之所以將上面的 cpuset、cpu 等東西稱作子系統,是因為它們能夠為對應的控制組分配資源并限制資源的使用。

如果我們想要創建一個新的 cgroup 只需要在想要分配或者限制資源的子系統下面創建一個新的文件夾,然后這個文件夾下就會自動出現很多的內容,如果你在 Linux 上安裝了 Docker,你就會發現所有子系統的目錄下都有一個名為 Docker 的文件夾:

$ ls cpu
cgroup.clone_children  
...
cpu.stat  
docker  
notify_on_release 
release_agent 
tasks$ ls cpu/docker/
9c3057f1291b53fd54a3d12023d2644efe6a7db6ddf330436ae73ac92d401cf1 
cgroup.clone_children  
...
cpu.stat  
notify_on_release 
release_agent 
tasks

9c3057xxx 其實就是我們運行的一個 Docker 容器,啟動這個容器時,Docker 會為這個容器創建一個與容器標識符相同的 CGroup,在當前的主機上 CGroup 就會有以下的層級關系:

15.png

每一個 CGroup 下面都有一個 tasks 文件,其中存儲著屬于當前控制組的所有進程的 pid,作為負責 cpu 的子系統,cpu.cfs_quota_us 文件中的內容能夠對 CPU 的使用作出限制,如果當前文件的內容為 50000,那么當前控制組中的全部進程的 CPU 占用率不能超過 50%。

如果系統管理員想要控制 Docker 某個容器的資源使用率就可以在 docker 這個父控制組下面找到對應的子控制組并且改變它們對應文件的內容,當然我們也可以直接在程序運行時就使用參數,讓 Docker 進程去改變相應文件中的內容。

$ docker run -it -d --cpu-quota=50000 busybox
53861305258ecdd7f5d2a3240af694aec9adb91cd4c7e210b757f71153cdd274
$ cd 53861305258ecdd7f5d2a3240af694aec9adb91cd4c7e210b757f71153cdd274/
$ ls
cgroup.clone_children  cgroup.event_control  cgroup.procs  cpu.cfs_period_us  cpu.cfs_quota_us  cpu.shares  cpu.stat  notify_on_release  tasks
$ cat cpu.cfs_quota_us
50000

當我們使用 Docker 關閉掉正在運行的容器時,Docker 的子控制組對應的文件夾也會被 Docker 進程移除,Docker 在使用 CGroup 時其實也只是做了一些創建文件夾改變文件內容的文件操作,不過 CGroup 的使用也確實解決了我們限制子容器資源占用的問題,系統管理員能夠為多個容器合理的分配資源并且不會出現多個容器互相搶占資源的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535718.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql中的轉義字符

字符串是多個字符組成的一個字符序列,由單引號( “”) 或雙引號 ( “"”) 字符包圍。(但在 ANSI 模式中運行時只能用單引號)。 例如: a string"another string"在一個字符串中,如果某個序列具有特殊的含義,每個序…

Docker原理之UnionFS

一、UnionFS Linux 的命名空間和控制組分別解決了不同資源隔離的問題,前者解決了進程、網絡以及文件系統的隔離,后者實現了 CPU、內存等資源的隔離,但是在 Docker 中還有另一個非常重要的問題需要解決 - 也就是鏡像。 鏡像到底是什么&#…

教你精確編寫高質量高性能的MySQL語法

在應用系統開發初期,由于開發數據庫數據比較少,對于查詢SQL語句,復雜視圖的編寫,剛開始不會體會出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用后,隨著數據庫中數據的增加,系統的…

Docker使用-Hello World

1、docker pull hello-world 拉去docker遠程倉庫中的Hello World的鏡像 [rootCarlota2 ~]# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e09…

Mysql數據庫引擎快速指南

如果你是個賽車手并且按一下按鈕就能夠立即更換引擎而不需要把車開到車庫里去換,那會是怎么感覺呢? MySQL 數據庫為開發人員所做的就好像是按按鈕換引擎;它讓你選擇數據庫引擎,并給你一條簡單的途徑來切換它。 MySQL的自帶引擎肯…

Docker使用-構建MySQL

拉取官方鏡像(我們這里選擇5.7,如果不寫后面的版本號則會自動拉取最新版) docker pull mysql:5.7 # 拉取 mysql 5.7 docker pull mysql # 拉取最新版mysql鏡像MySQL文檔地址 檢查是否拉取成功 $ sudo docker images一般來說數據庫容…

Java集合:什么是Java集合?

一、集合的由來 通常,我們的Java程序需要根據程序運行時才知道創建了多少個對象。但若非程序運行,程序開發階段,我們根本不知道到底需要多少個數量的對象,甚至不知道它的準確類型。為了滿足這些常規的編程需要,我們要…

Mysql截取中英數混合的字符串

在 mysql中截取字符串我們用 LEFT函數 LEFT(str,len) 返回從字符串str 開始的len 最左字符。 mysql> SELECT LEFT(foobarbar, 5); -> fooba 手冊上只介紹了截取英文字符串的方法,中文或者中英文的怎么辦呢?以下是截取中英混合的字符串(中國人…

Java集合:Collection接口

Collection是一個接口,繼承自Iterable。我們先看一下Iterable接口的源碼 一、Iterable package java.lang;import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Cons…

Java集合:List集合

List集合 List集合類中元素有序、且可重復,集合中的每個元素都有其對應的順序索引。 List容器中的元素都對應一個整數型的序號記載其在容器中的位置,可以根據序號存取容器中的元素。 JDK API中List接口的實現類常用的有:ArrayList、LinkList和…

MySQL為什么要set names

大家都知道SET NAMES x相當于SET character_set_client x;SET character_set_results x;SET character_set_connection x; 以下從MySQL5.0官方文檔上摘錄了相關內容,并翻譯,說明了相關系統變量的用處: What character set is the statem…

MySql日期處理系列-常用的日期推算處理

以下都是我平時用的一些日期推算處理方法,方法并不一定是最有效率的.全部均通過測試!轉載請注明來自[phpchina.com] #title: 常用的日期推算處理#auther: 小強(占卜師) #date: 2007-12-25 #取得當前日期set dtCURDATE();select dt; #當前日期這個月的第一天selec…

Java集合:Set集合

一、Set接口的特點 一個不包含重復元素的collection。更確切地講,Set不包含滿足e1.equals(e2)的元素對 e1和e2,并且最多包含一個null元素。 Set集合由Set接口和Set接口的實現類組成,Set接口繼承了Collection接口,因此包含了Coll…

談談我對MYSQL亂碼的解決辦法

經常更換虛擬主機,而各個服務商的MYSQL版本不同,當導入數據后,總會出現亂碼等無法正常顯示的問題,查了好多資料,總結出自己的一點技巧: WINDOWS 下導入應該這樣使用MYSQL的命令在DOS命令下進入mysql的bin目錄下,輸入mysql -uroot -p密碼 數據庫名稱<要恢復的數據庫, 例如我們…

Java集合:Map集合

一、簡述 public interface Map<K,V>將鍵映射到值的對象。一個映射不能包含重復的鍵&#xff1b;每個鍵最多只能映射到一個值。 注意&#xff1a;Map中的集合不能包含重復的鍵&#xff0c;值可以重復。每個鍵只能對應一個值。 Map集合是鍵值對形式存儲值的&#xff0c…

用離線編輯器Zoundry寫zblog日志

Zoundry是免費的離線網志發布工具&#xff0c;由于家里的網絡很差&#xff0c;寫了一半的日志經常因為掉線而丟失&#xff0c;這樣一款軟件的確是很必要的。今天下載試用了一下&#xff0c;感覺的確不錯。使用起來也很簡單&#xff1a; 1.下載并安裝zoundry軟件&#xff1a;現…

MySQL:基本命令

一、數據庫操作 1、查詢數據庫&#xff0c;命令如下: SHOW DATABASES;2、我們可以在登陸 MySQL 服務后&#xff0c;使用 create 命令創建數據庫&#xff0c;命令格式: CREATE DATABASE 數據庫名;3、使用 drop 命令刪除數據庫&#xff0c;命令格式&#xff1a; drop databas…

CentOS 5打造全功能Web服務器

轉&#xff1a;主要做為歷史記錄&#xff0c;以后用。另外很少見這么好的編譯的文章&#xff0c;其實我不推薦用編譯安裝。但這個文章不錯.V3.0 2007年11月11日 將搭建教程劃分階段以適應不同需要。加入程序優化&#xff0c;程序安全&#xff0c;加入memcache&#xff0c;squid…

MySQL:查詢條件

查詢條件 1、使用 WHERE 子句從數據表中讀取數據的通用語法&#xff1a; SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....查詢語句中你可以使用一個或者多個表&#xff0c;表之間使用逗號**,** 分割&#x…

linux下的ImageMagick安裝

檢查系統有無安裝ImageMagick官方網址是&#xff1a; www.imagemagick.org 從官方不好下載&#xff0c;提供 sourceforge的下載地址&#xff1a; imagemagick.sourceforge.net shell> rpm -qa | grep ImageMagick 沒有就開始安裝ImageMagickshell> rpm -Uvh ImageMagi…