内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

怎么通過Cgroups機(jī)制實(shí)現(xiàn)資源限制

這篇文章主要介紹“怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制”,在日常操作中,相信很多人在怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了吉安免費(fèi)建站歡迎大家使用!

cgroups功能及核心概念

cgroups(全稱:control groups)是 Linux 內(nèi)核的一個功能,它可以實(shí)現(xiàn)限制進(jìn)程或者進(jìn)程組的資源(如 CPU、內(nèi)存、磁盤 IO 等)。

在 2006 年,Google 的工程師( Rohit Seth 和 Paul Menage 為主要發(fā)起人) 發(fā)起了這個項(xiàng)目,起初項(xiàng)目名稱并不是cgroups,而被稱為進(jìn)程容器(process containers)。在 2007 年cgroups代碼計(jì)劃合入Linux 內(nèi)核,但是當(dāng)時在 Linux 內(nèi)核中,容器(container)這個詞被廣泛使用,并且擁有不同的含義。為了避免命名混亂和歧義,進(jìn)程容器被重名為cgroups,并在 2008 年成功合入 Linux 2.6.24 版本中。cgroups目前已經(jīng)成為 systemd、Docker、Linux Containers(LXC) 等技術(shù)的基礎(chǔ)。

cgroups 主要提供了如下功能

  • 資源限制: 限制資源的使用量,例如我們可以通過限制某個業(yè)務(wù)的內(nèi)存上限,從而保護(hù)主機(jī)其他業(yè)務(wù)的安全運(yùn)行。

  • 優(yōu)先級控制:不同的組可以有不同的資源( CPU 、磁盤 IO 等)使用優(yōu)先級。

  • 審計(jì):計(jì)算控制組的資源使用情況。

  • 控制:控制進(jìn)程的掛起或恢復(fù)。

cgroups功能的實(shí)現(xiàn)依賴于三個核心概念:子系統(tǒng)、控制組、層級樹。

  • 子系統(tǒng)(subsystem):是一個內(nèi)核的組件,一個子系統(tǒng)代表一類資源調(diào)度控制器。例如內(nèi)存子系統(tǒng)可以限制內(nèi)存的使用量,CPU 子系統(tǒng)可以限制 CPU 的使用時間。

  • 控制組(cgroup):表示一組進(jìn)程和一組帶有參數(shù)的子系統(tǒng)的關(guān)聯(lián)關(guān)系。例如,一個進(jìn)程使用了 CPU 子系統(tǒng)來限制 CPU 的使用時間,則這個進(jìn)程和 CPU 子系統(tǒng)的關(guān)聯(lián)關(guān)系稱為控制組。

  • 層級樹(hierarchy):是由一系列的控制組按照樹狀結(jié)構(gòu)排列組成的。這種排列方式可以使得控制組擁有父子關(guān)系,子控制組默認(rèn)擁有父控制組的屬性,也就是子控制組會繼承于父控制組。比如,系統(tǒng)中定義了一個控制組 c1,限制了 CPU 可以使用 1 核,然后另外一個控制組 c2 想實(shí)現(xiàn)既限制 CPU 使用 1 核,同時限制內(nèi)存使用 2G,那么 c2 就可以直接繼承 c1,無須重復(fù)定義 CPU 限制。

cgroups 的三個核心概念中,子系統(tǒng)是最核心的概念,因?yàn)樽酉到y(tǒng)是真正實(shí)現(xiàn)某類資源的限制的基礎(chǔ)。

cgroups 子系統(tǒng)實(shí)例

下面我通過一個實(shí)例演示一下在 Linux 上默認(rèn)都啟動了哪些子系統(tǒng)。我們先通過 mount 命令查看一下當(dāng)前系統(tǒng)已經(jīng)掛載的cgroups信息:

root@cr7-ubuntu:~# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

