lxd2.0系列:资源控制

求知 求知     2022-08-20     774

关键词:

LXD 提供了各种资源限制。其中一些与容器本身相关,如内存配额、CPU 限制和 I/O 优先级。而另外一些则与特定设备相关,如 I/O 带宽或磁盘用量限制。-- Stéphane Graber

 

本文导航

  • -可用资源限制03%

    • -磁盘08%

    • -CPU12%

    • -内存21%

    • -网络 I/O26%

    • -块 I/O29%

  • -它怎么工作?39%

  • -应用这些限制43%

    • -CPU47%

    • -内存58%

    • -磁盘和块 I/O63%

    • -网络 I/O71%

  • -获取当前资源使用率81%

  • -总结92%

  • -更多信息94%

 

编译自: https://www.stgraber.org/2016/03/26/lxd-2-0-resource-control-412/ 
作者: Stéphane Graber
译者: geekpi

 

这是 LXD 2.0 系列介绍文章的第四篇。

  1. LXD 入门[1]

  2. 安装与配置[2]

  3. 你的第一个 LXD 容器[3]

因为 LXD 容器管理有很多命令,因此这篇文章会很长。 如果你想要快速地浏览这些相同的命令,你可以尝试下我们的在线演示[4]!

可用资源限制

LXD 提供了各种资源限制。其中一些与容器本身相关,如内存配额、CPU 限制和 I/O 优先级。而另外一些则与特定设备相关,如 I/O 带宽或磁盘用量限制。

与所有 LXD 配置一样,资源限制可以在容器运行时动态更改。某些可能无法启用,例如,如果设置的内存值小于当前内存用量,但 LXD 将会试着设置并且报告失败。

所有的限制也可以通过配置文件继承,在这种情况下每个受影响的容器将受到该限制的约束。也就是说,如果在默认配置文件中设置 limits.memory=256MB,则使用默认配置文件(通常是全都使用)的每个容器的内存限制为 256MB。

我们不支持资源限制池,将其中的限制由一组容器共享,因为我们没有什么好的方法通过现有的内核 API 实现这些功能。

磁盘

这或许是最需要和最明显的需求。只需设置容器文件系统的大小限制,并对容器强制执行。

LXD 确实可以让你这样做!

不幸的是,这比它听起来复杂得多。 Linux 没有基于路径的配额,而大多数文件系统只有基于用户和组的配额,这对容器没有什么用处。

如果你正在使用 ZFS 或 btrfs 存储后端,这意味着现在 LXD 只能支持磁盘限制。也有可能为 LVM 实现此功能,但这取决于与它一起使用的文件系统,并且如果结合实时更新那会变得棘手起来,因为并不是所有的文件系统都允许在线增长,而几乎没有一个允许在线收缩。

CPU

当涉及到 CPU 的限制,我们支持 4 种不同的东西:

  • 只给我 X 个 CPU 核心

    在这种模式下,你让 LXD 为你选择一组核心,然后为更多的容器和 CPU 的上线/下线提供负载均衡。

    容器只看到这个数量的 CPU 核心。

  • 给我一组特定的 CPU 核心(例如,核心1、3 和 5)

    类似于第一种模式,但是不会做负载均衡,你会被限制在那些核心上,无论它们有多忙。

  • 给我你拥有的 20% 处理能力

    在这种模式下,你可以看到所有的 CPU,但调度程序将限制你使用 20% 的 CPU 时间,但这只有在负载状态才会这样!所以如果系统不忙,你的容器可以跑得很欢。而当其他的容器也开始使用 CPU 时,它会被限制用量。

  • 每测量 200ms,给我 50ms(并且不超过)

    此模式与上一个模式类似,你可以看到所有的 CPU,但这一次,无论系统可能是多么空闲,你只能使用你设置的极限时间下的尽可能多的 CPU 时间。在没有过量使用的系统上,这可使你可以非常整齐地分割 CPU,并确保这些容器的持续性能。

另外还可以将前两个中的一个与最后两个之一相结合,即请求一组 CPU,然后进一步限制这些 CPU 的 CPU 时间。

除此之外,我们还有一个通用的优先级调节方式,可以告诉调度器当你处于负载状态时,两个争夺资源的容器谁会取得胜利。

内存

内存听起来很简单,就是给我多少 MB 的内存!

它绝对可以那么简单。 我们支持这种限制以及基于百分比的请求,比如给我 10% 的主机内存!

另外我们在上层支持一些额外的东西。 例如,你可以选择在每个容器上打开或者关闭 swap,如果打开,还可以设置优先级,以便你可以选择哪些容器先将内存交换到磁盘!

