当前位置: 首页 > news >正文

Linux Namespace和Cgroup的概念

一 Linux Namespace

1.1 Namespace基本概念

Namespace(命名空间) 是 Linux 内核提供的一种资源隔离机制。它允许将系统资源分隔成多个虚拟的“空间”,每个命名空间内的进程只能访问该命名空间下的资源,而不能访问其他命名空间中的资源。通过 namespace,不同的进程可以在同一个操作系统内共享硬件资源,但又能感知到各自独立的环境。

Docker 正是通过为每个容器创建一套独立的命名空间,让容器具备了类似 “独立虚拟机” 的运行环境,但无需像虚拟机那样加载完整操作系统内核(共享宿主机内核),因此更轻量。

1.2 Docker依赖的6类namespace及其作用

  • PID Namespace
    用来隔离进程 ID 编号,让每个命名空间内的进程有独立的 PID 序列。 容器内的init进程(如/sbin/init或容器入口命令)会被分配PID 1,与宿主机的PID 1(系统 init 进程)不冲突。容器内看不到宿主机或其他容器的进程。
  • NET Namespace(网络)
    用来隔离网络栈,每个命名空间有独立的网卡、IP、路由表、端口、防火墙规则。 Docker 为每个容器创建独立的虚拟网卡(如eth0),并分配私有 IP(如172.17.0.0/16网段)。容器的端口(如80)仅在自身网络命名空间内可见,需通过 “端口映射”(-p)才能被宿主机或外部访问。
  • MNT Namespace(挂载)
    用来隔离文件系统挂载点。每个命名空间有独立的挂载目录树。 Docker 为每个容器挂载独立的 “根文件系统(RootFS)”(即容器镜像的文件结构),容器内的/目录与宿主机的/完全隔离。容器内挂载的文件(如/tmp)不会影响宿主机。
  • UTS Namespace(主机名 / 域名)
    用来隔离主机名(hostname)和域名解析(NIS 域名)。UTS :UNIX Time-sharing System。 每个容器可以通过–hostname设置独立的主机名,容器内执行hostname命令看到的是自己的主机名,而非宿主机的主机名。 容器的/etc/hostname文件也与宿主机独立。
  • IPC Namespace(进程间通信)
    用来隔离进程间通信资源(如消息队列、共享内存、信号量)。 容器内进程只能与同一容器内的其他进程通过 IPC 通信(如msgget创建消息队列),无法访问宿主机或其他容器的 IPC 资源,避免进程间通信干扰。
  • USER Namespace(用户 ID)
    隔离用户 / 组 ID,允许容器内的root用户(UID 0)映射为宿主机的非 root 用户。 可以提高安全性:即使容器内的进程以root身份运行,其在宿主机上对应的实际用户可能是普通用户(如UID 1000),避免容器内权限泄露影响宿主机。
    (注:部分场景下 Docker 可能默认关闭 USER Namespace,需手动配置启用)

1.3 使用命令查看docker的namespace

$ docker ps 
CONTAINER ID   IMAGE            COMMAND                  CREATED             STATUS                 PORTS                                       NAMES
e1766a145de9   image:xyz        "bash"                   About an hour ago   Up About an hour                                                   reverent_nobel$ docker inspect -f '{{.State.Pid}}' e1766a145de9
472512$ ls -l /proc/472512/ns
total 0
lrwxrwxrwx 1 root root 0 Sep  9 18:27 ipc -> ipc:[4026534957]
lrwxrwxrwx 1 root root 0 Sep  9 18:27 mnt -> mnt:[4026534953]
lrwxrwxrwx 1 root root 0 Sep  9 17:20 net -> net:[4026535130]
lrwxrwxrwx 1 root root 0 Sep  9 18:27 pid -> pid:[4026534969]
lrwxrwxrwx 1 root root 0 Sep  9 18:27 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Sep  9 18:27 uts -> uts:[4026534956]#宿主机上面ps -ef 是可以看到docker里面跑的进程(pid:473767)的
$ ps -ef | grep 472512
root      13713 247726  0 18:31 pts/3    00:00:00 grep --color=auto 472512
root     472512 472491  0 17:20 pts/0    00:00:00 bash
root     473767 472512  3 17:22 pts/0    00:02:11 MyExe -c tmp.xml

二 Linux Cgroup

2.1 Cgroup概念

Linux cgroup(Control Groups,控制组) 是 Linux 内核提供的一种核心资源管理机制,用于 限制、统计和隔离 一组进程对系统资源(如 CPU、内存、IO、网络等)的使用。它是容器技术(如 Docker、Kubernetes)实现资源隔离的核心底层技术之一,也广泛用于服务器运维中对进程资源的精细化管控。