通過輸出,可以看到當(dāng)前系統(tǒng)已經(jīng)掛載了我們常用的cgroups子系統(tǒng),例如 cpu、memory、pids 等我們常用的cgroups子系統(tǒng)。這些子系統(tǒng)中,cpu 和 memory 子系統(tǒng)是容器環(huán)境中使用最多的子系統(tǒng),下面我對這兩個子系統(tǒng)做詳細(xì)介紹。

cpu 子系統(tǒng)

首先我們在沒有限制CPU使用率的情況下在后臺執(zhí)行這樣一條腳本:

root@cr7-ubuntu:~# while : do : done &
[1] 839960

顯然,它執(zhí)行了一個死循環(huán),可以把計(jì)算機(jī)的 CPU 吃到 100%,根據(jù)它的輸出,我們可以看到這個腳本在后臺運(yùn)行的進(jìn)程號(PID)是 839960。

我們可以用 top 指令來確認(rèn)一下 CPU 有沒有被打滿:

怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制

在輸出里可以看到,CPU 的使用率已經(jīng) 100% 了(%Cpu(s): 98.0 us)。

現(xiàn)在我們 以 cpu 子系統(tǒng)為例,演示一下cgroups如何限制進(jìn)程的 cpu 使用時間。由于cgroups的操作很多需要用到 root 權(quán)限,我們在執(zhí)行命令前要確保已經(jīng)切換到了 root 用戶,以下命令的執(zhí)行默認(rèn)都是使用 root 用戶。

第一步:在 cpu 子系統(tǒng)下創(chuàng)建 cgroupcgroups的創(chuàng)建很簡單,只需要在相應(yīng)的子系統(tǒng)下創(chuàng)建目錄即可。下面我們到 cpu 子系統(tǒng)下創(chuàng)建測試文件夾:

root@cr7-ubuntu:~# mkdir  /sys/fs/cgroup/cpu/mydocker

這個目錄就稱為一個“控制組”。你會發(fā)現(xiàn),操作系統(tǒng)會在你新創(chuàng)建的 container 目錄下,自動生成該子系統(tǒng)對應(yīng)的資源限制文件:

root@cr7-ubuntu:~# ls -l /sys/fs/cgroup/cpu/mydocker
total 0
-rw-r--r-- 1 root root 0 Mar 10 09:34 cgroup.clone_children
-rw-r--r-- 1 root root 0 Mar 10 09:34 cgroup.procs
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.stat
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_all
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_sys
-r--r--r-- 1 root root 0 Mar 10 09:34 cpuacct.usage_user
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpu.shares
-r--r--r-- 1 root root 0 Mar 10 09:34 cpu.stat
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpu.uclamp.max
-rw-r--r-- 1 root root 0 Mar 10 09:34 cpu.uclamp.min
-rw-r--r-- 1 root root 0 Mar 10 09:34 notify_on_release
-rw-r--r-- 1 root root 0 Mar 10 09:34 tasks

你會在它的輸出里注意到 cfs_period 和 cfs_quota 這樣的關(guān)鍵詞。這兩個參數(shù)需要組合使用,可以用來限制進(jìn)程在長度為 cfs_period 的一段時間內(nèi),只能被分配到總量為 cfs_quota 的 CPU 時間。 如果用這個值去除以調(diào)度周期(也就是 cpu.cfs_period_us),50ms/100ms = 0.5,這樣這個控制組被允許使用的 CPU 最大配額就是 0.5 個 CPU。從這里能夠看出,cpu.cfs_quota_us 是一個絕對值。如果這個值是 200000,也就是 200ms,那么它除以 period,也就是 200ms/100ms=2,結(jié)果超過了 1 個 CPU,這就意味著這時控制組需要 2 個 CPU 的資源配額。

而此時,我們可以通過查看 mydocker 目錄下的文件,看到 mydocker 控制組里的 CPU quota 還沒有任何限制(即:-1),CPU period 則是默認(rèn)的 100 ms(100000 us):

root@cr7-ubuntu:~# cat /sys/fs/cgroup/cpu/mydocker/cpu.cfs_quota_us
-1
root@cr7-ubuntu:~# cat /sys/fs/cgroup/cpu/mydocker/cpu.cfs_period_us
100000