内存限制默认是“hard”。 也就是说,当内存耗尽时,内核将会开始杀掉你的那些进程。

或者,你可以将强制策略设置为“soft”,在这种情况下,只要没有别的进程的情况下,你将被允许使用尽可能多的内存。一旦别的进程想要这块内存,你将无法分配任何内存,直到你低于你的限制或者主机内存再次有空余。

网络 I/O

网络 I/O 可能是我们看起来最简单的限制,但是相信我,实现真的不简单!

我们支持两种限制。 第一个是对网络接口的速率限制。你可以设置入口和出口的限制,或者只是设置“最大”限制然后应用到出口和入口。这个只支持“桥接”和“p2p”类型接口。

第二种是全局网络 I/O 优先级,仅当你的网络接口趋于饱和的时候再使用。

块 I/O

我把最古怪的放在最后。对于用户看起来它可能简单,但有一些情况下,它的结果并不会和你的预期一样。

我们在这里支持的基本上与我在网络 I/O 中描述的相同。

你可以直接设置磁盘的读写 IO 的频率和速率,并且有一个全局的块 I/O 优先级,它会通知 I/O 调度程序更倾向哪个。

古怪的是如何设置以及在哪里应用这些限制。不幸的是,我们用于实现这些功能的底层使用的是完整的块设备。这意味着我们不能为每个路径设置每个分区的 I/O 限制。

这也意味着当使用可以支持多个块设备映射到指定的路径(带或者不带 RAID)的 ZFS 或 btrfs 时,我们并不知道这个路径是哪个块设备提供的。

这意味着,完全有可能,实际上确实有可能,容器使用的多个磁盘挂载点(绑定挂载或直接挂载)可能来自于同一个物理磁盘。

这就使限制变得很奇怪。为了使限制生效,LXD 具有猜测给定路径所对应块设备的逻辑,这其中包括询问 ZFS 和 btrfs 工具,甚至可以在发现一个文件系统中循环挂载的文件时递归地找出它们。

这个逻辑虽然不完美,但通常会找到一组应该应用限制的块设备。LXD 接着记录并移动到下一个路径。当遍历完所有的路径,然后到了非常奇怪的部分。它会平均你为相应块设备设置的限制,然后应用这些。

这意味着你将在容器中“平均”地获得正确的速度,但这也意味着你不能对来自同一个物理磁盘的“/fast”和一个“/slow”目录应用不同的速度限制。 LXD 允许你设置它,但最后,它会给你这两个值的平均值。

它怎么工作?

除了网络限制是通过较旧但是良好的“tc”实现的,上述大多数限制是通过 Linux 内核的 cgroup API 来实现的。

LXD 在启动时会检测你在内核中启用了哪些 cgroup,并且将只应用你的内核支持的限制。如果你缺少一些 cgroup,守护进程会输出警告,接着你的 init 系统将会记录这些。

在 Ubuntu 16.04 上,默认情况下除了内存交换审计外将会启用所有限制,内存交换审计需要你通过swapaccount = 1这个内核引导参数来启用。

应用这些限制

上述所有限制都能够直接或者用某个配置文件应用于容器。容器范围的限制可以使用:

  1. lxc config set CONTAINER KEY VALUE

或对于配置文件设置:

  1. lxc profile set PROFILE KEY VALUE

当指定特定设备时:

  1. lxc config device set CONTAINER DEVICE KEY VALUE

或对于配置文件设置:

  1. lxc profile device set PROFILE DEVICE KEY VALUE

有效配置键、设备类型和设备键的完整列表可以看这里[5]。

CPU

要限制使用任意两个 CPU 核心可以这么做:

  1. lxc config set my-container limits.cpu 2

要指定特定的 CPU 核心,比如说第二和第四个:

  1. lxc config set my-container limits.cpu 1,3

更加复杂的情况还可以设置范围:

  1. lxc config set my-container limits.cpu 0-3,7-11

限制实时生效,你可以看下面的例子:

  1. [email protected]:~$ lxc exec zerotier -- cat /proc/cpuinfo | grep ^proces

  2. processor : 0

  3. processor : 1

  4. processor : 2

  5. processor : 3

  6. [email protected]:~$ lxc config set zerotier limits.cpu 2

  7. [email protected]:~$ lxc exec zerotier -- cat /proc/cpuinfo | grep ^proces

  8. processor : 0

  9. processor : 1

注意,为了避免完全混淆用户空间,lxcfs 会重排 /proc/cpuinfo 中的条目,以便没有错误。

