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

465e975b3eeb8829b11d4bdb82e78743.gif

先放结论,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 的进程

4c31678f5f3a5db82501af027f02a580.png

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

Cgroups

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

6e2262f64814edb67b1f4f3a8c9d9d13.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\n", i, IsPrime(i))
    }
}

我创建两个 CPU 的 cgroups

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

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

sudo cgset -r cpu.shares=512 cpulimited
ebc7170de5e0d9aae4a2fcdcdc68c34f.png

我们来验证一下。

在 cpulimited 起一个进程

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

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

be300c0f7dbfaaef9478879670716dc2.png

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

cadc1a96b30168a39a540804a49eaf71.png
sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &
6ee701da137b4d155b2617db3bafbd5d.png

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

作者:vincent

链接:https://zhuanlan.zhihu.com/p/55099839

Linux学习指南
有收获,点个在看
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值