Linux 的命名空间
Linux 的命名空间
1. Linux 内核包含了不同类型的 namespace。每个 namespace 都有自己的独特属性。
- [user namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/user_namespaces.7.html) 拥有自己的一组用户 ID 和组 ID,用于分配给进程。这意味着进程可以在其 user namespace 中拥有 `root 权限,而不需要在其他 user namespace 中获得。`
- [process ID (PID) namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/pid_namespaces.7.html) 将一组 PID 分配给独立于其他 namespace 中的一组 PID 的进程。在新的 namespace 中创建的第一个进程分得 PID 1,子进程被分配给后续的 PID。如果子进程使用自己的 PID namespace 创建,则它在该 namespace 中使用 PID 1,在父进程的 namespace 中使用自己的 PID。请参见[下面](https://link.zhihu.com/?target=https%3A//www.nginx-cn.net/blog/what-are-namespaces-cgroups-how-do-they-work/%23pid-namespaces)的示例。
- [network namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/network_namespaces.7.html) 拥有独立的网络栈:自己的专用路由表、IP 地址集、套接字列表、连接跟踪表、防火墙及其他网络相关资源。
- [mount namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/mount_namespaces.7.html) 拥有一个独立的挂载点列表,并对该 namespace 中的进程可见。这意味着您可以在 mount namespace 中挂载和卸载文件系统,而不会影响主机文件系统。
- [interprocess communication (IPC) namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/ipc_namespaces.7.html) 拥有自己的 IPC 资源,例如 [POSIX 消息队列](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/mq_overview.7.html)。
- [UNIX Time‑Sharing (UTS) namespace](https://link.zhihu.com/?target=https%3A//man7.org/linux/man-pages/man7/uts_namespaces.7.html) 允许单个系统对不同的进程显示不同的主机名和域名。
网络命名空间
IPC 命名空间
Linux内核IPC机制
在Linux内核中IPC全名称之为进程间通信机制,共分为多种,如下:
信号量
共享内存
消息队列
管道
信号
套接字通信
每一种实现都有其独特特性,一下博客中我们会讲解其中的分类,作用以及优缺点。
分类:
1.分类
按照实现机制分类:
信号量,共享内存,消息队列是在内核中使用了IPC命名空间实现,由统一的键值管理(之前博客中有讲解过IDR机制管理键值),实现起来比较简单。
管道是基于文件系统实现的,信号是内核专门实现信号的task_struct结构体来实现的,套接字通信是基于网络通信来实现的。
按照功能分类:
共享内存, 消息队列,管道和套接字通信是可以传输比较大的数据的,信号量是基于共享内存来实现互斥机制的,信号虽然也可以传输数据,但是其主要作用是给特定进程发送特定信号标记的。
版权声明:本文为CSDN博主「IT残荷轩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37867857/article/details/85099774
Cgroup 与 命名空间
Namespace 和 cgroup 的简介及其工作原理 - 知乎 (zhihu.com)
什么是 cgroup?
控制组 (cgroup) 是 Linux 内核的一个特性,用于限制、记录和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络等)。
cgroup 具有以下特性:
- 资源限制 —— 您可以配置 cgroup,从而限制进程可以对特定资源(例如内存或 CPU)的使用量。
- 优先级 —— 当资源发生冲突时,您可以控制一个进程相比另一个 cgroup 中的进程可以使用的资源量(CPU、磁盘或网络)。
- 记录 —— 在 cgroup 级别监控和报告资源限制。
- 控制 —— 您可以使用单个命令更改 cgroup 中所有进程的状态(冻结、停止或重新启动)。
cgroup 的作用基本上就是控制一个进程或一组进程可以访问或使用给定关键资源(CPU、内存、网络和磁盘 I/O)的量。一个容器中通常运行了多个进程,并且您需要对这些进程实施统一控制,因此 cgroup 是容器的关键组件。Kubernetes 环境使用cgroup 在 pod 级别上部署资源请求和限制以及对应的 QoS 类。
下图说明了当您将特定比例的可用系统资源分配给一个 cgroup(在本例中,为cgroup‑1)后,剩余资源是如何在系统上其他 cgroup(以及各个进程)之间进行分配的。
Cgroup 版本
根据维基百科的说法,cgroup 第一个版本于 2007 年末或 2008 年初并入 Linux 内核主线,“cgroup 第二个版本的文档于 2016 年首次出现在 Linux 内核中”。第二个版本进行了许多改变,其中较大的变化是树形结构更加简化、cgroup 层次结构增加了新的特性和接口,以及能够更好地适应“rootless”容器(使用非零 UID)。
v2版本的接口也有所更新,其中我最喜欢的是 pressure stall information (PSI)。与之前相比,它能够更精细地提供对每个进程内存使用和分配情况的洞察(不在本博客的讨论范围内,但这是一个非常有意思的话题)。
创建 cgroup
以下命令将创建一个名为 foo
的v1 cgroup(通过 pathname 格式可以看出来),并将其内存限制设为 50,000,000 字节 (50 MB)。
1 |
|
现在,我可以为该 cgroup 分配一个进程,从而对其施加 cgroup 的内存限制。我编写了一个名为 test.sh
的 shell 脚本,它将 cgroup
testing
tool
打印到屏幕上,然后我只需静静等待。因为在我停止它之前,它会持续运行。
我在后台启动 test.sh
,脚本生成其输出结果, PID 为 2428,然后我将其 PID 写入 cgroup 文件 /sys/fs/cgroup/memory/foo/cgroup.procs,从而将该进程分配给 cgroup。
1 |
|
为了验证我的进程是否受限于我为 cgroup foo
定义的内存限制,我运行了以下 ps
命令。-o
cgroup
标志显示了指定进程 (2428) 所属的 cgroup。输出结果确认其内存 cgroup 为 foo
。
1 |
|
默认情况下,当进程超过其 cgroup 定义的资源限制时,操作系统将终止该进程。