自己動手寫docker之cgroup

2021-09-25 20:45:57 字數 1580 閱讀 5828

實驗環境 ubuntu 18.10

作業系統已經預設把各種controller都掛載到/sys/fs/cgroup/目錄下了。

ls /sys/fs/cgroup/ 可以檢視有哪些controller

mount |grep cgroup 可以檢視掛載資訊 (可以看到有乙個是cgroup2,其它都是cgroup1,顯示為cgroup)

1、先寫乙個占用記憶體的普通程式。

手工執行這個程式,用top -p pid可以看到這個程式最終使用1000mb記憶體(34%)

package main

import "time"

import "os"

func main()

time.sleep(30 * time.second)

}

2、寫乙個測試程式,呼叫上面的程式cmd2.  然後建立乙個cgroup,名字為gfmemory。寫入cmd2的pid到tasks檔案,寫入記憶體門限到 memory.limit_in_bytes 檔案。

切換到root使用者,執行這個測試程式。通過top -p pid可以看到cmd2的記憶體被限制在100mb左右。(3.3%)

package main

import (

"fmt"

"io/ioutil"

"log"

"os"

"os/exec"

"strconv"

// "syscall"

)// uts namespace 主要用來隔離 nodename 和 domainname 兩個系統標識。在 uts namespace

// 裡面 , 每個 namespace 允許有自己的 hostname 。

// ipc namespace 用來隔離 system v ipc 和 posix message queues 。ipcs -q ; ipcmk -q ; ipcrm -q 0

// pid namespace 是用來隔離程序 id 的 。

// mount namespace 用來隔 離各個程序看到 的掛載點檢視。

func main()

cmd.stdin = os.stdin

cmd.stdout = os.stdout

cmd.stderr = os.stderr

if merr := cmd.start(); merr != nil

path := "/sys/fs/cgroup/memory/gfmemory"

println(path)

if err := os.mkdir(path, 0755); err != nil

println("write tasks:", cmd.process.pid)

ioutil.writefile(path+"/tasks", byte(strconv.itoa(cmd.process.pid)), 0644)

ioutil.writefile(path+"/memory.limit_in_bytes", byte("100m"), 0644)

cmd.process.wait()

}

自己動手寫docker 2

2.1 linux namespace linux 支援的namespace namespace api的基本系統呼叫 不完整的ex,以下為呼叫後截圖為 package main import log os os exec syscall func main syscall.credential c...

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...