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做一下硬盤限制就更好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM