七天用Go寫個docker(第二天)

2021-10-04 02:25:46 字數 3484 閱讀 8189

linux cgroup提供了對一組程序及子程序的資源限制,控制和統計的能力,這些資源包括cpu,記憶體,儲存,網路等。通過cgroup,可以方便的吸納之某個程序的資源占用,並且可以實時監控程序和統計資訊。

cgroup完成資源限制主要通過下面三個元件

說半天概念,估計大家也是雲裡霧裡,我直接在liunx命令列中演示怎麼使用cgroup,這樣大家應該會對cgroup有乙個更清晰的認識。

建立乙個用來存放掛載點的資料夾

mkdir cgroup-demo
掛載hierarchy

3. 檢視生成的預設檔案

一旦我們掛載了hierarchy,那麼就會在這個資料夾中生成一些預設檔案

ls cgroup-demo
大致解釋下這幾個檔案的作用,主要是這個task檔案

新建子cgroup

只要在掛載了hierarchy的資料夾下,新建乙個新的資料夾,那麼該新的資料夾會被kernel自動標記為該cgroup的子group

可以看到,我們新建資料夾之後,資料夾裡面會自動生成一些預設的檔案,這個cgroup1就是cgroup-demo的子cgroup,預設情況下,他會繼承父cgroup的配置。

通過subsystem限制cgroup中程序的資源

上面建立的hierarchy並沒有關聯到任何的subsystem,所以沒辦法通過上面的hierarchy中的cgroup節點來限制程序的資源占用,其實系統預設已經為每個subsystem建立了乙個預設的hierarchy,它在linux的/sys/fs/cgroup路徑下

如果我們想限制某個程序id的記憶體,那麼就在/sys/fs/cgroup/memory資料夾下建立乙個限制 mermory的cgroup,建立方式和上面一樣,只要建立乙個資料夾即可,kernel 自動把該資料夾標記為乙個cgroup,我們來嘗試一下

可以看到該檔案下,自動給我們建立出來了很多限制資源檔案,我們只要將程序id寫到該資料夾下的task檔案中,然後修改其meory.limit_in_bytes的檔案,就能達到限制該程序的記憶體使用。

package main

import

("fmt"

"io/ioutil"

"os"

"os/exec"

"path"

"strconv"

"syscall"

)const

(// 掛載了 memory subsystem的hierarchy的根目錄位置

cgroupmemoryhierarchymount =

"/sys/fs/cgroup/memory"

)func

main()

cmd.stdin = os.stdin

cmd.stdout = os.stdout

cmd.stderr = os.stderr

if err := cmd.

run(

); err !=

nil}

cmd := exec.

command

("/proc/self/exe"

) cmd.sysprocattr =

&syscall.sysprocattr

cmd.stdin = os.stdin

cmd.stdout = os.stdout

cmd.stderr = os.stderr

err := cmd.

start()

if err !=

nil// 得到 fork出來程序對映在外部命名空間的pid

fmt.

printf

("%+v"

, cmd.process.pid)

// 建立子cgroup

newcgroup := path.

join

(cgroupmemoryhierarchymount,

"cgroup-demo-memory"

)if err := os.

mkdir

(newcgroup,

0755

); err !=

nil// 將容器程序放到子cgroup中

if err := ioutil.

writefile

(path.

join

(newcgroup,

"tasks"),

byte

(strconv.

itoa

(cmd.process.pid)),

0644

); err !=

nil// 限制cgroup的記憶體使用

if err := ioutil.

writefile

(path.

join

(newcgroup,

"memory.limit_in_bytes"),

byte

("100m"),

0644

); err !=

nil cmd.process.

wait()

}

ESC七天訓練營 第二天

詳見部落格,一下略過.https www.劉竹.cn 290.html 使用lamp來搭建 ubnutu16.04 apache php7.1 linux apache httpd mysql php 在映象中選擇lamp環境 ubnutu16.04 apache php7.1 或者 更換系統盤la...

Go程式設計學習第七天

二 方法 三 介面 示例 go 語言中沒有 類 的概念,也不支援像繼承這種物件導向的概念。但是go 語言的結構體與 類 都是復合結構體,而且go 語言中結構體的組合方式比物件導向具有更高的擴充套件性和靈活性。在定義時 結構體中的字段型別可以是任何型別 包括函式型別與介面型別,結構體型別 也可以不給字...

第七天 Python continue 語句用法

python continue 語句跳出本次迴圈,而break跳出整個迴圈。continue 語句用來告訴python跳過當前迴圈的剩餘語句,然後繼續進行下一輪迴圈。continue語句用在while和for迴圈中。python 語言 continue 語句語法格式如下 continue usr b...