0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux namespace和cgroups簡(jiǎn)介

馬哥Linux運(yùn)維 ? 來(lái)源:高效運(yùn)維 ? 作者:高效運(yùn)維 ? 2022-03-16 09:03 ? 次閱讀

先放結(jié)論,namespace 是用來(lái)做資源隔離, cgroup 是用來(lái)做資源限制。

Namespace

先說(shuō)Namespace,虛擬技術(shù)基本要求就是資源隔離,簡(jiǎn)單的說(shuō)就是我獨(dú)占當(dāng)前所有的資源。比如我在 8080 端口起 web 服務(wù)器,不用擔(dān)心其他進(jìn)程端口占用。Linux 自帶 namespace 就能達(dá)到這個(gè)目的。namespace 從2002 開(kāi)始開(kāi)發(fā)到現(xiàn)在已經(jīng)快20年的歷史了,到現(xiàn)在一共有6種 namespace:

  • mnt, 文件系統(tǒng)

  • pid, 進(jìn)程

  • net, 網(wǎng)絡(luò)

  • ipc, 系統(tǒng)進(jìn)程通信

  • uts, hostname

  • user, 用戶

可以通過(guò)三個(gè)系統(tǒng)調(diào)用的方式

  • clone,創(chuàng)建新的進(jìn)程和新的namespace,新創(chuàng)建的進(jìn)程 attach 到新創(chuàng)建的 namespace

  • unshare,不創(chuàng)建新的進(jìn)程,創(chuàng)建新的 namespace 并把當(dāng)前進(jìn)程 attach 上

  • setns, attach 進(jìn)程到已有的 namespace 上

shell 也提供了一個(gè)和系統(tǒng)調(diào)用同名的 unshare 命令可以非常簡(jiǎn)單的創(chuàng)建 namespace。


	
sudo unshare --fork --pid --mount-proc bash

這樣創(chuàng)建了一個(gè)新的 PID namespace 并在里面運(yùn)行了 bash。我們看看當(dāng)前 namespace 的進(jìn)程

aaaa3ca2-9331-11ec-952b-dac502259ad0.png

在這個(gè) namespace 里,就只有兩個(gè)進(jìn)程了。

Cgroups

cgroups 是 control groups 控制組的意思, 可以通過(guò)文件系統(tǒng)來(lái)訪問(wèn)這些信息。一般cgroups 掛載在/sys/fs/cgroup

pYYBAGIxPQ2AUwnIAAgfQnTuA2o831.png

內(nèi)核會(huì)讀取這些信息來(lái)調(diào)度資源分配給每個(gè)進(jìn)程。比如我要限制進(jìn)程占用CPU的時(shí)間。我用 Go 寫(xiě)了一個(gè)模擬高 CPU 的代碼。

