LXC(Linux containers)配置文件简介

LXC配置文件的man page :http://manpages.ubuntu.com/manpages/natty/man5/lxc.conf.5.html

LXC配置项都是以key=value的形式,#开始的一行代码注释。配置也可以在lxc-execute或者lxc-start的命令行以-s key=value设定

这里介绍一下常用的配置:

1.Cgroup部分(所有Cgroup子系统的配置参数均可以通过lxc-cgroup 命令进行动态获得或者调整)

LXC采用Cgroup来对容器进行资源管理,因此Cgroup的各个子系统均可以使用。实际上使用LXC之前,必须执行mount none -t cgroup /cgroup 挂载cgroup,或者采用echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab让系统每次启动自动挂载Cgroup。这样以来Cgroup的所有子系统自动挂载到了一个hierarchy,LXC在创建容器的时候就在/ group下创建一个子group以实现对容器的资源控制,我们就可以根据需要设定相应子系统的参数来达到目的。

Cgroup部分的配置都是以lxc.cgroup.[subsystem name].key=value的形式出现的.例如:lxc.cgroup.cpu.shares=512 lxc.cgroup.cpuset.cpus=1.2

下面介绍下用到的Cgroup的子系统的用法(更多关于Cgroup的介绍,请到RedHat官方文档网上下载)

cpu 子系统调度对 cgroup 的 CPU 访问。可根据以下参数调度对 CPU 资源的访问,每个参数都独立存
在于 cgroup 虚拟文件系统的伪文件中:

cpu.shares
包含用来指定在 cgroup 中的任务可用的相对共享 CPU 时间的整数值。例如:在两个 cgroup 中都
将 cpu.shares 设定为 1 的任务将有相同的 CPU 时间,但在 cgroup 中将 cpu.shares 设定为 2
的任务.

特别说明:根据实验结果以及源代码分析,根目录的shares值默认是1024,同一层次的task和task group平等的接受调度。也就说在根group下有task A 子group B 子group C,如果B的shares值为512,C的shares值为1024,那么task A 和group B 的进程和 group C中的进程CPU份额大致应该是2:1:2。(当然如果task或者group B用不到那么多份额,会自动让给其他task或group)

cpuset 子系统为 cgroup 分配独立 CPU 和内存节点。可根据用以下参数指定每个 cpuset,每个参数
都在控制组群虚拟文件系统中有单独的伪文件:

cpuset.cpus(强制)
指定允许这个 cgroup 中任务访问的 CPU。这是一个用逗号分开的列表,格式为 ASCII,使用小横
线("-")代表范围,例如:cpuset.cpus=1,2-4

特别说明:单线程程序即使分配多个核心也只会用一个,对于有fork调用的程序,系统会做SMP均衡,但是所有进程仍然在限定的CPU上运行。

cpuset.mems(强制)
指定允许这个 cgroup 中任务可访问的内存节点。这是一个用逗号分开的列表,格式为 ASCII,使
用小横线("-")代表范围,例如:cpuset.mems=1,3-5

特别说明:此选项在SMP架构的机器不需要设置,机器只有一个内存节点。主要针对NUMA的机器使用

memory 子系统自动生成 cgroup 中任务使用的内存资源报告,并设定由那些任务使用的内存限制:

memory.limit_in_bytes
设定用户内存的最大量(包括文件缓存)。如果没有指定单位,则将该数值理解为字节。

特别说明:在有swap空间的机器上单独设置这个选项,malloc超过限制值,程序仍然能够可以运行,原因在于程序将内存的数据交换到了swap空间,不会超限。可以使用/sbin/swapoff关掉swap空间(不推荐)

memory.memsw.limit_in_bytes
设定最大内存与 swap 用量之和。如果没有指定单位,则将该值解读为字节。

特别说明:设置这个选项之前,必须设定memory.limit_in_bytes,且memory.limit_in_bytes必须小于或等于此选项的值。在有swap空间的机器上,设置了这个选项,可以严格控制程序对内存的使用,只要malloc超过这个值,就会被系统kill掉

 blkio子系统

块 I/O(blkio)子系统控制并监控 cgroup 中的任务对块设备的 I/O 访问。在部分这样的伪文件中写入值可限制访问或者带宽,且从这些伪文件中读取值可提供 I/O 操作信息

blkio.weight
指定 cgroup 默认可用访问块 I/O 的相对比例(加权),范围在 100 到 1000。这个值可由具体设备的 blkio.weight_device 参数覆盖。此数值跟cpu.share类似,以访问时间的比例的形式起作用。默认根group的值为1000.如果再根下面建立两group,分别设置weight为500和1000,那么IO时间比值为1:2.更多的说明可以参考内核文档。

 blkio.weight_device
指定对 cgroup 中可用的具体设备 I/O 访问的相对比例(加权),范围是 100 到 1000。这个值的格式为major:minor weight,其中 major 和
minor 是在《Linux 分配的设备》中指定的设备类型和节点数,我们也称之为 Linux 设备列表,您
可以参考 http://www.kernel.org/doc/Documentation/devices.txt

blkio.throttle.read_bps_device

针对特定的 major:minor 设备的读bps的上限限制(bps指byte per second,即每秒的byte数)

blkio.throttle.write_bps_device

针对特定的 major:minor 设备的写bps的上限限制

 blkio.throttle.read_iops_device

针对特定的 major:minor 设备的读ios的上限限制(ios指io per second,即每秒的io次数)

blkio.throttle.write_iops_device

针对特定的 major:minor 设备的写ios的上限限制

此四个参数可以同blkio.weight blkio.weight_device以前使用,系统将同时满足着些限制。

2.network部分

network部分的配置均以lxc.network开头.

lxc.network.type指定用于容器的网络类型

empty:新的网络空间会为容器建立,但是没有任何网络接口

veth:新的网络空间会为容器建立,容器将链接到lxc.network.link定义的网桥上,从而与外部通信。网桥必须在预先建立。

macvlan:新的网络空间会为容器建立,一个macvlan的接口会链接到lxc.network.link上。

phys:新的网络空间会被建立,然后lxc.network.link指定的物理接口会被分配给容器

lxc.network.flags用于指定网络的状态

up:网络处于可用状态

lxc.network.link用于指定用于和容器接口通信的真实接口,比如一个网桥br0

lxc.network.name用于指定容器的网络接口的名字,与宿主接口不在一个命名空间。如果不指定,lxc为自动分配一个

lxc.network.hwaddr用于指定容器的网络接口的mac地址

lxc.network.ipv4用于指定容器的网络接口的ipv4地址,如果不设置或者设为0.0.0.0则表示,容器将通过dhcp的方式获得ip地址

lxc.network.ipv6用于指定容器的网络接口的ipv6地址

3.rootfs部分

lxc.rootfs用于指定容器的虚拟根目录,设定此项以后,容器内所有进程将会把此目录根目录,不能访问此目录之外的路径,相当于chroot的效果

 

PS:用这几个部分已经可以配一个比较完整的应用容器了,提供了cpu memory IO资源控制,提供单独的网络、根目录空间,再结合Loop文件或者LVM做一下硬盘限制就更好了。

posted on 2012-04-16 09:43  lisperl  阅读(18891)  评论(5编辑  收藏  举报