就像 LXD 中的一切,这些设置也可以应用在配置文件中:

  1. [email protected]:~$ lxc exec snappy -- cat /proc/cpuinfo | grep ^proces

  2. processor : 0

  3. processor : 1

  4. processor : 2

  5. processor : 3

  6. [email protected]:~$ lxc profile set default limits.cpu 3

  7. [email protected]:~$ lxc exec snappy -- cat /proc/cpuinfo | grep ^proces

  8. processor : 0

  9. processor : 1

  10. processor : 2

要限制容器使用 10% 的 CPU 时间,要设置下 CPU allowance:

  1. lxc config set my-container limits.cpu.allowance 10%

或者给它一个固定的 CPU 时间切片:

  1. lxc config set my-container limits.cpu.allowance 25ms/200ms

最后,要将容器的 CPU 优先级调到最低:

  1. lxc config set my-container limits.cpu.priority 0

内存

要直接应用内存限制运行下面的命令:

  1. lxc config set my-container limits.memory 256MB

(支持的后缀是 KB、MB、GB、TB、PB、EB)

要关闭容器的内存交换(默认启用):

  1. lxc config set my-container limits.memory.swap false

告诉内核首先交换指定容器的内存:

  1. lxc config set my-container limits.memory.swap.priority 0

如果你不想要强制的内存限制:

  1. lxc config set my-container limits.memory.enforce soft

磁盘和块 I/O

不像 CPU 和内存,磁盘和 I/O 限制是直接作用在实际的设备上的,因此你需要编辑原始设备或者屏蔽某个具体的设备。

要设置磁盘限制(需要 btrfs 或者 ZFS):

  1. lxc config device set my-container root size 20GB

比如:

  1. [email protected]:~$ lxc exec zerotier -- df -h /

  2. Filesystem                        Size Used Avail Use% Mounted on

  3. encrypted/lxd/containers/zerotier 179G 542M  178G   1% /

  4. [email protected]:~$ lxc config device set zerotier root size 20GB

  5. [email protected]:~$ lxc exec zerotier -- df -h /

  6. Filesystem                       Size  Used Avail Use% Mounted on

  7. encrypted/lxd/containers/zerotier 20G  542M   20G   3% /

要限制速度,你可以:

  1. lxc config device set my-container root limits.read 30MB

  2. lxc config device set my-container root.limits.write 10MB

或者限制 IO 频率:

  1. lxc config device set my-container root limits.read 20Iops

  2. lxc config device set my-container root limits.write 10Iops

最后你在一个过量使用的繁忙系统上,你或许想要:

  1. lxc config set my-container limits.disk.priority 10

将那个容器的 I/O 优先级调到最高。

网络 I/O

只要机制可用,网络 I/O 基本等同于块 I/O。

比如:

  1. [email protected]:~$ lxc exec zerotier -- wget http://speedtest.newark.linode.com/100MB-newark.bin -O /dev/null

  2. --2016-03-26 22:17:34-- http://speedtest.newark.linode.com/100MB-newark.bin

  3. Resolving speedtest.newark.linode.com (speedtest.newark.linode.com)... 50.116.57.237, 2600:3c03::4b

  4. Connecting to speedtest.newark.linode.com (speedtest.newark.linode.com)|50.116.57.237|:80... connected.

  5. HTTP request sent, awaiting response... 200 OK

  6. Length: 104857600 (100M) [application/octet-stream]

  7. Saving to: ‘/dev/null‘

  8.  

  9. /dev/null 100%[===================>] 100.00M 58.7MB/s in 1.7s

  10.  

  11. 2016-03-26 22:17:36 (58.7 MB/s) - ‘/dev/null‘ saved [104857600/104857600]

  12.  

  13. [email protected]:~$ lxc profile device set default eth0 limits.ingress 100Mbit

  14. stgr[email protected]:~$ lxc profile device set default eth0 limits.egress 100Mbit

  15. [email protected]:~$ lxc exec zerotier -- wget http://speedtest.newark.linode.com/100MB-newark.bin -O /dev/null

  16. --2016-03-26 22:17:47-- http://speedtest.newark.linode.com/100MB-newark.bin

  17. Resolving speedtest.newark.linode.com (speedtest.newark.linode.com)... 50.116.57.237, 2600:3c03::4b

  18. Connecting to speedtest.newark.linode.com (speedtest.newark.linode.com)|50.116.57.237|:80... connected.

  19. HTTP request sent, awaiting response... 200 OK

  20. Length: 104857600 (100M) [application/octet-stream]

  21. Saving to: ‘/dev/null‘

  22.  

  23. /dev/null 100%[===================>] 100.00M 11.4MB/s in 8.8s

  24.  

  25. 2016-03-26 22:17:56 (11.4 MB/s) - ‘/dev/null‘ saved [104857600/104857600]