第二步:設(shè)置限制參數(shù)

接下來,我們可以通過修改這些文件的內(nèi)容來設(shè)置限制。向 mydocker 組里的 cfs_quota 文件寫入 20 ms(20000 us):

root@cr7-ubuntu:~# echo 20000 > /sys/fs/cgroup/cpu/mydocker/cpu.cfs_quota_us

它意味著在每 100 ms 的時間里,被該控制組限制的進(jìn)程只能使用 20 ms 的 CPU 時間,也就是說這個進(jìn)程只能使用到 20% 的 CPU 帶寬。(如果CPU是多核,那么20%指的是這個進(jìn)程在所有CPU中能使用的帶寬總和,例如CPU1是10%,CPU2是10%)

第三步:將進(jìn)程加入cgroup控制組

接下來,我們把被限制的進(jìn)程的 PID 寫入 mydocker 組里的 tasks 文件,上面的設(shè)置就會對該進(jìn)程生效了:

root@cr7-ubuntu:~# echo 839960 > /sys/fs/cgroup/cpu/mydocker/tasks

此時我們用top命令查看一下: 怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制 可以看到,計(jì)算機(jī)的 CPU 使用率立刻降到了 20%(%Cpu0 : 21.5 us)。

memroy 子系統(tǒng)

第一步:在 memory 子系統(tǒng)下創(chuàng)建 cgroup

root@cr7-ubuntu:~#  mkdir /sys/fs/cgroup/memory/mydocker

同樣,我們查看一下新創(chuàng)建的目錄下自動創(chuàng)建的文件:

root@cr7-ubuntu:~# ls  -l /sys/fs/cgroup/memory/mydocker
total 0
-rw-r--r-- 1 root root 0 Mar 10 09:50 cgroup.clone_children
--w--w--w- 1 root root 0 Mar 10 09:50 cgroup.event_control
-rw-r--r-- 1 root root 0 Mar 10 09:50 cgroup.procs
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.failcnt
--w------- 1 root root 0 Mar 10 09:50 memory.force_empty
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.failcnt
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.limit_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.slabinfo
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.tcp.failcnt
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.kmem.usage_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.limit_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.max_usage_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.move_charge_at_immigrate
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.numa_stat
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.oom_control
---------- 1 root root 0 Mar 10 09:50 memory.pressure_level
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.soft_limit_in_bytes
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.stat
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.swappiness
-r--r--r-- 1 root root 0 Mar 10 09:50 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 Mar 10 09:50 memory.use_hierarchy
-rw-r--r-- 1 root root 0 Mar 10 09:50 notify_on_release
-rw-r--r-- 1 root root 0 Mar 10 09:50 tasks

其中 memory.limit_in_bytes 文件代表內(nèi)存使用總量,單位為 byte。

第二步:設(shè)置限制參數(shù)例如,這里我希望對內(nèi)存使用限制為 1G,則向 memory.limit_in_bytes 文件寫入 1073741824,命令如下:

root@cr7-ubuntu:~# echo 1073741824 >  /sys/fs/cgroup/memory/mydocker/memory.limit_in_bytes

第三步:將進(jìn)程加入cgroup控制組把當(dāng)前 shell 進(jìn)程 ID 寫入 tasks 文件內(nèi):

root@cr7-ubuntu:~# echo $$ > /sys/fs/cgroup/memory/mydocker/tasks

這里我們需要借助一下工具 memtester,memtester 的安裝這里不再詳細(xì)介紹了。

安裝好 memtester 后,我們執(zhí)行以下命令:

root@cr7-ubuntu:~# memtester 1500M 1
memtester version 4.2.2 (64-bit)
Copyright (C) 2010 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 1500MB (1572864000 bytes)
got  1500MB (1572864000 bytes), trying mlock ...Killed

該命令會申請 1500 M 內(nèi)存,并且做內(nèi)存測試。由于上面我們對當(dāng)前 shell 進(jìn)程內(nèi)存限制為 1 G,當(dāng) memtester 使用的內(nèi)存達(dá)到 1G 時,cgroup 便將 memtester 殺死。

