Docker Namespace & Cgroups

Docker是利用了Linux提供的两个核心技术 Namespace和Cgroups。下面是结构图。

1. Namespaces

Linux 包含多种类型的 namespaces:

  1. PID(进程 ID)Namespace:提供进程 ID 的隔离,允许进程拥有自己的进程树视图。

  2. Network Namespace:提供网络资源的隔离,如网络设备、IP 地址、路由表等。每个网络命名空间都有自己的网络堆栈。

  3. Mount Namespace:提供文件系统挂载点的隔离,允许进程拥有自己的文件系统视图。

  4. UTS(Unix Time-sharing System)Namespace:隔离主机名和 NIS 域名。

  5. IPC(进程间通信)Namespace:提供 System V IPC 和 POSIX 消息队列的隔离。

  6. User Namespace:允许重新映射一系列用户和组 ID,提供命名空间与全局系统之间的映射。

这些命名空间允许创建轻量级和隔离的环境,如容器,在这些环境中,多个进程可以运行而互不干扰,也不会干扰主机系统。许多容器化技术,包括 Docker 和 Kubernetes,使用命名空间提供进程隔离和资源控制。

2. Cgroups

Cgroups 主要用于以下方面:

  1. 资源限制:可以限制控制组中进程可以使用的 CPU、内存、磁盘 I/O 等资源,以防止某些进程占用过多的系统资源。

  2. 优先级控制:可以为不同的控制组设置不同的 CPU、内存等资源的优先级,确保重要进程能够获得足够的资源。

  3. 资源统计:可以收集控制组中进程使用资源的统计信息,用于性能分析和系统优化。

Cgroups 提供了一种有效的方式来管理系统资源,特别是在虚拟化和容器化环境中。容器化平台如 Docker 和 Kubernetes 使用 cgroups 来限制容器的资源使用,确保容器之间互不干扰,并且可以有效地管理和分配系统资源。

设想你有一个非常消耗 CPU 资源的应用,你不希望它使用全部的 CPU 资源,因为这可能会影响到其他的进程。你可以使用 cgroups 来进行资源限制。

步骤如下:

  1. 创建 cgroup:
mkdir /sys/fs/cgroup/cpu/demo

        在这里,我们创建了一个新的 cgroup,名为 "demo",这个 cgroup 对 CPU 资源进行控制。

        2.设置 CPU 限制:

echo 50000 > /sys/fs/cgroup/cpu/demo/cpu.cfs_quota_us

        这里我们限制 "demo" cgroup 的 CPU 使用为 50%。"cpu.cfs_quota_us" 文件定义了这个 cgroup 在 "cpu.cfs_period_us" 时间周期内可以获取的 CPU 时间,单位是微秒。默认情况下 "cpu.cfs_period_us" 是 100000,所以当我们设置 "cpu.cfs_quota_us" 为 50000 时,就相当于限制了 CPU 使用率为 50%。

        3. 添加进程到 cgroup:

echo 12345 > /sys/fs/cgroup/cpu/demo/tasks

在这里,我们将 PID 为 12345 的进程加入到 "demo" cgroup。这样,这个进程就受到了我们之前设置的 CPU 限制。你可以将任意数量的进程添加到 cgroup 中,它们都会受到相同的资源限制。

现在来试试设置一下Memory 限制:

  1. memory.limit_in_bytes:这个文件用来设置 cgroup 可以使用的内存的最大值。你可以向这个文件写入一个数字,表示 cgroup 可以使用的字节数。
    echo 500M > /sys/fs/cgroup/memory/demo/memory.limit_in_bytes

        这个命令将 "demo" cgroup 的内存限制设置为 500M。

        2.memory.memsw.limit_in_bytes:这个文件用来设置 cgroup 可以使用的内存和 swap 的总量。类似地,你可以向这个文件写入一个数字,表示 cgroup 可以使用的字节数。

echo 1G > /sys/fs/cgroup/memory/demo/memory.memsw.limit_in_bytes

        这个命令将 "demo" cgroup 的内存和 swap 的总量限制设置为 1G。

        3.memory.usage_in_bytes:这个文件提供了 cgroup 当前的内存使用量。你可以读取这个文件来监控 cgroup 的内存使用。

cat /sys/fs/cgroup/memory/demo/memory.usage_in_bytes

        这个命令会打印出 "demo" cgroup 当前的内存使用量。
        4.memory.swappiness:这个文件用来设置 cgroup 的 swap 倾向。数值越大,越倾向于使用 swap。数值范围是 0 到 100。

echo 60 > /sys/fs/cgroup/memory/demo/memory.swappiness

        这个命令设置 "demo" cgroup 的 swap 倾向为 60。
       5. 如何在cgroup中设置对应的pod memory request呢?事实上是对应于 memory 的 "soft limit"(软限制)例如,下面的命令将 "demo" cgroup 的内存软限制设置为 500M:

echo 500M > /sys/fs/cgroup/memory/demo/memory.soft_limit_in_bytes

        这意味着当系统内存紧张时,"demo" cgroup 中的进程将会优先被系统回收内存,直到它的内存使用量降到 500M 以下。但是,如果系统有足够的内存,"demo" cgroup 中的进程可以使用超过 500M 的内存。

        需要注意的是,内存的软限制必须小于或等于硬限制(即 memory.limit_in_bytes)。如果软限制大于硬限制,设置将会失败。另外,硬限制是不能超过的内存使用量,超过硬限制将导致进程被内核杀死以回收内存。

3. Cgroups 与kubernetes resources setting.

在我们的Linux系统里一般会有这样几个关于CPU cgroup文件,默认设置如下:

/sys/fs/cgroup/cpu/kubepods.slice/cpu.shares    8192

/sys/fs/cgroup/cpu/system.slice/cpu.shares   1024

/sys/fs/cgroup/cpu/user.slice/cpu.shares   1024

kubepods.slice、system.slice 和 user.slice 都是 cgroup,它们分别代表 Kubernetes pods、系统进程和用户进程。

  • kubepods.slice 的 cpu.shares 是 8192,这意味着 Kubernetes pods 可以获得的 CPU 时间片的比例是 8192/(8192+1024+1024)。
  • 同理,system.slice 和 user.slice 的 cpu.shares 都是 1024,这意味着系统进程和用户进程可以获得的 CPU 时间片的比例分别是 1024/(8192+1024+1024)。

这些设置确保了在 CPU 资源紧张的情况下,Kubernetes pods、系统进程和用户进程都能得到一定的 CPU 时间片,而且 Kubernetes pods 由于设置的 cpu.shares 更多,所以会获得更多的 CPU 时间片。

关于memory cgroup文件,如下:

/sys/fs/cgroup/memory/kubepods.slice/memory.limit_in_bytes   33185394688  ~30.1G //这个和系统资源相联系。

/sys/fs/cgroup/memory/system.slice/memory.limit_in_bytes  9223372036854771712  ~8192 TB  //这通常是 Linux cgroups 用来表示 "无限制" 的一种方式

/sys/fs/cgroup/memory/user.slice/memory.limit_in_bytes  9223372036854771712  ~8192 TB   //这通常是 Linux cgroups 用来表示 "无限制" 的一种方式

通常情况下,系统进程和用户进程的内存限制会被设置得较高,以允许它们正常运行,而 Kubernetes pods 的内存限制可能会被设置得较低,以防止它们占用过多的系统资源。

需要注意的是,这些设置并不意味着 system.sliceuser.slice 实际上会使用比 kubepods.slice 更多的内存,它们只是上限值,实际的内存使用取决于运行中的进程。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值