cgroups是一种技术,允许管理员创建资源组并对特定进程能够使用的资源进行限制。不使用cgroups,虚拟容器可能会耗尽资源导致其他进程无法获取到。使用cgroups,管理员能够限制特定容器能够使用的资源。这些限制在主机操作系统上创建,适用于组内的所有虚拟容器。

基于容器的虚拟化称为Linux容器(LXC),它可能是传统hypervisor之外很有效的一个替代选择。然而如果配置不正确,虚拟容器可能会耗尽所有资源、导致其他进程无法获取到资源,对性能造成潜在的影响,比传统的hypervisor不再有任何优势。为避免该问题,管理员可以使用cgroups对进程能够使用的资源进行限制以确保虚拟环境高效运行。

使用cgroups控制Linux容器的计算容量  cgroups Linux容器 第1张

什么是cgroups?

cgroups是一种技术,允许管理员创建资源组并对特定进程能够使用的资源进行限制。不使用cgroups,虚拟容器可能会耗尽资源导致其他进程无法获取到。使用cgroups,管理员能够限制特定容器能够使用的资源。这些限制在主机操作系统上创建,适用于组内的所有虚拟容器。

在LXC中启动容器

创建LXC虚拟容器后,系统会拷贝容器的文件到形成容器的chroot环境。接下来,容器在主机操作系统之上启动,主机操作系统会对容器使用的资源进行控制。当你启动新容器时,Linux为该容器创建了一个cgroup,可限制容器能够使用的资源。

为调整这些资源,管理员能够在cgroup配置文件中对限制进行定义。可以在主机操作系统的文件系统挂载点下访问这些配置文件。例如,SUSE Linux Enterprise Server 11.3的配置文件位于/sys/fs/cgroup目录下。每种资源都有其自己的子目录。你可以修改这些文件来对虚拟容器能够使用的资源进行限制。

  1. cgroupon/sys/fs/cgroup/cpusettypecgroup(rw,noexec,nosuid,nodev,cpuset)
  2. cgroupon/sys/fs/cgroup/cputypecgroup(rw,noexec,nosuid,nodev,cpu)
  3. cgroupon/sys/fs/cgroup/cpuaccttypecgroup(rw,noexec,nosuid,nodev,cpuacct)
  4. cgroupon/sys/fs/cgroup/memorytypecgroup(rw,noexec,nosuid,nodev,memory)
  5. cgroupon/sys/fs/cgroup/devicestypecgroup(rw,noexec,nosuid,nodev,devices)
  6. cgroupon/sys/fs/cgroup/freezertypecgroup(rw,noexec,nosuid,nodev,freezer)
  7. cgroupon/sys/fs/cgroup/net_clstypecgroup(rw,noexec,nosuid,nodev,net_cls)
  8. cgroupon/sys/fs/cgroup/blkiotypecgroup(rw,noexec,nosuid,nodev,blkio)
  9. cgroupon/sys/fs/cgroup/perf_eventtypecgroup(rw,noexec,nosuid,nodev,perf_event)

让我们一起看一下如何修改这些限制。内存访问是通过配置文件/sys/fs/cgroup/memory进行控制的。在遍历该目录时,你将会发现一个名为lxc的子目录,在该目录下会为每个容器创建一个子目录。有两个非常有趣的控制文件:memory.max_usage_in_bytes 和memory.usage_in_bytes。

  1. lin:/sys/fs/cgroup/memory/lxc/sles-lxc1#ls
  2. cgroup.clone_childrenmemory.max_usage_in_bytesmemory.swappiness
  3. cgroup.event_controlmemory.move_charge_at_immigratememory.usage_in_bytes
  4. cgroup.procsmemory.numa_statmemory.use_hierarchy
  5. memory.failcntmemory.oom_controlnotify_on_release
  6. memory.force_emptymemory.soft_limit_in_bytestasks
  7. memory.limit_in_bytesmemory.stat
  8. lin:/sys/fs/cgroup/memory/lxc/sles-lxc1#catmemory.max_usage_in_bytes
  9. 15302656
  10. lin:/sys/fs/cgroup/memory/lxc/sles-lxc1#catmemory.usage_in_bytes
  11. 13897728

在上述列表中你可以看到max_usage_in_bytes参数当前设置为15MB,目前大约使用了14MB。如果你想增加容器可用的内存,你还可以在文件中设置一个新值。例如,如果你想容器有30MB的可用RAM,可以使用命令echo 30605312 > memory.max_usage_in_bytes。

在创建另一个容器时,会生成另一个配置文件。该文件通常在/etc/lxc目录下的一个与容器名相同的子目录下。该容器完整的配置存储在该文件下,包括其cgroup设置。管理员能够限制虚拟容器能够使用的特定资源。例如,你想使内存限制永久生效,那么可以在配置文件的末尾增加一行,为参数lxc.cgroup.memory.max_usage_in_bytes设置一个具体的值。下次你启动虚拟容器时,虚拟容器能够使用的最大内存就由该参数控制了。

除限制特定容器能够使用的资源之外,cgroups还能够限制容器对特定设备的访问。在容器配置文件中可以看到如下示例,显示了设备访问属性。

  1. lxc.cgroup.devices.allow=c5:0rwm
  2. lxc.cgroup.devices.allow=c4:0rw
  3. lxc.cgroup.devices.allow=c4:1rwm
  4. #/dev/{,u}random
  5. lxc.cgroup.devices.allow=c1:9rwm
  6. lxc.cgroup.devices.allow=c1:8rwm
  7. lxc.cgroup.devices.allow=c136:*rwm
  8. lxc.cgroup.devices.allow=c5:2rwm
  9. #rtc
  10. lxc.cgroup.devices.allow=c254:0rwm

管理员能够很轻松地增加以上配置,定义虚拟容器能够访问哪些设备以创建更加安全的环境。

转载请说明出处
知优网 » 使用cgroups控制Linux容器的计算容量

发表评论

您需要后才能发表评论