上面最后一行的輸出結(jié)果表示 memtester 想要 1500 M 內(nèi)存,但是由于 cgroup 限制,達(dá)到了內(nèi)存使用上限,被殺死了,與我們的預(yù)期一致。

我們可以使用以下命令,降低一下內(nèi)存申請,將內(nèi)存申請調(diào)整為 500M:

root@cr7-ubuntu:~# memtester 500M 1
memtester version 4.2.2 (64-bit)
Copyright (C) 2010 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).

pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 500MB (524288000 bytes)
got  500MB (524288000 bytes), trying mlock ...locked.
Loop 1/1:
  Stuck Address       : ok
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok
  Block Sequential    : ok
  Checkerboard        : ok
  Bit Spread          : ok
  Bit Flip            : ok
  Walking Ones        : ok
  Walking Zeroes      : ok
  8-bit Writes        : ok
  16-bit Writes       : ok

Done.

這里可以看到,此時 memtester 已經(jīng)成功申請到 500M 內(nèi)存并且正常完成了內(nèi)存測試。

刪除 cgroups

上面創(chuàng)建的cgroups如果不想使用了,直接刪除創(chuàng)建的文件夾即可。 例如我想刪除內(nèi)存下的 mydocker 目錄,使用以下命令即可:

root@cr7-ubuntu:~# rmdir /sys/fs/cgroup/memory/mydocker/

Docker 使用 cgroups

限制容器cpu

限制容器只能使用到 20% 的 CPU 帶寬。

root@cr7-ubuntu:~# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

在啟動這個容器后,我們可以通過查看 Cgroups 文件系統(tǒng)下,CPU 子系統(tǒng)中,“docker”這個控制組里的資源限制文件的內(nèi)容來確認(rèn):

root@cr7-ubuntu:~# cat /sys/fs/cgroup/cpu/docker/99cdb60e28191871c456f736470c9a1d344b95c6bcdb39036926428378db55c4/cpu.cfs_period_us
100000
root@cr7-ubuntu:~# cat /sys/fs/cgroup/cpu/docker/99cdb60e28191871c456f736470c9a1d344b95c6bcdb39036926428378db55c4/cpu.cfs_quota_us
20000

很長的數(shù)字+字母為容器的id,可以使用docker inspect <容器名>命令來查看容器的id。

限制容器memory

root@cr7-ubuntu:~# docker run -it -m=1g nginx

上述命令創(chuàng)建并啟動了一個 nginx 容器,并且限制內(nèi)存為 1G。然后我們查看該容器對應(yīng)的cgroup控制組 memory.limit_in_bytes 文件的內(nèi)容,可以看到內(nèi)存限制值正好為 1G:

root@cr7-ubuntu:~# cat /sys/fs/cgroup/memory/docker/2e5f7db4b9a08b08471b3fcf9f71cb14396fb081db3cdc25140714ae037f2136/memory.limit_in_bytes
1073741824

到此,關(guān)于“怎么通過 Cgroups 機(jī)制實(shí)現(xiàn)資源限制”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

網(wǎng)站名稱:怎么通過Cgroups機(jī)制實(shí)現(xiàn)資源限制
瀏覽地址:http://m.rwnh.cn/article18/ipjcgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、響應(yīng)式網(wǎng)站小程序開發(fā)、微信小程序、商城網(wǎng)站網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
克东县| 五河县| 积石山| 杭州市| 游戏| 北辰区| 武城县| 张家港市| 南澳县| 衡阳县| 启东市| 河源市| 呼图壁县| 雷波县| 花莲县| 拜泉县| 稻城县| 大城县| 嘉义市| 绥宁县| 乐昌市| 金塔县| 扶余县| 通海县| 广河县| 内乡县| 沛县| 昌宁县| 虞城县| 昔阳县| 曲阜市| 西城区| 夏河县| 德江县| 郸城县| 山东| 临海市| 阿坝| 安国市| 旬邑县| 长治县|