这就是如何将一个千兆网的连接速度限制到仅仅 100Mbit/s 的!

和块 I/O 一样,你可以设置一个总体的网络优先级:

  1. lxc config set my-container limits.network.priority 5

获取当前资源使用率

LXD API[6] 可以导出目前容器资源使用情况的一点信息,你可以得到:

  • 内存:当前、峰值、目前内存交换和峰值内存交换

  • 磁盘:当前磁盘使用率

  • 网络:每个接口传输的字节和包数。

另外如果你使用的是非常新的 LXD(在写这篇文章时的 git 版本),你还可以在lxc info中得到这些信息:

  1. [email protected]:~$ lxc info zerotier

  2. Name: zerotier

  3. Architecture: x86_64

  4. Created: 2016/02/20 20:01 UTC

  5. Status: Running

  6. Type: persistent

  7. Profiles: default

  8. Pid: 29258

  9. Ips:

  10. eth0: inet 172.17.0.101

  11. eth0: inet6 2607:f2c0:f00f:2700:216:3eff:feec:65a8

  12. eth0: inet6 fe80::216:3eff:feec:65a8

  13. lo: inet 127.0.0.1

  14. lo: inet6 ::1

  15. lxcbr0: inet 10.0.3.1

  16. lxcbr0: inet6 fe80::f0bd:55ff:feee:97a2

  17. zt0: inet 29.17.181.59

  18. zt0: inet6 fd80:56c2:e21c:0:199:9379:e711:b3e1

  19. zt0: inet6 fe80::79:e7ff:fe0d:5123

  20. Resources:

  21. Processes: 33

  22. Disk usage:

  23.  root: 808.07MB

  24. Memory usage:

  25.  Memory (current): 106.79MB

  26.  Memory (peak): 195.51MB

  27.  Swap (current): 124.00kB

  28.  Swap (peak): 124.00kB

  29. Network usage:

  30.  lxcbr0:

  31.   Bytes received: 0 bytes

  32.   Bytes sent: 570 bytes

  33.   Packets received: 0

  34.   Packets sent: 0

  35.  zt0:

  36.   Bytes received: 1.10MB

  37.   Bytes sent: 806 bytes

  38.   Packets received: 10957

  39.   Packets sent: 10957

  40.  eth0:

  41.   Bytes received: 99.35MB

  42.   Bytes sent: 5.88MB

  43.   Packets received: 64481

  44.   Packets sent: 64481

  45.  lo:

  46.   Bytes received: 9.57kB

  47.   Bytes sent: 9.57kB

  48.   Packets received: 81

  49.   Packets sent: 81

  50. Snapshots:

  51. zerotier/blah (taken at 2016/03/08 23:55 UTC) (stateless)

总结

LXD 团队花费了几个月的时间来迭代我们使用的这些限制的语言。 它是为了在保持强大和功能明确的基础上同时保持简单。

实时地应用这些限制和通过配置文件继承,使其成为一种非常强大的工具,可以在不影响正在运行的服务的情况下实时管理服务器上的负载。

更多信息

LXD 的主站在: https://linuxcontainers.org/lxd

LXD 的 GitHub 仓库: https://github.com/lxc/lxd

LXD 的邮件列表: https://lists.linuxcontainers.org

LXD 的 IRC 频道: #lxcontainers on irc.freenode.net

如果你不想在你的机器上安装LXD,你可以在线尝试下[7]。

阅读原文

项目整体管理包含哪些内容和过程?

...二)项目时间管理:是为了确保项目最终的按时完成的一系列管理过程。它包括具体活动界定,活动排序,时间估计,进度安排及时间控制等项工作。(三)项目成本管理:是为了保证完成项目的实际成本、费用不超过预算成本... 查看详情

5g核心网技术基础自学系列|过载控制

...0c;谢谢支持!附上汇总贴:5G核心网技术基础自学系列|汇总_COCOgsta的博客-CSDN博客5GS支持不同机制控制UE向5GS产生的负荷。5GC具有平衡NF上的负载并缩放NF消耗的资源量的机制,这通常足以应付影响5GC 查看详情

java入门系列-21-多线程

什么是线程在操作系统中,一个应用程序的执行实例就是进程,进程有独立的内存空间和系统资源,在任务管理器中可以看到进程。线程是CPU调度和分派的基本单位,也是进程中执行运算的最小单位,可完成一个独立的顺序控制... 查看详情

