当前位置: 首页 > 科技观察

LXD2.0系列(四):资源控制

时间:2023-03-13 06:11:39 科技观察

这是LXD2.0系列介绍文章的第四篇。LXD入门安装和配置你的第一个LXD容器因为LXD容器管理有很多命令,所以这篇文章会很长。如果您想快速浏览这些相同的命令,可以试试我们的在线演示!可用资源限制LXD提供各种资源限制。其中一些与容器本身有关,例如内存配额、CPU限制和I/O优先级。其他是特定于设备的,例如I/O带宽或磁盘使用限制。与所有LXD配置一样,资源限制可以在容器运行时动态更改。有些可能没有启用,例如,如果设置的内存值小于当前内存使用量,但LXD会尝试设置它并报告失败。所有限制也可以通过配置文件继承,在这种情况下,每个受影响的容器都将受该限制约束。也就是说,如果你在defaultprofile中设置limits.memory=256MB,那么每个使用默认profile(通常是all)的容器的内存限制是256MB。我们不支持资源受限池,其中限制由一组容器共享,因为我们没有通过现有内核API执行此操作的好方法。磁盘这可能是最需要和最明显的要求。只需在容器的文件系统上设置大小限制并在容器上强制执行。LXD确实让你这样做!不幸的是,它比听起来要复杂得多。Linux没有基于路径的配额,大多数文件系统只有基于用户和组的配额,这对容器不是很有用。如果您使用ZFS或btrfs存储后端,这意味着LXD现在只能支持磁盘限制。也可以为LVM实现此功能,但这取决于与其一起使用的文件系统,如果与实时更新结合使用会变得棘手,因为并非所有文件系统都允许在线增长,而且几乎没有收缩。CPU当涉及到CPU限制时,我们支持4种不同的东西:JustgivemeXCPUcores在这种模式下,你让LXD为你选择一组cores,然后上线更多的容器和CPUs/Offline提供负载均衡。容器只能看到这个数量的CPU内核。给我一组特定的CPU内核(例如内核1、3和5)与第一种模式类似,但不会进行负载平衡,无论它们有多忙,您都将被限制在这些内核上。给我20%的处理能力。在这种模式下,你可以看到所有的CPU,但调度器会限制你使用20%的CPU时间,但这只会在负载下发生!所以如果系统不Busy,你的容器就可以愉快的运行。当其他容器开始使用CPU时,它会受到限制。每测200ms,给我50ms(不要超过)这个模式和上一个类似,可以看到所有的CPU,但是这次不管系统多空闲,你都只能使用你限制的时间设置尽可能多的CPU时间。在未过度使用的系统上,这允许您非常巧妙地拆分CPU并确保这些容器的持续性能。也可以将前两个中的一个与后两个中的一个组合,即请求一组CPU,然后进一步限制这些CPU的CPU时间。另外,我们还有一个通用的优先级调整方法,可以告诉调度器在你有负载的情况下,这两个竞争资源的容器谁会赢。内存听起来很简单,给我多少MB的内存就可以了!绝对可以这么简单。我们支持此限制以及基于百分比的请求,例如给我10%的主机内存!我们还支持一些额外的东西。例如,您可以选择在每个容器的基础上打开或关闭交换,如果打开,设置优先级以便您可以选择哪些容器首先将内存交换到磁盘!内存限制默认为“硬”。也就是说,当内存不足时,内核将开始终止您的进程。或者,您可以将强制策略设置为“软”,在这种情况下,只要没有其他进程,您就可以使用尽可能多的内存。一旦其他进程需要该内存,您将无法分配任何内存,直到您低于限制或主机内存再次空闲。网络I/O网络I/O可能是我们能看到的最简单的约束,但相信我,它真的没有那么简单!我们支持两种约束。首先是网络接口的速率限制。您可以为入口和出口设置限制,或者只设置“***”限制并应用于出口和入口。这仅支持“桥接”和“p2p”类型的接口。第二个是全局网络I/O优先级,它仅在您的网络接口变得饱和时使用。块I/O我把最奇怪的放在***中。它对用户来说可能看起来很简单,但在某些情况下它不会按照您期望的方式进行。我们这里支持的和我在NetworkI/O中描述的基本一样。可以直接设置磁盘读写IO的频率和速率,并且有一个全局的块I/O优先级,它会通知I/O调度器哪个更优先。奇怪的是如何以及在何处应用这些限制。不幸的是,我们用来实现这些功能的底层使用了一个完整的块设备。这意味着我们不能为每个路径设置每个分区的I/O限制。这也意味着当使用可以支持映射到给定路径的多个块设备的ZFS或btrfs时(有或没有RAID),我们不知道哪个块设备提供路径。这意味着容器使用的多个磁盘挂载点(绑定挂载或直接挂载)完全有可能来自同一个物理磁盘。这就是限制变得奇怪的地方。为了使限制生效,LXD有逻辑来猜测给定路径对应于哪个块设备,这包括询问ZFS和btrfs工具,甚至可以在文件系统中找到循环挂载的文件时递归地查找它们。这种逻辑虽然不完美,但通常会找到一组应该应用限制的块设备。LXD然后记录并移动到下一个路径。当所有路径都遍历后,真正奇怪的部分就来了。它平均您为相应块设备设置的限制,然后应用这些限制。这意味着您将在容器内“平均”获得正确的速度,但这也意味着您不能对同一物理磁盘中的“/fast”和“/slow”目录应用不同的速度限制。LXD允许你设置这个,但是***,它会给你这两个值的平均值。它是如何工作的?上面的大部分限制都是通过Linux内核的cgroupAPI来实现的,除了网络限制是通过比较老但是不错的“tc”来实现的。LXD会在启动时检测您在内核中启用了哪些cgroup,并且只会应用您的内核支持的限制。如果您缺少某些cgroup,守护进程将输出警告,然后您的init系统将记录该警告。在Ubuntu16.04上,默认情况下启用所有限制,除了交换审计,您需要通过swapaccount=1内核启动参数启用它。应用这些限制上述所有限制都可以直接或使用配置文件应用于容器。可以使用以下方法设置容器范围的限制:lxcconfigsetCONTAINERKEYVALUE或用于配置文件设置:lxcprofilesetPROFILEKEYVALUE指定特定设备时:lxcconfigdevicesetCONTAINERDEVICEKEYVALUE或用于配置文件设置:lxcprofiledevicessetPROFILEDEVICEKEYVALUE可以在此处找到有效配置文件密钥、设备类型和设备密钥的完整列表。CPU要限制使用任意两个CPU核心,可以这样做:lxcconfigsetmy-containerlimits.cpu2要指定特定的CPU核心,例如第二个和第四个:lxcconfigsetmy-containerlimits.cpu1,3在更复杂的情况下,你可以同样设置范围:lxcconfigsetmy-containerlimits.cpu0-3,7-11limit实时生效,可以看下面的例子:stgraber@dakara:~$lxcexeczerotier--cat/proc/cpuinfo|grep^processprocessor:0processor:1processor:2processor:3stgraber@dakara:~$lxcconfigsetzerotierlimits.cpu2stgraber@dakara:~$lxcexeczerotier--cat/proc/cpuinfo|grep^processprocessor:0processor:1请注意,为了避免完全混淆用户空间,lxcfs重新排列/proc中的条目/cpuinfo这样就不会出错了。与LXD中的所有内容一样,这些设置也可以应用于配置文件:stgraber@dakara:~$lxcexecsnappy--cat/proc/cpuinfo|grep^processprocessor:0processor:1processor:2processor:3stgraber@dakara:~$lxcprofilesetdefaultlimits。cpu3stgraber@dakara:~$lxcexecsnappy--cat/proc/cpuinfo|grep^processprocessor:0processor:1processor:2要将容器使用的CPU时间限制为10%,设置CPUallowance:lxcconfigsetmy-containerlimits.cpu.allowance10%或者给它一个固定的CPU时间片:lxcconfigsetmy-containerlimits.cpu.allowance25ms/200ms***,调整容器的CPU优先级为***:lxcconfigsetmy-containerlimits.cpu.priority0memory直接申请内存限制运行以下命令:lxcconfigsetmy-containerlimits.memory256MB(支持后缀为KB、MB、GB、TB、PB、EB)关闭容器的内存交换(默认启用):lxcconfigsetmy-containerlimits.memory.swapfalse告诉内核首先交换指定容器的内存:lxcconfigsetmy-containerlimits.memory.swap.priority0如果不想强制内存限制:lxcconfigsetmy-containerlimits.memory.enforcesoft磁盘和块I/O不同于CPU和内存,磁盘和I/O限制直接应用于e实际在设备上,因此您需要编辑原始设备或阻止特定设备。要设置磁盘限制(需要btrfs或者ZFS):lxcconfigdevicesetmy-containerrootsize20GB比如:stgraber@dakara:~$lxcexeczerotier--df-h/FilesystemSizeUsedAvailUse%Mountedonencrypted/lxd/containers/zerotier179G542M178G1%/stgraber@dakara:~$lxcconfigdevicesetzerotierrootsize20GBstgraber@dakara:~$lxcexeczerotier--df-h/FilesystemSizeUsedAvailUse%Mountedonencrypted/lxd/containers/zerotier20G542M20G3%/要限制速度,你可以:lxcconfigdevicesetmy-containerrootlimits.read30MBlxcconfigdevicesetmy-containerroot.limits.write10MB或者限制IO频率:lxcconfigdevicesetmy-containerrootlimits.read20Iopslxcconfigdevicesetmy-containerrootlimits.write10Iops***Ifyouareonabusysystemwithovercommit,youmightwantto:lxcconfigsetmy-containerlimits.disk.priority10tosettheI/Opriorityofthatcontainerto***.NetworkI/ONetworkI/OisbasicallyequivalenttoblockI/Oaslongasthemechanismisavailable.例如:stgraber@dakara:~$lxcexeczerotier--wgethttp://speedtest.newark.linode.com/100MB-newark.bin-O/dev/null--2016-03-2622:17:34--http://speedtest.newark.linode.com/100MB-newark.binResolvingspeedtest.newark.linode.com(speedtest.newark.linode.com)...50.116.57.237,2600:3c03::4bConnectingtospeedtest.newark.linode.com(speedtest.newark.linode.com)|50.116.57.237|:80...connected.HTTPrequestsent,awaitingresponse...200OKLength:104857600(100M)[application/octet-stream]Savingto:'/dev/null'/dev/null100%[===================>]100.00M58.7MB/sin1.7s2016-03-2622:17:36(58.7MB/s)-'/dev/null'saved[104857600/104857600]stgraber@dakara:~$lxcprofiledevicesetdefaulteth0limits.ingress100Mbitstgraber@dakara:~$lxcprofiledevicesetdefaulteth0limits.egress100Mbitstgraber@dakara:~$lxcexeczerotier--wgethttp://speedtest.newark.linode.com/1.0MB-newark-O/dev/null--2016-03-2622:17:47--http://speedtest.newark.linode.com/100MB-newark.binResolvingspeedtest.newark.linode.com(speedtest.newark.linode.com)...50.116.57.237,2600:3c03::4bConnectingtospeedtest.newark.linode.com(speedtest.newark.linode.com)|50.116.57.237|:80...connected.HTTPrequestsent,等待响应...200OKLength:104857600(100M)[application/octet-stream]保存到:'/dev/null'/dev/null100%[=====================>]100.00M11.4MB/sin8.8s2016-03-2622:17:56(11.4MB/s)-'/dev/null'saved[104857600/104857600]这个是怎么限制千兆速度的连接到只有100Mbit/s!和blockI/O一样,你可以设置一个整体的网络优先级:lxcconfigsetmy-containerlimits.network.priority5获取当前资源使用情况LXDAPI可以导出一些关于当前容器资源使用情况的信息,你可以获取:Memory:Current,Peak,CurrentMemorySwap和PeakMemorySwap磁盘:当前磁盘使用网络:每个接口传输的字节和数据包此外,如果您使用的是非常新的LXD(撰写本文时的git版本),您还可以在lxc信息中获取此信息:stgraber@dakara:~$lxcinfozerotierName:zerotierArchitecture:x86_64Created:2016/02/2020:01UTCStatus:运行类型:persistentProfiles:defaultPid:29258Ips:eth0:inet172.17.0.101eth0:inet62607:f2c0:f00f:2700:216:3eff:feec:65a8eth0:inet6fe80::216:3eff:feec:65a8lo.0.inet1lo:inet6::1lxcbr0:inet10.0.3.1lxcbr0:inet6fe80::f0bd:55ff:feee:97a2zt0:inet29.17.181.59zt0:inet6fd80:56c2:e21c:0:199:9379:e711:b3e1zt0:inet6fe80::ff:79d70:e:5123Resources:Processes:33Diskusage:root:808.07MBMemoryusage:Memory(当前):106.79MBMemory(峰值):195.51MBSwap(当前):124.00kBSwap(峰值):124.00kBNetworkusage:lxcbr0:Bytesreceived:0bytesBytessent:570bytes0zets0:Packetsreztets0:Packetsrezets接收到的字节数:1.10MBBytessent:806bytesPacketsreceived:10957Packetssent:10957eth0:Bytesreceived:99.35MBBytessent:5.88MBPacketsreceived:64481Packetssent:64481lo:Bytesreceived:9.57kBBytessent:9.57kBPacketsr收到:81个数据包发送:81个快照:zerotier/blah(takenat2016/03/0823:55UTC)(无状态)总结LXD团队花了数月的时间反复研究我们使用的语言的局限性,以使其保持简单,同时仍然强大和实用。这些限制的实时应用和通过配置文件的继承使其成为一个非常强大的工具,可以实时管理服务器上的负载,而不会影响正在运行的服务。更多信息LXD的主要网站:https://linuxcontainers.org/lxdLXD的GitHub存储库:https://github.com/lxc/lxdLXD的邮件列表:https://lists.linuxcontainers.orgLXD的IRC频道:#lxcontainersonirc.freenode.net如果你不想在你的机器上安装LXD,你可以在线尝试。