cgroup 的核心目标是对进程组进行 “资源管控”,具体包含三大能力:

  • 资源限制(Resource Limiting)
    限制进程组可使用的资源上限,例如:
    CPU:限制进程组的 CPU 使用率(如最多占用 1 个核心、50% 单核算力)。
    内存:限制进程组可使用的物理内存 / 交换分区上限(如最多 512MB)。
    块设备 IO:限制进程组对磁盘的读写速率(如读 100MB/s、写 50MB/s)。
    网络:限制进程组的网络带宽(需结合 tc 工具)。
  • 资源统计(Resource Accounting)
    精确统计进程组对资源的实际使用量,例如:
    统计进程组当前使用的 CPU 时间、内存占用量、IO 读写量。
    数据可通过内核暴露的文件接口(如 /sys/fs/cgroup)实时读取,用于监控或计费。
  • 任务控制(Task Control)
    对进程组执行统一的操作,例如:
    暂停 / 恢复进程组(freezer 子系统)。
    终止进程组内的所有进程。

2.2 cgroup 的典型应用场景

  • 容器技术(Docker/Kubernetes)
    容器的 “资源限制”(如 docker run --memory=512M --cpus=0.5)本质就是通过 cgroup 实现的:每个容器对应一个 cgroup,Docker/K8s 自动创建 cgroup 并配置资源规则。
  • 服务器进程管控
    对高资源消耗进程(如数据库、Web 服务)设置资源上限,防止其占用过多资源导致系统崩溃。例如:
    限制 MySQL 进程最多使用 2 个 CPU 核心、4GB 内存。
    限制日志切割进程的 IO 速率,避免影响业务磁盘性能。
  • 多租户资源隔离
    在共享服务器中,通过 cgroup 为不同租户的进程分配独立资源配额(如租户 A 用 20% CPU,租户 B 用 30% CPU),实现资源隔离。

参考资料

【1】https://blog.csdn.net/Dreaming_TI/article/details/144539894 Linux资源隔离机制 — 命名空间(Namespace)详解


文章转载自:

http://yof7z00s.mmtjk.cn
http://XNW7huQN.mmtjk.cn
http://BNhG8mBt.mmtjk.cn
http://ZepPpfoE.mmtjk.cn
http://7BtkQnBu.mmtjk.cn
http://UAENuiYg.mmtjk.cn
http://elp0eBIv.mmtjk.cn
http://6tiZSwMZ.mmtjk.cn
http://Tsil9fBT.mmtjk.cn
http://k9tnj3or.mmtjk.cn
http://i8tICQub.mmtjk.cn
http://gFN4mseZ.mmtjk.cn
http://boQgni3T.mmtjk.cn
http://W7v3H6ez.mmtjk.cn
http://58iWHXn7.mmtjk.cn
http://KLWU8abe.mmtjk.cn
http://I6YYGT38.mmtjk.cn
http://QoA3pzAf.mmtjk.cn
http://nbL0vnS1.mmtjk.cn
http://XrDzrWiT.mmtjk.cn
http://UOkz8Ljn.mmtjk.cn
http://0MToQowR.mmtjk.cn
http://uBzenXBM.mmtjk.cn
http://HhN429tq.mmtjk.cn
http://ZehwASqd.mmtjk.cn
http://X0tOB0Ov.mmtjk.cn
http://iUIQtsEz.mmtjk.cn
http://wUta8mGi.mmtjk.cn
http://LGR1GP2o.mmtjk.cn
http://pziFLgb6.mmtjk.cn
http://www.dtcms.com/a/376200.html

相关文章:

  • 关于Ubuntu的 update造成的内核升级
  • Ubuntu 22.04 安装 ROS 2 Humble 笔记
  • 基于数据挖掘的单纯冠心病与冠心病合并糖尿病的证治规律对比研究
  • LeetCode每日一题,20250910
  • Linux防火墙firewalld
  • JNI初识
  • Linux 系统中高性能 I/O 事件通知机制的核心——`epoll_create` 系统调用
  • UNIX与Linux:五大核心差异解析
  • 大模型评测工程师学习清单与计划
  • 5.后台运行设置和包设计与实现
  • 深度学习入门:打好数学与机器学习基础,迈向AI进阶之路
  • 【AOSP 的分层设计理念与命名规范】
  • Docker 清理完整指南:释放磁盘空间的最佳实践
  • 进程状态(Linux)
  • Linux负载如何判断服务器的压力
  • 【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
  • 第4讲 机器学习基础概念
  • 新加坡服务器连接速度变慢应该做哪些检查
  • Elasticsearch启动失败?5步修复权限问题
  • HR软件选型指南:SaaS还是本地部署好?
  • 基于51单片机简易计算器仿真设计(proteus仿真+程序+嘉立创原理图PCB+设计报告)
  • matlab基本操作和矩阵输入-台大郭彦甫视频
  • Power BI制作指标达成跟踪器
  • 邪修实战系列(3)
  • Mac m系列芯片向日葵打不开 解决方案
  • 【Unity Shader学习笔记】(七)顶点着色器
  • 宋红康 JVM 笔记 Day16|垃圾回收相关概念
  • 信号与系统
  • 第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(5、机甲战士)
  • NW597NW605美光固态闪存NW613NW614