cgroup系列六cpuacct子系统(代码片段)

写在前面cpuacctCPUAccountingController子系统会自动生成报告统计控制组所使用的CPU资源。该子系统支持多层嵌套控制组,支持统计当前控制组及其子控制组进程的CPU使用率。挂载子系统命令mount-tcgroup-ocpuacctnone/sys/fs/cgroup/cpuacct在c... 查看详情

docker系列09—docker的系统资源限制及验证

1、限制容器的资源  默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源。Docker提供了控制容器可以使用多少内存或CPU的方法,设置dockerrun命令的运行时配置标志。本篇提供有关何时应设... 查看详情

网络协议系列九-传输层-tcp之流量控制和拥塞控制(代码片段)

如果接收方的缓存区满了,发送方还在疯狂发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大浪费网络资源,所以要进行流量控制。一、流量控制流量控制:让发送方的发送速率不要太快,让... 查看详情

程序员资源系列(不断完善中)

1.程序员读书资源网址:  1)红黑联盟的读书频道 2.PHP资源系列:  1)PHP100中文网  2)第一PHP社区 3.时间管理系列:  1)GTD 4.娱乐学习系列:  1)在线读书 查看详情

程序员资源系列(不断完善中)

...读书资源网址:  1)红黑联盟的读书频道 2.PHP资源系列:  1)PHP100中文网  2)第一PHP社区  3)【好】资源汇总-好  4)伯乐在线 3.时间管理系列:  1)GTD 4.娱乐学习系列:  1)在线读书  2)fireFo... 查看详情

微服务-springcloud学习系列:熔断保护sentinel

Sentinel支持信号量隔离(不支持线程池隔离),多种熔断降级策略,支持QPS流量控制。Sentinel是Hystrix的替代方案。Sentinel的核心概念:资源,规则,检验规则是否生效。1.Sentinel的使用①安装管理控制台(去官网下载对应的jar包,... 查看详情

浏览器devtools系列

...了解浏览器,一个网页的优化.根据谷歌官方的文档整理一系列关devtool的解释,并尝试介绍其应用场景设备模式可以使用设备模式构建完全响应式,移动有限的网络元素面板使用元素面板可以自由的操作DOM和CSS来迭代布局和设计也页... 查看详情

hexo瞎折腾系列-使用hexo-neat插件压缩页面静态资源(代码片段)

为什么要压缩页面静态资源对于个人博客来说,优化页面的访问速度是很有必要的,如果打开你的个人站点,加载个首页就要十几秒,页面长时间处于空白状态,想必没什么人能够忍受得了吧。我个人觉得,如果能把页面的加载... 查看详情

iosphotokit教程

...,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)PHFetchResult:表示一系列的资源结果集合,也可以是相册的集合,从?PHCollection... 查看详情

selinux系列(十六)—三种策略模式详解targetedmls和minimum

对于SELinux来说,所选择的策略类型直接决定了使用哪种策略规则来执行主体(进程)可以访问的目标(文件或目录资源)。不仅如此,策略类型还决定需要哪些特定的安全上下文属性。通过策略类型,读者可以更精确地了解SELin... 查看详情

springboot系列web静态资源配置详解(代码片段)

Springboot系列(四)web静态资源配置往期精彩SpringBoot系列(一)idea新建Springboot项目SpringBoot系列(二)入门知识SpringBoot系列(三)配置文件详解完整版引言:SpringBootweb项目开发中往往会涉及到一些静态资源的使用,比如说图片... 查看详情

deepstream系列之有用资源汇总

点击查看系列文章目录0背景在学习deepstream的过程中,看到很多有价值的文档,包括官网的介绍,本文汇总一下我接触到的一些有价值资源,供大家一起学习1网站类(1)deepstream官网DeepStream入门|NVIDIADeveloper(2)deepstreamapi接口&nb... 查看详情

deepstream系列之有用资源汇总

点击查看系列文章目录0背景在学习deepstream的过程中,看到很多有价值的文档,包括官网的介绍,本文汇总一下我接触到的一些有价值资源,供大家一起学习1网站类(1)deepstream官网DeepStream入门|NVIDIADeveloper(2)deepstreamapi接口&nb... 查看详情

springboot干货系列:静态资源和拦截器处理

SpringBoot干货系列:(六)静态资源和拦截器处理原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂前言本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter。正文前面章节我们也有简单介绍过SpringBoot... 查看详情

struts2官方中文教程系列七:消息资源文件

...。 贴个本帖的地址,以免被爬:struts2官方中文教程系列七:消息资源文件 即 http://www.cnblogs 查看详情