func IsPrime(value int) bool {    for i := 2; i <= int(math.Floor(float64(value)/2)); i++ {        if value%2 == 0 {            return false        }    }    return true}
func main() {    for i := 0; i < 999999999; i++ {        fmt.Printf("%v is prime: %v
", i, IsPrime(i))    }}

我創(chuàng)建兩個(gè) CPU 的 cgroups

sudo cgcreate -g cpu:/cpulimitedsudo cgcreate -g cpu:/lesscpulimited

cpu.shares 是給內(nèi)核為每個(gè)進(jìn)程決定 CPU 計(jì)算資源,默認(rèn)值是1024。給 cpulimited 設(shè)置為 512,lesscpulimited 保留默認(rèn)值,那么在這兩個(gè)組的進(jìn)程會(huì)以1 :2的比例占用CPU。


	
sudo cgset -r cpu.shares=512 cpulimited

aad8bef6-9331-11ec-952b-dac502259ad0.png

我們來(lái)驗(yàn)證一下。

在 cpulimited 起一個(gè)進(jìn)程


	
sudo cgexec -g cpu:cpulimited ./main > /dev/null &

可以看到獨(dú)占了 100% 的 CPU,在 cpulimited 再起一個(gè)進(jìn)程

poYBAGIxPT6ARBspAAcpNjujwFQ011.png

兩個(gè)進(jìn)程都在 cpulimited,各占50%的 CPU。在 lesscpulimited 起一個(gè)進(jìn)程

poYBAGIxPYWARk-KAAdDiLAiFOk165.png


	
sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &

pYYBAGIxPbKAGawfAAZkU0oF2lg946.png

兩個(gè) cpulimited 進(jìn)程的 CPU 之和 與 一個(gè) lesscpulimited 進(jìn)程的 CPU 差不多就是 1:2的關(guān)系。

原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下

文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11326

    瀏覽量

    209959
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9253

    瀏覽量

    85742
  • 資源
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    17808

原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文帶你搞懂Docker容器的核心基石Cgroups

    CgroupsLinux 系統(tǒng)內(nèi)核提供的一種機(jī)制,這種機(jī)制可以根據(jù)需求將一些列系統(tǒng)任務(wù)機(jī)器子任務(wù)整合或分離到按資源劃分登記的不同組內(nèi),從而為系統(tǒng)資源管理提供一個(gè)的框架。簡(jiǎn)單地說(shuō),cgroups
    發(fā)表于 11-24 09:54 ?613次閱讀

    嵌入式Linux的啟動(dòng)流程簡(jiǎn)介

    目錄嵌入式 Linux 啟動(dòng)流程簡(jiǎn)介啟動(dòng)流程Bootloader 簡(jiǎn)介市面上可見(jiàn)的 bootloader入式 Linux 啟動(dòng)流程簡(jiǎn)介對(duì)于一
    發(fā)表于 11-04 09:04

    嵌入式Linux開(kāi)發(fā)簡(jiǎn)介

    目錄1、嵌入式Linux開(kāi)發(fā)簡(jiǎn)介1.1嵌入式系統(tǒng)1.2嵌入式操作系統(tǒng)簡(jiǎn)介1.2.1嵌入式操作系統(tǒng)的發(fā)展1.2.2幾種代表性嵌入式操作系統(tǒng)1.3嵌入式Linux
    發(fā)表于 12-14 08:24

    Linux簡(jiǎn)介

    Linux簡(jiǎn)介Linux是一款優(yōu)秀的計(jì)算機(jī)操作系統(tǒng)LINUX是在UNIX基礎(chǔ)上開(kāi)發(fā),具有UNIX全部功能。1991年,芬蘭赫爾辛基大學(xué)的學(xué)生Linus Torvalds開(kāi)發(fā)了
    發(fā)表于 12-16 06:00

    Linux源代碼簡(jiǎn)介

     Linux源代碼簡(jiǎn)介歡迎進(jìn)入Linux的世界!隨著人們對(duì)開(kāi)放源代碼軟件熱情的不斷高漲,Linux也受到了越來(lái)越多的關(guān)注。Linux
    發(fā)表于 02-10 13:54 ?78次下載

    Linux 2.6 中斷處理原理簡(jiǎn)介

    Linux 2.6 中斷處理原理簡(jiǎn)介 中斷描述符表(Interrupt Descriptor Table,IDT)是一個(gè)系統(tǒng)表,它與每一個(gè)中斷或異常向量相聯(lián)系,每一個(gè)向量在表中存放的是相應(yīng)的中斷或
    發(fā)表于 02-05 10:52 ?799次閱讀

    第1章 Linux簡(jiǎn)介和安裝

    有關(guān)于linux簡(jiǎn)介
    發(fā)表于 12-20 22:16 ?0次下載

    一文讀懂如何選取 Linux 容器鏡像

    空間組件的獨(dú)立管理,這是是通過(guò)使用 cgroups 和 命名空間 (Namespace)等資源及進(jìn)程隔離機(jī)制實(shí)現(xiàn)的。雖然 Solaris 和 BSD 也提供了與 Linux 容器技術(shù)類似的 抽象機(jī)制 ,但此份對(duì)比報(bào)告只聚焦于
    發(fā)表于 12-05 11:34 ?0次下載

    簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)

    本文簡(jiǎn)要介紹了操作系統(tǒng)級(jí)虛擬化的概念,并簡(jiǎn)要闡述了實(shí)現(xiàn)操作系統(tǒng)虛擬化所用到的技術(shù)Namespacecgroups的原理及使用方法。
    的頭像 發(fā)表于 01-10 15:00 ?1.3w次閱讀
    簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)

    什么是cgroups?有什么作用?

    cgroups (Control Groups) 是 Linux 內(nèi)核提供的一種機(jī)制,這種機(jī)制可以根據(jù)需求把一系列系統(tǒng)任務(wù)及其子任務(wù)整合(或分隔)到按資源劃分等級(jí)的不同組內(nèi),從而為系統(tǒng)資源管理提供一個(gè)統(tǒng)一的框架。
    的頭像 發(fā)表于 08-27 11:35 ?1.1w次閱讀

    ADM1266 Linux API和Python庫(kù)簡(jiǎn)介

    ADM1266 Linux API和Python庫(kù)簡(jiǎn)介
    發(fā)表于 05-17 10:50 ?6次下載
    ADM1266 <b class='flag-5'>Linux</b> API和Python庫(kù)<b class='flag-5'>簡(jiǎn)介</b>

    簡(jiǎn)述Docker的底層技術(shù)原理之Namespace

    在同一個(gè)網(wǎng)絡(luò)命令空間下,那么他們看到的網(wǎng)絡(luò)信息(網(wǎng)卡、IP、路由等)是一樣的,可以通過(guò)localhost的方式互相訪問(wèn)。常用的有6種namespace,在Linux 內(nèi)核4.6之后又添加了Cgroup
    的頭像 發(fā)表于 07-21 09:55 ?1371次閱讀

    容器核心技術(shù)CgroupsNamespace

    而對(duì)于Docker等Linux容器項(xiàng)目來(lái)說(shuō),它們只需要在每個(gè)子系統(tǒng)下面,為每個(gè)容器創(chuàng)建一個(gè)控制組(即創(chuàng)建一個(gè)新目錄),然后在啟動(dòng)容器進(jìn)程之后,把這個(gè)進(jìn)程的PID填寫(xiě)到對(duì)應(yīng)控制組的tasks文件中就可以了。
    的頭像 發(fā)表于 03-28 09:47 ?1067次閱讀

    Arch Linux RISC-V 端口及相關(guān)作品簡(jiǎn)介

    Arch Linux RISC-V 端口及相關(guān)作品簡(jiǎn)介 演講ppt分享
    發(fā)表于 07-17 16:34 ?6次下載

    ArmSoM-W3應(yīng)用開(kāi)發(fā)之安裝docker

    使用docker2.Rockchip平臺(tái)系統(tǒng)運(yùn)行dockerDocker運(yùn)行對(duì)內(nèi)核配置有要求,需要kernel開(kāi)啟cgroupsnamespace、netfilter、overlayfs
    的頭像 發(fā)表于 11-20 10:05 ?491次閱讀
    ArmSoM-W3應(yīng)用開(kāi)發(fā)之安裝docker