0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux namespace和cgroups简介

马哥Linux运维 来源:高效运维 作者:高效运维 2022-03-16 09:03 次阅读

先放结论,namespace 是用来做资源隔离, cgroup 是用来做资源限制。

Namespace

先说Namespace,虚拟技术基本要求就是资源隔离,简单的说就是我独占当前所有的资源。比如我在 8080 端口起 web 服务器,不用担心其他进程端口占用。Linux 自带 namespace 就能达到这个目的。namespace 从2002 开始开发到现在已经快20年的历史了,到现在一共有6种 namespace:

  • mnt, 文件系统

  • pid, 进程

  • net, 网络

  • ipc, 系统进程通信

  • uts, hostname

  • user, 用户

可以通过三个系统调用的方式

  • clone,创建新的进程和新的namespace,新创建的进程 attach 到新创建的 namespace

  • unshare,不创建新的进程,创建新的 namespace 并把当前进程 attach 上

  • setns, attach 进程到已有的 namespace 上

shell 也提供了一个和系统调用同名的 unshare 命令可以非常简单的创建 namespace。


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

这样创建了一个新的 PID namespace 并在里面运行了 bash。我们看看当前 namespace 的进程

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

在这个 namespace 里,就只有两个进程了。

Cgroups

cgroups 是 control groups 控制组的意思, 可以通过文件系统来访问这些信息。一般cgroups 挂载在/sys/fs/cgroup

pYYBAGIxPQ2AUwnIAAgfQnTuA2o831.png

内核会读取这些信息来调度资源分配给每个进程。比如我要限制进程占用CPU的时间。我用 Go 写了一个模拟高 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))    }}

我创建两个 CPU 的 cgroups

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

cpu.shares 是给内核为每个进程决定 CPU 计算资源,默认值是1024。给 cpulimited 设置为 512,lesscpulimited 保留默认值,那么在这两个组的进程会以1 :2的比例占用CPU。


	
sudo cgset -r cpu.shares=512 cpulimited

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

我们来验证一下。

在 cpulimited 起一个进程


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

可以看到独占了 100% 的 CPU,在 cpulimited 再起一个进程

poYBAGIxPT6ARBspAAcpNjujwFQ011.png

两个进程都在 cpulimited,各占50%的 CPU。在 lesscpulimited 起一个进程

poYBAGIxPYWARk-KAAdDiLAiFOk165.png


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

pYYBAGIxPbKAGawfAAZkU0oF2lg946.png

两个 cpulimited 进程的 CPU 之和 与 一个 lesscpulimited 进程的 CPU 差不多就是 1:2的关系。

原文标题:容器技术基石:Linux namespace 和 cgroups,运维了解一下

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209497
  • 服务器
    +关注

    关注

    12

    文章

    9160

    浏览量

    85421
  • 资源
    +关注

    关注

    0

    文章

    59

    浏览量

    17786

原文标题:容器技术基石:Linux namespace 和 cgroups,运维了解一下

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    CgroupsLinux 系统内核提供的一种机制,这种机制可以根据需求将一些列系统任务机器子任务整合或分离到按资源划分登记的不同组内,从而为系统资源管理提供一个的框架。简单地说,cgroups
    发表于 11-24 09:54 602次阅读

    嵌入式Linux的启动流程简介

    目录嵌入式 Linux 启动流程简介启动流程Bootloader 简介市面上可见的 bootloader入式 Linux 启动流程简介对于一
    发表于 11-04 09:04

    嵌入式Linux开发简介

    目录1、嵌入式Linux开发简介1.1嵌入式系统1.2嵌入式操作系统简介1.2.1嵌入式操作系统的发展1.2.2几种代表性嵌入式操作系统1.3嵌入式Linux
    发表于 12-14 08:24

    Linux简介

    Linux简介Linux是一款优秀的计算机操作系统LINUX是在UNIX基础上开发,具有UNIX全部功能。1991年,芬兰赫尔辛基大学的学生Linus Torvalds开发了
    发表于 12-16 06:00

    Linux源代码简介

     Linux源代码简介欢迎进入Linux的世界!随着人们对开放源代码软件热情的不断高涨,Linux也受到了越来越多的关注。Linux
    发表于 02-10 13:54 78次下载

    Linux 2.6 中断处理原理简介

    Linux 2.6 中断处理原理简介 中断描述符表(Interrupt Descriptor Table,IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中存放的是相应的中断或
    发表于 02-05 10:52 795次阅读

    第1章 Linux简介和安装

    有关于linux简介
    发表于 12-20 22:16 0次下载

    一文读懂如何选取 Linux 容器镜像

    空间组件的独立管理,这是是通过使用 cgroups 和 命名空间 (Namespace)等资源及进程隔离机制实现的。虽然 Solaris 和 BSD 也提供了与 Linux 容器技术类似的 抽象机制 ,但此份对比报告只聚焦于
    发表于 12-05 11:34 0次下载

    简要介绍了操作系统虚拟化的概念,以及实现操作系统虚拟化的技术

    本文简要介绍了操作系统级虚拟化的概念,并简要阐述了实现操作系统虚拟化所用到的技术Namespacecgroups的原理及使用方法。
    的头像 发表于 01-10 15:00 1.3w次阅读
    简要介绍了操作系统虚拟化的概念,以及实现操作系统虚拟化的技术

    什么是cgroups?有什么作用?

    cgroups (Control Groups) 是 Linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
    的头像 发表于 08-27 11:35 1.1w次阅读

    ADM1266 Linux API和Python库简介

    ADM1266 Linux API和Python库简介
    发表于 05-17 10:50 6次下载
    ADM1266 <b class='flag-5'>Linux</b> API和Python库<b class='flag-5'>简介</b>

    简述Docker的底层技术原理之Namespace

    在同一个网络命令空间下,那么他们看到的网络信息(网卡、IP、路由等)是一样的,可以通过localhost的方式互相访问。常用的有6种namespace,在Linux 内核4.6之后又添加了Cgroup
    的头像 发表于 07-21 09:55 1357次阅读

    容器核心技术CgroupsNamespace

    而对于Docker等Linux容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的PID填写到对应控制组的tasks文件中就可以了。
    的头像 发表于 03-28 09:47 1051次阅读

    Arch Linux RISC-V 端口及相关作品简介

    Arch Linux RISC-V 端口及相关作品简介 演讲ppt分享
    发表于 07-17 16:34 6次下载

    ArmSoM-W3应用开发之安装docker

    使用docker2.Rockchip平台系统运行dockerDocker运行对内核配置有要求,需要kernel开启cgroupsnamespace、netfilter、overlayfs
    的头像 发表于 11-20 10:05 467次阅读
    ArmSoM-W3应用开发之安装docker