Linux之namespace 和 cgroups

0    301    2

Tags:

👉 本文共约1308个字,系统预计阅读时间或需5分钟。

先放结论, 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。

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

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

Cgroups

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

内核会读取这些信息来调度资源分配给每个进程。比如我要限制进程占用CPU的时间。我用 Go 写了一个模拟高 CPU 的代码。

我创建两个 CPU 的 cgroups

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

我们来验证一下。

在 cpulimited 起一个进程

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

Linux之namespace 和 cgroups

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

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

Linux之namespace 和 cgroups

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

Linux之namespace 和 cgroups

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

参考链接

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

https://link.zhihu.com/?target=https%3A//jvns.ca/blog/2016/10/10/what-even-is-a-container/

https://link.zhihu.com/?target=http%3A//blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部