Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

资​​​源​​​管​​​理​​​指​​​南​​​

红​​​帽​​​企​​​业​​​版​​​ Linux 6

在​​​ Red Hat Enterprise Linux 6 中​​​管​​​理​​​系​​​统​​​

版 1

Martin Prpič

红​​​帽​​​ 工​​​程​​​内​​​容​​​服​​​务​​​

Rüdiger Landmann

红​​​帽​​​ 工​​​程​​​内​​​容​​​服​​​务​​​

Douglas Silas

红​​​帽​​​ 工​​​程​​​内​​​容​​​服​​​务​​​

摘要

在​​​ Red Hat Enterprise Linux 6 中​​​管​​​理​​​系​​​统​​​

第 1 章 控​​​制​​​组​​​群​​​(Cgroup)简​​​介​​​

Red Hat Enterprise Linux 6 提​​​供​​​新​​​的​​​内​​​核​​​功​​​能​​​:控​​​制​​​族​​​群​​​(control group),本​​​手​​​册​​​中​​​使​​​用​​​其​​​简​​​称​​​ cgroup。​​​Cgroup 可​​​让​​​您​​​为​​​系​​​统​​​中​​​所​​​运​​​行​​​任​​​务​​​(进​​​程​​​)的​​​用​​​户​​​定​​​义​​​组​​​群​​​分​​​配​​​资​​​源​​​ -- 比​​​如​​​ CPU 时​​​间​​​、​​​系​​​统​​​内​​​存​​​、​​​网​​​络​​​带​​​宽​​​或​​​者​​​这​​​些​​​资​​​源​​​的​​​组​​​合​​​。​​​您​​​可​​​以​​​监​​​控​​​您​​​配​​​置​​​的​​​ cgroup,拒​​​绝​​​ cgroup 访​​​问​​​某​​​些​​​资​​​源​​​,甚​​​至​​​在​​​运​​​行​​​的​​​系​​​统​​​中​​​动​​​态​​​配​​​置​​​您​​​的​​​ cgroup。​​​可​​​将​​​ cgconfig控​​​制​​​组​​​群​​​配​​​置​​​ )服​​​务​​​配​​​置​​​为​​​在​​​引​​​导​​​时​​​启​​​动​​​,并​​​重​​​新​​​建​​​立​​​您​​​预​​​先​​​定​​​义​​​的​​​ cgroup,这​​​样​​​可​​​使​​​其​​​在​​​重​​​启​​​过​​​程​​​中​​​保​​​留​​​它​​​们​​​。​​​
使​​​用​​​ cgroup,系​​​统​​​管​​​理​​​员​​​可​​​更​​​具​​​体​​​地​​​控​​​制​​​对​​​系​​​统​​​资​​​源​​​的​​​分​​​配​​​、​​​优​​​先​​​顺​​​序​​​、​​​拒​​​绝​​​、​​​管​​​理​​​和​​​监​​​控​​​。​​​可​​​更​​​好​​​地​​​根​​​据​​​任​​​务​​​和​​​用​​​户​​​分​​​配​​​硬​​​件​​​资​​​源​​​,提​​​高​​​总​​​体​​​效​​​率​​​。​​​

1.1. 如​​​何​​​管​​​理​​​控​​​制​​​组​​​群​​​

Cgroup 是​​​分​​​层​​​管​​​理​​​的​​​,类​​​似​​​进​​​程​​​,且​​​子​​​ cgroup 会​​​继​​​承​​​其​​​上​​​级​​​ cgroup 的​​​一​​​些​​​属​​​性​​​。​​​但​​​这​​​两​​​个​​​模​​​式​​​也​​​有​​​不​​​同​​​。​​​

Linux 进​​​程​​​模​​​式​​​

Linux 系​​​统​​​中​​​的​​​所​​​有​​​进​​​程​​​都​​​是​​​通​​​用​​​父​​​进​​​程​​​ init 的​​​子​​​进​​​程​​​,该​​​进​​​程​​​在​​​引​​​导​​​时​​​由​​​内​​​核​​​执​​​行​​​并​​​启​​​动​​​其​​​它​​​进​​​程​​​(这​​​些​​​进​​​程​​​会​​​按​​​顺​​​序​​​启​​​动​​​其​​​子​​​进​​​程​​​)。​​​因​​​为​​​所​​​有​​​进​​​程​​​都​​​归​​​结​​​到​​​一​​​个​​​父​​​进​​​程​​​,所​​​以​​​ Linux 进​​​程​​​模​​​式​​​是​​​一​​​个​​​单​​​一​​​层​​​级​​​结​​​构​​​,或​​​者​​​树​​​结​​​构​​​。​​​
另​​​外​​​,init 之​​​外​​​的​​​每​​​个​​​ Linux 进​​​程​​​都​​​会​​​继​​​承​​​其​​​父​​​进​​​程​​​的​​​环​​​境​​​(比​​​如​​​ PATH 变​​​量​​​)[1]和​​​某​​​些​​​属​​​性​​​(比​​​如​​​打​​​开​​​文​​​件​​​描​​​述​​​符​​​)。​​​

Cgroup 模​​​式​​​

Cgroup 与​​​进​​​程​​​在​​​以​​​下​​​方​​​面​​​类​​​似​​​:
  • 它​​​们​​​是​​​分​​​级​​​的​​​,且​​​
  • 子​​​ cgroup 会​​​继​​​承​​​父​​​ cgroup 的​​​某​​​些​​​属​​​性​​​。​​​
根​​​本​​​的​​​不​​​同​​​是​​​在​​​某​​​个​​​系​​​统​​​中​​​可​​​同​​​时​​​存​​​在​​​不​​​同​​​的​​​分​​​级​​​ cgroup。​​​如​​​果​​​ Linux 进​​​程​​​模​​​式​​​是​​​进​​​程​​​的​​​单​​​一​​​树​​​模​​​式​​​,那​​​么​​​ cgroup 模​​​式​​​是​​​一​​​个​​​或​​​者​​​更​​​多​​​任​​​务​​​的​​​独​​​立​​​、​​​未​​​连​​​接​​​树​​​(例​​​如​​​:进​​​程​​​)。​​​
需​​​要​​​多​​​个​​​独​​​立​​​ cgroup 分​​​级​​​,因​​​为​​​每​​​个​​​分​​​级​​​都​​​会​​​附​​​加​​​到​​​一​​​个​​​或​​​者​​​多​​​个​​​子​​​系​​​统​​​中​​​。​​​子​​​系​​​统​​​[2]代​​​表​​​单​​​一​​​资​​​源​​​,比​​​如​​​ CPU 时​​​间​​​或​​​者​​​内​​​存​​​。​​​Red Hat Enterprise Linux 6 提​​​供​​​ 9 个​​​ cgroup 子​​​系​​​统​​​,根​​​据​​​名​​​称​​​和​​​功​​​能​​​列​​​出​​​如​​​下​​​。​​​

Red Hat Enterprise Linux 中​​​的​​​可​​​用​​​子​​​系​​​统​​​

  • blkio -- 这​​​个​​​子​​​系​​​统​​​为​​​块​​​设​​​备​​​设​​​定​​​输​​​入​​​/输​​​出​​​限​​​制​​​,比​​​如​​​物​​​理​​​设​​​备​​​(磁​​​盘​​​,固​​​态​​​硬​​​盘​​​,USB 等​​​等​​​)。​​​
  • cpu -- 这​​​个​​​子​​​系​​​统​​​使​​​用​​​调​​​度​​​程​​​序​​​提​​​供​​​对​​​ CPU 的​​​ cgroup 任​​​务​​​访​​​问​​​。​​​
  • cpuacct -- 这​​​个​​​子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​ CPU 报​​​告​​​。​​​
  • cpuset -- 这​​​个​​​子​​​系​​​统​​​为​​​ cgroup 中​​​的​​​任​​​务​​​分​​​配​​​独​​​立​​​ CPU(在​​​多​​​核​​​系​​​统​​​)和​​​内​​​存​​​节​​​点​​​。​​​
  • devices -- 这​​​个​​​子​​​系​​​统​​​可​​​允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备​​​。​​​
  • freezer -- 这​​​个​​​子​​​系​​​统​​​挂​​​起​​​或​​​者​​​恢​​​复​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
  • memory -- 这​​​个​​​子​​​系​​​统​​​设​​​定​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​,并​​​自​​​动​​​生​​​成​​​由​​​那​​​些​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​资​​​源​​​报​​​告​​​。​​​
  • net_cls -- 这​​​个​​​子​​​系​​​统​​​使​​​用​​​等​​​级​​​识​​​别​​​符​​​(classid)标​​​记​​​网​​​络​​​数​​​据​​​包​​​,可​​​允​​​许​​​ Linux 流​​​量​​​控​​​制​​​程​​​序​​​(tc)识​​​别​​​从​​​具​​​体​​​ cgroup 中​​​生​​​成​​​的​​​数​​​据​​​包​​​。​​​
  • ns -- 名​​​称​​​空​​​间​​​子​​​系​​​统​​​。​​​

注意

您​​​可​​​能​​​在​​​ cgroup 文​​​献​​​,比​​​如​​​ man page 或​​​者​​​内​​​核​​​文​​​档​​​中​​​看​​​到​​​术​​​语​​​资​​​源​​​控​​​制​​​器​​​或​​​者​​​控​​​制​​​器​​​。​​​这​​​两​​​个​​​词​​​与​​​ subsystem(子​​​系​​​统​​​)的​​​含​​​义​​​相​​​同​​​,且​​​基​​​于​​​这​​​样​​​的​​​事​​​实​​​,即​​​子​​​系​​​统​​​通​​​常​​​调​​​度​​​资​​​源​​​或​​​者​​​在​​​其​​​所​​​附​​​属​​​层​​​级​​​的​​​ cgroup 中​​​应​​​用​​​限​​​制​​​。​​​
子​​​系​​​统​​​(资​​​源​​​控​​​制​​​器​​​)的​​​定​​​义​​​非​​​常​​​普​​​通​​​:它​​​是​​​根​​​据​​​一​​​组​​​任​​​务​​​行​​​动​​​的​​​东​​​西​​​,例​​​如​​​进​​​程​​​。​​​

1.2. 子​​​系​​​统​​​、​​​层​​​级​​​、​​​控​​​制​​​组​​​群​​​和​​​任​​​务​​​的​​​关​​​系​​​

请​​​记​​​住​​​ cgroup 术​​​语​​​中​​​系​​​统​​​进​​​程​​​称​​​为​​​任​​​务​​​。​​​
这​​​里​​​有​​​一​​​些​​​简​​​单​​​的​​​规​​​则​​​管​​​理​​​子​​​系​​​统​​​、​​​cgroup 层​​​级​​​以​​​及​​​任​​​务​​​之​​​间​​​的​​​关​​​系​​​,并​​​给​​​出​​​那​​​些​​​规​​​则​​​的​​​合​​​理​​​结​​​果​​​。​​​
规​​​则​​​ 1

任​​​何​​​单​​​一​​​子​​​系​​​统​​​(比​​​如​​​ cpu)最​​​多​​​可​​​附​​​加​​​到​​​一​​​个​​​层​​​级​​​中​​​。​​​

结​​​果​​​是​​​,cpu 子​​​系​​​统​​​永​​​远​​​无​​​法​​​附​​​加​​​到​​​两​​​个​​​不​​​同​​​的​​​层​​​级​​​。​​​
规​​​则​​​ 2

单​​​一​​​层​​​级​​​可​​​附​​​加​​​一​​​个​​​或​​​者​​​多​​​个​​​子​​​系​​​统​​​。​​​

结​​​果​​​是​​​,cpu 和​​​ memroy 子​​​系​​​统​​​(或​​​者​​​任​​​意​​​数​​​目​​​的​​​子​​​系​​​统​​​)都​​​可​​​附​​​加​​​到​​​单​​​一​​​层​​​级​​​中​​​,只​​​要​​​每​​​个​​​子​​​系​​​统​​​不​​​再​​​附​​​加​​​到​​​另​​​一​​​个​​​层​​​级​​​即​​​可​​​。​​​
规​​​则​​​ 3

每​​​次​​​在​​​系​​​统​​​中​​​创​​​建​​​新​​​层​​​级​​​时​​​,该​​​系​​​统​​​中​​​的​​​所​​​有​​​任​​​务​​​都​​​是​​​那​​​个​​​层​​​级​​​的​​​默​​​认​​​ cgroup(我​​​们​​​称​​​之​​​为​​​ root cgroup)的​​​初​​​始​​​成​​​员​​​。​​​对​​​于​​​您​​​创​​​建​​​的​​​任​​​何​​​单​​​一​​​层​​​级​​​,该​​​系​​​统​​​中​​​的​​​每​​​个​​​任​​​务​​​都​​​可​​​以​​​是​​​那​​​个​​​层​​​级​​​中​​​唯​​​一​​​一​​​个​​​ cgroup 的​​​成​​​员​​​。​​​单​​​一​​​任​​​务​​​可​​​以​​​是​​​在​​​多​​​个​​​ cgroup 中​​​,只​​​要​​​每​​​个​​​ cgroup 都​​​在​​​不​​​同​​​的​​​层​​​级​​​中​​​即​​​可​​​。​​​只​​​要​​​某​​​个​​​任​​​务​​​成​​​为​​​同​​​一​​​层​​​级​​​中​​​第​​​二​​​个​​​ cgroup 的​​​成​​​员​​​,就​​​会​​​将​​​其​​​从​​​那​​​个​​​层​​​级​​​的​​​第​​​一​​​个​​​ cgroup 中​​​删​​​除​​​。​​​一​​​个​​​任​​​务​​​永​​​远​​​不​​​会​​​同​​​时​​​位​​​于​​​同​​​一​​​层​​​级​​​的​​​不​​​同​​​ cgroup 中​​​。​​​

结​​​果​​​是​​​,如​​​果​​​ cpu 和​​​ memory 子​​​系​​​统​​​都​​​附​​​加​​​到​​​名​​​为​​​ cpu_and_mem 的​​​层​​​级​​​中​​​,且​​​ net_cls 子​​​系​​​统​​​是​​​附​​​加​​​到​​​名​​​为​​​ net 的​​​层​​​级​​​中​​​,那​​​么​​​运​​​行​​​的​​​ httpd 进​​​程​​​可​​​以​​​是​​​ cpu_and_mem 中​​​任​​​意​​​ cgroup 的​​​成​​​员​​​,同​​​时​​​也​​​是​​​ net 中​​​任​​​意​​​ cgroup 的​​​成​​​员​​​。​​​
httpd 进​​​程​​​所​​​在​​​ cpu_and_mem 中​​​的​​​ cgroup 可​​​将​​​其​​​ CPU 时​​​间​​​限​​​制​​​为​​​分​​​配​​​给​​​其​​​它​​​进​​​程​​​时​​​间​​​的​​​一​​​半​​​,并​​​将​​​其​​​内​​​存​​​用​​​量​​​限​​​制​​​为​​​最​​​多​​​ 1024 MB。​​​另​​​外​​​,net 中​​​的​​​ cgroup 还​​​可​​​将​​​其​​​传​​​输​​​速​​​率​​​限​​​制​​​为​​​ 30 MB/秒​​​。​​​
首​​​次​​​创​​​建​​​层​​​级​​​时​​​,该​​​系​​​统​​​中​​​的​​​每​​​个​​​任​​​务​​​都​​​至​​​少​​​是​​​一​​​个​​​ cgroup 的​​​成​​​员​​​,即​​​ root cgroup。​​​因​​​此​​​每​​​当​​​使​​​用​​​ cgroup 时​​​,每​​​个​​​系​​​统​​​任​​​务​​​总​​​是​​​至​​​少​​​在​​​一​​​个​​​ cgroup 中​​​。​​​
规​​​则​​​ 4

该​​​系​​​统​​​中​​​的​​​任​​​意​​​进​​​程​​​(任​​​务​​​)都​​​将​​​自​​​己​​​分​​​支​​​创​​​建​​​子​​​进​​​程​​​(任​​​务​​​)。​​​该​​​子​​​任​​​务​​​自​​​动​​​成​​​为​​​其​​​父​​​进​​​程​​​所​​​在​​​ cgroup 的​​​成​​​员​​​。​​​然​​​后​​​可​​​根​​​据​​​需​​​要​​​将​​​该​​​子​​​任​​​务​​​移​​​动​​​到​​​不​​​同​​​的​​​ cgroup 中​​​,但​​​开​​​始​​​时​​​它​​​总​​​是​​​继​​​承​​​其​​​父​​​任​​​务​​​的​​​ cgroup(进​​​程​​​术​​​语​​​中​​​称​​​其​​​为​​​“​​​环​​​境​​​”​​​)。​​​

cpu_and_mem 层​​​级​​​中​​​名​​​为​​​ half_cpu_1gb_max 的​​​ cgroup 成​​​员​​​的​​​任​​​务​​​,以​​​及​​​ net 层​​​级​​​中​​​ cgroup trans_rate_30 的​​​成​​​员​​​。​​​当​​​ httpd 进​​​程​​​将​​​其​​​自​​​身​​​分​​​成​​​几​​​个​​​分​​​支​​​时​​​,其​​​子​​​进​​​程​​​会​​​自​​​动​​​成​​​为​​​ half_cpu_1gb_max cgroup 和​​​ trans_rate_30 cgroup 的​​​成​​​员​​​。​​​它​​​会​​​完​​​全​​​继​​​承​​​其​​​父​​​任​​​务​​​所​​​属​​​的​​​同​​​一​​​ cgroup。​​​
此​​​后​​​,父​​​任​​​务​​​和​​​子​​​任​​​务​​​就​​​彼​​​此​​​完​​​全​​​独​​​立​​​:更​​​改​​​某​​​个​​​任​​​务​​​所​​​属​​​ cgroup 不​​​会​​​影​​​响​​​到​​​另​​​一​​​个​​​。​​​同​​​样​​​更​​​改​​​父​​​任​​​务​​​的​​​ cgroup 也​​​不​​​会​​​以​​​任​​​何​​​方​​​式​​​影​​​响​​​其​​​子​​​任​​​务​​​。​​​总​​​之​​​:所​​​有​​​子​​​任​​​务​​​总​​​是​​​可​​​继​​​承​​​其​​​父​​​任​​​务​​​的​​​同​​​一​​​ cgroup 的​​​成​​​员​​​关​​​系​​​,但​​​之​​​后​​​可​​​更​​​改​​​或​​​者​​​删​​​除​​​那​​​些​​​成​​​员​​​关​​​系​​​。​​​

1.3. 资​​​源​​​管​​​理​​​实​​​施​​​

  • 因​​​为​​​某​​​个​​​任​​​务​​​可​​​属​​​于​​​任​​​一​​​层​​​级​​​中​​​的​​​单​​​一​​​ cgroup,所​​​以​​​只​​​有​​​一​​​个​​​方​​​法​​​可​​​让​​​单​​​一​​​子​​​系​​​统​​​限​​​制​​​或​​​者​​​影​​​响​​​任​​​务​​​。​​​这​​​是​​​合​​​理​​​的​​​:是​​​一​​​个​​​功​​​能​​​,而​​​不​​​是​​​限​​​制​​​。​​​
  • 您​​​可​​​以​​​将​​​几​​​个​​​子​​​系​​​统​​​分​​​组​​​在​​​一​​​起​​​以​​​便​​​它​​​们​​​可​​​影​​​响​​​单​​​一​​​层​​​级​​​中​​​的​​​所​​​有​​​任​​​务​​​。​​​因​​​为​​​该​​​层​​​级​​​中​​​的​​​ cgroup 有​​​不​​​同​​​的​​​参​​​数​​​设​​​定​​​,因​​​此​​​会​​​对​​​那​​​些​​​任​​​务​​​产​​​生​​​不​​​同​​​的​​​影​​​响​​​。​​​
  • 有​​​时​​​可​​​能​​​需​​​要​​​重​​​构​​​层​​​级​​​。​​​例​​​如​​​:从​​​附​​​加​​​了​​​几​​​个​​​子​​​系​​​统​​​的​​​层​​​级​​​中​​​删​​​除​​​一​​​个​​​子​​​系​​​统​​​,并​​​将​​​其​​​附​​​加​​​到​​​不​​​同​​​的​​​层​​​级​​​中​​​。​​​
  • 反​​​正​​​,如​​​果​​​从​​​不​​​同​​​层​​​级​​​中​​​分​​​离​​​子​​​系​​​统​​​的​​​需​​​求​​​降​​​低​​​,则​​​您​​​可​​​以​​​删​​​除​​​层​​​级​​​并​​​将​​​其​​​子​​​系​​​统​​​附​​​加​​​到​​​现​​​有​​​层​​​级​​​中​​​。​​​
  • 这​​​个​​​设​​​计​​​允​​​许​​​简​​​单​​​的​​​ cgroup 使​​​用​​​,比​​​如​​​为​​​单​​​一​​​层​​​级​​​中​​​的​​​具​​​体​​​任​​​务​​​设​​​定​​​几​​​个​​​参​​​数​​​,单​​​一​​​层​​​级​​​可​​​以​​​是​​​只​​​附​​​加​​​了​​​ cpu 和​​​ memeory 子​​​系​​​统​​​的​​​层​​​级​​​。​​​
  • 这​​​个​​​设​​​计​​​还​​​允​​​许​​​高​​​精​​​度​​​配​​​置​​​:系​​​统​​​中​​​的​​​每​​​个​​​任​​​务​​​(进​​​程​​​)都​​​可​​​以​​​是​​​每​​​个​​​层​​​级​​​的​​​成​​​员​​​,每​​​个​​​层​​​级​​​都​​​有​​​单​​​一​​​附​​​加​​​的​​​子​​​系​​​统​​​。​​​这​​​样​​​的​​​配​​​置​​​可​​​让​​​系​​​统​​​管​​​理​​​员​​​绝​​​对​​​控​​​制​​​每​​​个​​​单​​​一​​​任​​​务​​​的​​​所​​​有​​​参​​​数​​​。​​​


[1] 父​​​进​​​程​​​可​​​在​​​将​​​环​​​境​​​传​​​递​​​给​​​子​​​进​​​程​​​前​​​更​​​改​​​它​​​。​​​
[2] 您​​​应​​​该​​​了​​​解​​​在​​​ libcgroup man page 和​​​其​​​它​​​文​​​档​​​中​​​,子​​​系​​​统​​​也​​​称​​​资​​​源​​​控​​​制​​​器​​​,或​​​者​​​控​​​制​​​器​​​。​​​

第 2 章 使​​​用​​​控​​​制​​​组​​​群​​​

使​​​用​​​ cgroup 的​​​最​​​简​​​单​​​的​​​方​​​法​​​是​​​安​​​装​​​ libcgroup 软​​​件​​​包​​​,该​​​软​​​件​​​包​​​包​​​含​​​大​​​量​​​与​​​ cgroup 有​​​关​​​的​​​命​​​令​​​行​​​工​​​具​​​及​​​其​​​相​​​关​​​ man page。​​​您​​​可​​​以​​​使​​​用​​​ shell 命​​​令​​​和​​​可​​​在​​​任​​​意​​​系​​​统​​​中​​​使​​​用​​​的​​​工​​​具​​​挂​​​载​​​层​​​级​​​并​​​设​​​定​​​ cgroup 参​​​数​​​(不​​​保​​​留​​​)。​​​但​​​是​​​,使​​​用​​​ libcgroup 提​​​供​​​的​​​工​​​具​​​可​​​简​​​化​​​过​​​程​​​并​​​扩​​​展​​​功​​​能​​​。​​​因​​​此​​​,本​​​指​​​南​​​着​​​重​​​全​​​面​​​介​​​绍​​​ libcgroup 命​​​令​​​。​​​在​​​大​​​多​​​数​​​情​​​况​​​下​​​,我​​​们​​​会​​​将​​​对​​​等​​​的​​​ shell 命​​​令​​​包​​​括​​​在​​​内​​​以​​​便​​​清​​​楚​​​阐​​​述​​​基​​​础​​​机​​​理​​​。​​​我​​​们​​​建​​​议​​​您​​​在​​​可​​​行​​​的​​​情​​​况​​​下​​​尽​​​量​​​使​​​用​​​ libcgroup 命​​​令​​​。​​​

注意

要​​​使​​​用​​​ cgroup,首​​​先​​​请​​​确​​​定​​​在​​​您​​​的​​​系​​​统​​​中​​​安​​​装​​​ libcgroup 软​​​件​​​包​​​,方​​​法​​​为​​​作​​​为​​​ root 运​​​行​​​:
~]# yum install libcgroup

2.1. cgconfig 服​​​务​​​

由​​​ libcgroup 软​​​件​​​包​​​安​​​装​​​的​​​ cgconfig 服​​​务​​​可​​​提​​​供​​​创​​​建​​​层​​​级​​​的​​​方​​​便​​​方​​​法​​​,并​​​在​​​层​​​级​​​中​​​附​​​加​​​子​​​系​​​统​​​,且​​​在​​​那​​​些​​​层​​​级​​​中​​​管​​​理​​​ cgroup。​​​我​​​们​​​建​​​议​​​您​​​使​​​用​​​ cgconfig 在​​​您​​​的​​​系​​​统​​​中​​​管​​​理​​​层​​​级​​​和​​​ cgroup。​​​
红​​​帽​​​企​​​业​​​版​​​ Linux  6 不​​​默​​​认​​​启​​​动​​​ cgconfig 服​​​务​​​。​​​当​​​使​​​用​​​ chkconfig 启​​​动​​​该​​​服​​​务​​​时​​​,它​​​读​​​取​​​ cgroup 配​​​置​​​文​​​件​​​ -- /etc/cgconfig.conf。​​​Cgroup 因​​​此​​​会​​​在​​​不​​​同​​​会​​​话​​​间​​​重​​​新​​​创​​​建​​​并​​​保​​​留​​​。​​​根​​​据​​​配​​​置​​​文​​​件​​​的​​​内​​​容​​​,cgconfig 可​​​创​​​建​​​层​​​级​​​、​​​挂​​​载​​​所​​​需​​​文​​​件​​​系​​​统​​​、​​​创​​​建​​​ cgroup 以​​​及​​​为​​​每​​​个​​​组​​​群​​​设​​​定​​​子​​​系​​​统​​​参​​​数​​​。​​​
libcgroup 软​​​件​​​包​​​默​​​认​​​安​​​装​​​的​​​ /etc/cgconfig.conf 文​​​件​​​为​​​每​​​个​​​子​​​系​​​统​​​创​​​建​​​并​​​挂​​​载​​​独​​​立​​​层​​​级​​​,并​​​在​​​这​​​些​​​层​​​级​​​中​​​附​​​加​​​子​​​系​​​统​​​。​​​
如​​​果​​​您​​​停​​​止​​​ cgconfig 服​​​务​​​(使​​​用​​​ service cgconfig stop 命​​​令​​​),则​​​会​​​卸​​​载​​​它​​​挂​​​载​​​的​​​所​​​有​​​层​​​级​​​。​​​

2.1.1. cgconfig.conf 文​​​件​​​

cgconfig.conf 文​​​件​​​包​​​含​​​两​​​个​​​主​​​要​​​类​​​型​​​的​​​条​​​目​​​ -- mount 和​​​ group。​​​挂​​​载​​​条​​​目​​​生​​​成​​​并​​​挂​​​载​​​层​​​级​​​并​​​将​​​其​​​作​​​为​​​虚​​​拟​​​文​​​件​​​系​​​统​​​,同​​​时​​​将​​​子​​​系​​​统​​​附​​​加​​​到​​​那​​​些​​​层​​​级​​​中​​​。​​​挂​​​载​​​条​​​目​​​使​​​用​​​以​​​下​​​语​​​法​​​定​​​义​​​:
mount {
    <controller> = <path>;
    …
}
示​​​例​​​用​​​法​​​请​​​参​​​考​​​ 例 2.1 “创​​​建​​​挂​​​载​​​条​​​目​​​”。​​​

例 2.1. 创​​​建​​​挂​​​载​​​条​​​目​​​

以​​​下​​​示​​​例​​​为​​​ cpuset 子​​​系​​​统​​​创​​​建​​​层​​​级​​​:
mount {
    cpuset = /cgroup/cpu;
}
对​​​等​​​的​​​ shell 命​​​令​​​:
~]# mkdir /cgroup/cpu
~]# mount -t cgroup -o cpu cpu /cgroup/cpu
组​​​群​​​条​​​目​​​创​​​建​​​ cgroup 并​​​设​​​定​​​子​​​系​​​统​​​参​​​数​​​。​​​组​​​群​​​条​​​目​​​使​​​用​​​以​​​下​​​语​​​法​​​定​​​义​​​:
group <name> {
    [<permissions>]
    <controller> {
        <param name> = <param value>;
        …
    }
    …
}
请​​​注​​​意​​​ permissions 部​​​分​​​是​​​可​​​选​​​的​​​。​​​要​​​为​​​组​​​群​​​条​​​目​​​定​​​义​​​权​​​限​​​,请​​​使​​​用​​​以​​​下​​​语​​​法​​​:
perm {
    task {
        uid = <task user>;
        gid = <task group>;
    }
    admin {
       uid = <admin name>;
       gid = <admin group>;
    }
}
示​​​例​​​用​​​法​​​请​​​参​​​考​​​ 例 2.2 “创​​​建​​​组​​​群​​​条​​​目​​​”

例 2.2. 创​​​建​​​组​​​群​​​条​​​目​​​

以​​​下​​​示​​​例​​​为​​​ sql 守​​​护​​​进​​​程​​​创​​​建​​​ cgroup,可​​​为​​​ sqladmin 组​​​群​​​中​​​的​​​用​​​户​​​在​​​ cgroup 中​​​添​​​加​​​任​​​务​​​,并​​​让​​​ root 用​​​户​​​修​​​改​​​子​​​系​​​统​​​参​​​数​​​:
group daemons/sql {
    perm {
        task {
            uid = root;
            gid = sqladmin;
        } admin {
            uid = root;
            gid = root;
        }
    } cpu {
        cpu.shares = 100;
    }
}
当​​​与​​​ 例 2.1 “创​​​建​​​挂​​​载​​​条​​​目​​​” 中​​​的​​​挂​​​载​​​条​​​目​​​示​​​例​​​合​​​并​​​时​​​,对​​​等​​​的​​​ shell 命​​​令​​​为​​​:
~]# mkdir -p /cgroup/cpu/daemons/sql
~]# chown root:root /cgroup/cpu/daemons/sql/*
~]# chown root:sqladmin /cgroup/cpu/daemons/sql/tasks
~]# echo 100 > /cgroup/cpu/daemons/sql/cpu.shares

注意

您​​​必​​​须​​​重​​​启​​​ cgconfig 服​​​务​​​方​​​可​​​使​​​ /etc/cgconfig.conf 中​​​的​​​更​​​改​​​生​​​效​​​:
~]# service cgconfig restart
当​​​安​​​装​​​ cgroups 软​​​件​​​包​​​时​​​,会​​​在​​​ /etc/cgconfig.conf 中​​​写​​​入​​​示​​​例​​​配​​​置​​​文​​​件​​​。​​​每​​​行​​​开​​​始​​​的​​​ # 符​​​号​​​将​​​该​​​行​​​注​​​释​​​出​​​来​​​以​​​便​​​ cgconfig 服​​​务​​​忽​​​略​​​它​​​。​​​

2.2. 创​​​建​​​层​​​级​​​并​​​附​​​加​​​子​​​系​​​统​​​

警告

以​​​下​​​步​​​骤​​​覆​​​盖​​​从​​​创​​​建​​​新​​​层​​​级​​​到​​​在​​​其​​​中​​​附​​​加​​​子​​​系​​​统​​​到​​​内​​​容​​​,这​​​些​​​步​​​骤​​​假​​​设​​​还​​​没​​​有​​​在​​​您​​​的​​​系​​​统​​​中​​​配​​​置​​​ cgroup。​​​在​​​这​​​种​​​情​​​况​​​下​​​,这​​​些​​​步​​​骤​​​不​​​会​​​影​​​响​​​系​​​统​​​中​​​的​​​操​​​作​​​。​​​更​​​改​​​有​​​任​​​务​​​的​​​ cgroup 中​​​的​​​可​​​调​​​参​​​数​​​可​​​能​​​会​​​马​​​上​​​影​​​响​​​那​​​些​​​任​​​务​​​。​​​本​​​指​​​南​​​提​​​示​​​您​​​它​​​首​​​次​​​演​​​示​​​更​​​改​​​会​​​影​​​响​​​一​​​个​​​或​​​者​​​多​​​个​​​任​​​务​​​的​​​可​​​调​​​ cgroup 参​​​数​​​。​​​
在​​​已​​​经​​​配​​​置​​​了​​​ cgroup 的​​​系​​​统​​​中​​​(可​​​以​​​是​​​手​​​动​​​配​​​置​​​,或​​​者​​​使​​​用​​​ cgconfig 服​​​务​​​配​​​置​​​),这​​​些​​​命​​​令​​​会​​​失​​​败​​​,除​​​非​​​您​​​首​​​先​​​卸​​​载​​​可​​​影​​​响​​​系​​​统​​​操​​​作​​​的​​​现​​​有​​​层​​​级​​​。​​​不​​​要​​​在​​​产​​​品​​​系​​​统​​​中​​​试​​​验​​​这​​​些​​​步​​​骤​​​。​​​
要​​​创​​​建​​​层​​​级​​​并​​​在​​​其​​​中​​​附​​​加​​​子​​​系​​​统​​​,请​​​作​​​为​​​ root 编​​​辑​​​ /etc/cgconfig.conf 文​​​件​​​的​​​ mount 部​​​分​​​。​​​mount 部​​​分​​​的​​​条​​​目​​​有​​​以​​​下​​​格​​​式​​​:
subsystem = /cgroup/hierarchy;
下​​​一​​​次​​​启​​​动​​​ cgconfig 时​​​,它​​​会​​​创​​​建​​​层​​​级​​​并​​​为​​​其​​​附​​​加​​​子​​​系​​​统​​​。​​​
以​​​下​​​示​​​例​​​创​​​建​​​名​​​为​​​ cpu_and_mem 的​​​层​​​级​​​,并​​​附​​​加​​​ cpu、​​​cpuset、​​​cpuacct 和​​​ memory 子​​​系​​​统​​​。​​​
mount {
    cpuset  = /cgroup/cpu_and_mem;
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

备​​​用​​​方​​​法​​​

您​​​还​​​可​​​以​​​使​​​用​​​ shell 命​​​令​​​和​​​工​​​具​​​创​​​建​​​层​​​级​​​并​​​在​​​其​​​中​​​附​​​加​​​子​​​系​​​统​​​。​​​
作​​​为​​​ root 为​​​该​​​层​​​级​​​创​​​建​​​挂​​​载​​​点​​​。​​​在​​​挂​​​载​​​点​​​中​​​包​​​括​​​ cgroup 名​​​称​​​:
~]# mkdir /cgroup/name
例​​​如​​​:
~]# mkdir /cgroup/cpu_and_mem
下​​​一​​​步​​​,请​​​使​​​用​​​ mount 命​​​令​​​挂​​​载​​​该​​​层​​​级​​​并​​​同​​​时​​​附​​​加​​​一​​​个​​​或​​​者​​​多​​​个​​​系​​​统​​​。​​​例​​​如​​​:
~]# mount -t cgroup -o subsystems name /cgroup/name
其​​​中​​​ subsystems 是​​​使​​​用​​​逗​​​号​​​分​​​开​​​的​​​子​​​系​​​统​​​列​​​表​​​,name 是​​​层​​​级​​​名​​​称​​​。​​​所​​​有​​​可​​​用​​​子​​​系​​​统​​​的​​​简​​​要​​​论​​​述​​​请​​​参​​​考​​​ Red Hat Enterprise Linux 中​​​的​​​可​​​用​​​子​​​系​​​统​​​第 3 章 子​​​系​​​统​​​和​​​可​​​调​​​参​​​数​​​ 中​​​有​​​详​​​细​​​的​​​参​​​考​​​。​​​

例 2.3. 使​​​用​​​ mount 命​​​令​​​附​​​加​​​子​​​系​​​统​​​

在​​​这​​​个​​​示​​​例​​​中​​​,已​​​经​​​有​​​名​​​为​​​ /cgroup/cpu_and_mem 的​​​目​​​录​​​,它​​​可​​​以​​​作​​​为​​​我​​​们​​​所​​​创​​​建​​​层​​​级​​​的​​​挂​​​载​​​点​​​服​​​务​​​。​​​我​​​们​​​将​​​在​​​名​​​为​​​ cpu_and_mem 的​​​层​​​级​​​中​​​附​​​加​​​ cpu、​​​cpuset 和​​​ memory 子​​​系​​​统​​​,并​​​在​​​ /cgroup/cpu_and_mem 中​​​ mount cpu_and_mem 层​​​级​​​:
~]# mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
您​​​可​​​以​​​使​​​用​​​ lssubsys [3]命​​​令​​​列​​​出​​​所​​​有​​​可​​​用​​​子​​​系​​​统​​​及​​​其​​​当​​​前​​​挂​​​载​​​点​​​(例​​​如​​​:挂​​​载​​​附​​​加​​​这​​​些​​​子​​​系​​​统​​​的​​​层​​​级​​​的​​​位​​​置​​​)
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
这​​​个​​​输​​​出​​​表​​​示​​​:
  • 在​​​挂​​​载​​​到​​​ /cgroup/cpu_and_mem 的​​​层​​​级​​​中​​​附​​​加​​​子​​​系​​​统​​​ cpu、​​​cpuset 和​​​ memory,且​​​
  • 还​​​没​​​有​​​在​​​任​​​何​​​层​​​级​​​中​​​附​​​加​​​子​​​系​​​统​​​ net_cls、​​​ns、​​​cpuacct、​​​devices、​​​freezer 和​​​ blkio,因​​​缺​​​少​​​相​​​应​​​的​​​挂​​​载​​​点​​​。​​​

2.3. 在​​​现​​​有​​​层​​​级​​​中​​​附​​​加​​​或​​​者​​​删​​​除​​​子​​​系​​​统​​​

要​​​在​​​现​​​有​​​层​​​级​​​中​​​添​​​加​​​子​​​系​​​统​​​,从​​​现​​​有​​​层​​​级​​​中​​​取​​​消​​​层​​​级​​​或​​​者​​​将​​​其​​​移​​​动​​​到​​​不​​​同​​​的​​​层​​​级​​​中​​​,请​​​作​​​为​​​ root 编​​​辑​​​ /etc/cgconfig.conf 文​​​件​​​的​​​ mount 部​​​分​​​,使​​​用​​​ 第 2.2 节 “创​​​建​​​层​​​级​​​并​​​附​​​加​​​子​​​系​​​统​​​” 中​​​所​​​述​​​的​​​语​​​法​​​。​​​当​​​ cgconfig 下​​​次​​​启​​​动​​​时​​​,它​​​会​​​根​​​据​​​您​​​指​​​定​​​的​​​层​​​级​​​识​​​别​​​那​​​些​​​子​​​系​​​统​​​。​​​

备​​​用​​​方​​​法​​​

要​​​在​​​现​​​有​​​层​​​级​​​中​​​取​​​消​​​附​​​加​​​子​​​系​​​统​​​,请​​​重​​​新​​​挂​​​载​​​该​​​层​​​级​​​。​​​请​​​在​​​ mount 命​​​令​​​中​​​包​​​括​​​额​​​外​​​的​​​子​​​系​​​统​​​以​​​及​​​ remount 选​​​项​​​。​​​

例 2.4. 重​​​新​​​挂​​​载​​​层​​​级​​​添​​​加​​​子​​​系​​​统​​​

lssubsys 命​​​令​​​显​​​示​​​在​​​ cpu_and_mem 层​​​级​​​中​​​附​​​加​​​ cpu、​​​cpuset 和​​​ memory 子​​​系​​​统​​​:
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
我​​​们​​​使​​​用​​​ remount 选​​​项​​​重​​​新​​​挂​​​载​​​ cpu_and_mem 层​​​级​​​,并​​​在​​​子​​​系​​​统​​​列​​​表​​​中​​​包​​​含​​​ cpuacct
~]# mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys 命​​​令​​​现​​​在​​​显​​​示​​​附​​​加​​​到​​​ cpu_and_mem 层​​​级​​​中​​​的​​​ cpuacct
~]# lssubsys -am
cpu,cpuacct,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
devices
freezer
blkio
同​​​样​​​,您​​​可​​​以​​​重​​​新​​​挂​​​载​​​该​​​层​​​级​​​并​​​使​​​用​​​ -o 选​​​项​​​忽​​​略​​​子​​​系​​​统​​​名​​​称​​​从​​​现​​​有​​​层​​​级​​​中​​​分​​​离​​​子​​​系​​​统​​​。​​​例​​​如​​​:要​​​分​​​离​​​ cpuacct 子​​​系​​​统​​​,只​​​要​​​您​​​重​​​新​​​挂​​​载​​​并​​​忽​​​略​​​它​​​即​​​可​​​:
~]# mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem

2.4. 卸​​​载​​​层​​​级​​​

您​​​还​​​可​​​以​​​使​​​用​​​ umount 命​​​令​​​卸​​​载​​​ cgroup 中​​​的​​​层​​​级​​​:
~]# umount /cgroup/name
例​​​如​​​:
~]# umount /cgroup/cpu_and_mem
如​​​果​​​该​​​层​​​级​​​目​​​前​​​为​​​空​​​(即​​​它​​​只​​​包​​​含​​​ root cgroup),则​​​在​​​卸​​​载​​​它​​​时​​​会​​​取​​​消​​​激​​​活​​​该​​​层​​​级​​​。​​​如​​​果​​​该​​​层​​​级​​​包​​​含​​​任​​​意​​​其​​​他​​​ cgroup,该​​​层​​​级​​​在​​​内​​​核​​​中​​​仍​​​保​​​持​​​活​​​跃​​​,即​​​使​​​不​​​再​​​挂​​​载​​​它​​​也​​​是​​​如​​​此​​​。​​​
要​​​删​​​除​​​层​​​级​​​,请​​​确​​​定​​​您​​​在​​​卸​​​载​​​该​​​层​​​级​​​前​​​删​​​除​​​所​​​有​​​子​​​ cgroup ,或​​​者​​​使​​​用​​​ cgclear 命​​​令​​​,它​​​可​​​在​​​层​​​级​​​非​​​空​​​时​​​也​​​可​​​取​​​消​​​激​​​活​​​层​​​级​​​ -- 请​​​参​​​考​​​ 第 2.11 节 “卸​​​载​​​控​​​制​​​组​​​群​​​”。​​​

2.5. 创​​​建​​​控​​​制​​​组​​​群​​​

请​​​使​​​用​​​ cgcreate 命​​​令​​​创​​​建​​​ cgroup。​​​cgcreate 的​​​语​​​法​​​为​​​:cgcreate -t uid:gid -a uid:gid -g subsystems:path ,其​​​中​​​:
  • -t(可​​​选​​​)- 指​​​定​​​用​​​户​​​(使​​​用​​​用​​​户​​​ ID,uid)和​​​组​​​群​​​(使​​​用​​​组​​​群​​​ ID,gid)以​​​便​​​让​​​这​​​个​​​ cgroup 拥​​​有​​​ tasks 伪​​​文​​​件​​​。​​​这​​​个​​​用​​​户​​​可​​​在​​​该​​​ cgroup 中​​​添​​​加​​​任​​​务​​​。​​​

    注意

    请​​​注​​​意​​​:从​​​ cgroup 中​​​删​​​除​​​任​​​务​​​的​​​唯​​​一​​​方​​​法​​​是​​​将​​​其​​​移​​​动​​​到​​​不​​​同​​​的​​​ cgroup中​​​。​​​要​​​移​​​动​​​任​​​务​​​,该​​​用​​​户​​​必​​​须​​​有​​​目​​​的​​​ cgroup 的​​​写​​​访​​​问​​​。​​​对​​​源​​​ cgroup 的​​​写​​​访​​​问​​​并​​​不​​​重​​​要​​​。​​​
  • -a(可​​​选​​​)- 指​​​定​​​用​​​户​​​(使​​​用​​​用​​​户​​​ ID,uid)和​​​组​​​群​​​(使​​​用​​​组​​​群​​​ ID,gid)以​​​便​​​这​​​个​​​ cgroup 拥​​​有​​​ tasks 外​​​的​​​所​​​有​​​伪​​​文​​​件​​​。​​​这​​​个​​​用​​​户​​​可​​​修​​​改​​​这​​​个​​​ cgroup 中​​​的​​​任​​​务​​​对​​​系​​​统​​​资​​​源​​​的​​​访​​​问​​​。​​​
  • -g -- 指​​​定​​​在​​​其​​​中​​​创​​​建​​​ cgroup 的​​​层​​​级​​​,格​​​式​​​为​​​与​​​那​​​些​​​层​​​级​​​关​​​联​​​的​​​用​​​逗​​​号​​​分​​​开​​​的​​​ subsystems 列​​​表​​​。​​​如​​​果​​​这​​​个​​​列​​​表​​​中​​​的​​​子​​​系​​​统​​​在​​​不​​​同​​​的​​​层​​​级​​​中​​​,则​​​要​​​在​​​每​​​个​​​层​​​级​​​中​​​都​​​创​​​建​​​该​​​组​​​群​​​。​​​层​​​级​​​列​​​表​​​后​​​是​​​一​​​个​​​冒​​​号​​​,然​​​后​​​是​​​与​​​该​​​层​​​级​​​有​​​关​​​的​​​子​​​组​​​群​​​ path。​​​不​​​要​​​在​​​该​​​ path 中​​​包​​​含​​​层​​​级​​​挂​​​载​​​点​​​。​​​
    例​​​如​​​:目​​​录​​​ /cgroup/cpu_and_mem/lab1/ 中​​​的​​​ cgroup 称​​​为​​​ lab1 -- 其​​​路​​​径​​​已​​​唯​​​一​​​确​​​定​​​,因​​​为​​​对​​​于​​​给​​​定​​​的​​​子​​​系​​​统​​​最​​​多​​​有​​​一​​​个​​​层​​​级​​​。​​​还​​​请​​​注​​​意​​​该​​​组​​​群​​​可​​​由​​​创​​​建​​​该​​​ cgroup 的​​​现​​​有​​​层​​​级​​​中​​​的​​​所​​​有​​​子​​​系​​​统​​​控​​​制​​​,即​​​使​​​没​​​有​​​在​​​ cgcreate 命​​​令​​​中​​​指​​​定​​​这​​​些​​​子​​​系​​​统​​​ -- 请​​​参​​​考​​​ 例 2.5 “cgcreate 用​​​法​​​”。​​​
因​​​为​​​同​​​一​​​层​​​级​​​中​​​的​​​所​​​有​​​ cgroup 有​​​相​​​同​​​的​​​控​​​制​​​器​​​,该​​​子​​​组​​​群​​​与​​​其​​​父​​​ cgroup 有​​​相​​​同​​​的​​​控​​​制​​​器​​​。​​​

例 2.5. cgcreate 用​​​法​​​

请​​​考​​​虑​​​在​​​ cpu_and_mem 层​​​级​​​中​​​一​​​同​​​挂​​​载​​​ cpu 和​​​ memory 子​​​系​​​统​​​的​​​系​​​统​​​,并​​​将​​​ net_cls 控​​​制​​​器​​​挂​​​载​​​到​​​名​​​为​​​ net 的​​​另​​​一​​​个​​​层​​​级​​​中​​​。​​​我​​​们​​​现​​​在​​​运​​​行​​​:
~]# cgcreate -g cpu,net_cls:/test-subgroup
cgcreate 命​​​令​​​创​​​建​​​两​​​个​​​组​​​群​​​,名​​​为​​​ test-subgroup,一​​​个​​​位​​​于​​​ cpu_and_mem 层​​​级​​​,一​​​个​​​位​​​于​​​ net 层​​​级​​​。​​​cpu_and_mem 层​​​级​​​中​​​的​​​ test-subgroup 组​​​群​​​由​​​ memory 子​​​系​​​统​​​控​​​制​​​,即​​​使​​​在​​​ cgcreate 命​​​令​​​中​​​没​​​有​​​指​​​定​​​它​​​也​​​是​​​如​​​此​​​。​​​

备​​​用​​​方​​​法​​​

请​​​使​​​用​​​ mkdir 命​​​令​​​直​​​接​​​创​​​建​​​ cgroup 的​​​子​​​组​​​群​​​:
~]# mkdir /cgroup/hierarchy/name/child_name
例​​​如​​​:
~]# mkdir /cgroup/cpuset/lab1/group1

2.6. 删​​​除​​​控​​​制​​​组​​​群​​​

使​​​用​​​ cgdelete 删​​​除​​​ cgroup,其​​​语​​​法​​​与​​​ cgcreate 类​​​似​​​。​​​运​​​行​​​ cgdelete subsystems:path,其​​​中​​​:
  • subsystems 是​​​用​​​逗​​​号​​​分​​​开​​​的​​​子​​​系​​​统​​​列​​​表​​​。​​​
  • path 是​​​到​​​与​​​该​​​层​​​级​​​相​​​对​​​ root 的​​​ cgroup 的​​​路​​​径​​​。​​​
例​​​如​​​:
~]# cgdelete cpu,net_cls:/test-subgroup
cgdelete 还​​​可​​​使​​​用​​​ -r 选​​​项​​​递​​​归​​​删​​​除​​​所​​​有​​​子​​​组​​​群​​​。​​​
删​​​除​​​ cgroup 时​​​,将​​​其​​​所​​​有​​​任​​​务​​​都​​​移​​​动​​​到​​​它​​​的​​​父​​​组​​​群​​​中​​​。​​​

2.7. 设​​​置​​​参​​​数​​​

在​​​可​​​修​​​改​​​相​​​关​​​的​​​ cgroup 的​​​用​​​户​​​帐​​​户​​​中​​​运​​​行​​​ cgset 命​​​令​​​设​​​定​​​子​​​系​​​统​​​参​​​数​​​。​​​例​​​如​​​:如​​​果​​​有​​​ /cgroup/cpuset/group1,则​​​请​​​使​​​用​​​以​​​下​​​命​​​令​​​指​​​定​​​这​​​个​​​组​​​群​​​可​​​访​​​问​​​的​​​ CPU:
cpuset]# cgset -r cpuset.cpus=0-1 group1
cgset 的​​​语​​​法​​​为​​​:cgset -r parameter=value path_to_cgroup ,其​​​中​​​:
  • parameter 是​​​要​​​设​​​定​​​的​​​参​​​数​​​,该​​​参​​​数​​​与​​​给​​​定​​​ cgroup 的​​​目​​​录​​​中​​​的​​​文​​​件​​​对​​​应​​​。​​​
  • value 是​​​为​​​参​​​数​​​设​​​定​​​的​​​值​​​
  • path_to_cgroup 是​​​到​​​相​​​对​​​该​​​层​​​级​​​ root 的​​​ cgroup 路​​​径​​​。​​​例​​​如​​​:如​​​果​​​设​​​定​​​ root 组​​​群​​​的​​​参​​​数​​​(如​​​有​​​ /cgroup/cpuacct/ 文​​​件​​​),请​​​运​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 /
    另​​​外​​​,因​​​为​​​ . 与​​​ root 组​​​群​​​相​​​关​​​(即​​​ root 组​​​群​​​本​​​身​​​),您​​​还​​​可​​​运​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 .
    备​​​注​​​:/ 是​​​首​​​选​​​语​​​法​​​。​​​

    注意

    只​​​能​​​为​​​该​​​ root 组​​​群​​​设​​​定​​​少​​​量​​​参​​​数​​​(比​​​如​​​上​​​面​​​的​​​示​​​例​​​中​​​演​​​示​​​的​​​ cpuacct.usage 参​​​数​​​)。​​​这​​​是​​​因​​​为​​​ root 组​​​群​​​拥​​​有​​​所​​​有​​​现​​​有​​​资​​​源​​​,因​​​此​​​定​​​义​​​某​​​些​​​参​​​数​​​限​​​制​​​现​​​有​​​进​​​程​​​就​​​没​​​有​​​任​​​何​​​意​​​义​​​,例​​​如​​​ cpuset.cpu 参​​​数​​​。​​​
    要​​​设​​​定​​​ root 组​​​群​​​的​​​子​​​组​​​群​​​ group1 参​​​数​​​,请​​​运​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 group1
    该​​​组​​​群​​​名​​​称​​​结​​​尾​​​的​​​斜​​​杠​​​(例​​​如​​​:cpuacct.usage=0 group1/)是​​​可​​​选​​​的​​​。​​​
您​​​可​​​以​​​使​​​用​​​ cgset 设​​​定​​​的​​​值​​​可​​​能​​​取​​​决​​​于​​​在​​​具​​​体​​​层​​​级​​​中​​​设​​​定​​​的​​​较​​​大​​​的​​​值​​​。​​​例​​​如​​​:如​​​果​​​将​​​ group1 限​​​制​​​为​​​只​​​能​​​使​​​用​​​系​​​统​​​中​​​的​​​ CPU 0,则​​​您​​​无​​​法​​​将​​​ group1/subgroup1 设​​​定​​​为​​​使​​​用​​​ CPUs 0 和​​​ 1,或​​​者​​​只​​​使​​​用​​​ CPU 1。​​​
您​​​还​​​可​​​以​​​使​​​用​​​ cgset 将​​​一​​​个​​​ cgroup 中​​​的​​​参​​​数​​​复​​​制​​​到​​​另​​​一​​​个​​​现​​​有​​​ cgroup 中​​​,例​​​如​​​:
~]# cgset --copy-from group1/ group2/
使​​​用​​​ cgset 复​​​制​​​参​​​数​​​的​​​语​​​法​​​为​​​:cgset --copy-from path_to_source_cgroup path_to_target_cgroup,其​​​中​​​:
  • path_to_source_cgroup 是​​​相​​​对​​​该​​​层​​​级​​​中​​​ root 组​​​群​​​,到​​​要​​​复​​​制​​​其​​​参​​​数​​​的​​​ cgroup 的​​​路​​​径​​​。​​​
  • path_to_target_cgroup 是​​​相​​​对​​​该​​​层​​​级​​​ root 组​​​群​​​的​​​目​​​的​​​ cgroup 的​​​路​​​径​​​。​​​
请​​​确​​​定​​​您​​​在​​​从​​​一​​​个​​​组​​​群​​​将​​​参​​​数​​​复​​​制​​​到​​​另​​​一​​​个​​​组​​​群​​​前​​​为​​​不​​​同​​​子​​​系​​​统​​​设​​​定​​​强​​​制​​​参​​​数​​​,否​​​则​​​命​​​令​​​会​​​失​​​败​​​。​​​有​​​关​​​强​​​制​​​参​​​数​​​的​​​详​​​情​​​请​​​参​​​考​​​ 重​​​要​​​ - 强​​​制​​​参​​​数​​​。​​​

备​​​用​​​方​​​法​​​

要​​​直​​​接​​​在​​​ cgroup 中​​​设​​​置​​​参​​​数​​​,请​​​使​​​用​​​ echo 命​​​令​​​将​​​值​​​插​​​入​​​相​​​关​​​子​​​系​​​统​​​伪​​​文​​​件​​​。​​​例​​​如​​​:这​​​个​​​命​​​令​​​可​​​将​​​值​​​ 0-1 插​​​入​​​ cgroup group1 的​​​ cpuset.cpus 伪​​​文​​​件​​​中​​​:
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
在​​​此​​​设​​​定​​​这​​​个​​​值​​​,则​​​这​​​个​​​ cgroup 中​​​的​​​任​​​务​​​就​​​限​​​制​​​在​​​该​​​系​​​统​​​的​​​ CPU 0 和​​​ 1 中​​​。​​​

2.8. 将​​​某​​​个​​​进​​​程​​​移​​​动​​​到​​​控​​​制​​​组​​​群​​​中​​​

您​​​还​​​可​​​以​​​运​​​行​​​ cgclassify 命​​​令​​​将​​​进​​​程​​​移​​​动​​​到​​​ cgroup 中​​​:
~]# cgclassify -g cpu,memory:group1 1701
cgclassify 的​​​语​​​法​​​为​​​:cgclassify -g subsystems:path_to_cgroup pidlist,其​​​中​​​:
  • subsystems 是​​​用​​​逗​​​号​​​分​​​开​​​的​​​子​​​系​​​统​​​列​​​表​​​,或​​​者​​​ * 启​​​动​​​与​​​所​​​有​​​可​​​用​​​子​​​系​​​统​​​关​​​联​​​的​​​层​​​级​​​中​​​的​​​进​​​程​​​。​​​请​​​注​​​意​​​:如​​​果​​​在​​​多​​​个​​​层​​​级​​​中​​​有​​​同​​​名​​​的​​​ cgroup,则​​​ -g 选​​​项​​​会​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​每​​​个​​​组​​​群​​​中​​​。​​​请​​​确​​​定​​​在​​​拥​​​有​​​您​​​在​​​此​​​指​​​定​​​子​​​系​​​统​​​的​​​每​​​个​​​层​​​级​​​中​​​都​​​有​​​该​​​ cgroup。​​​
  • path_to_cgroup 是​​​到​​​其​​​层​​​级​​​中​​​的​​​ cgroup 的​​​路​​​径​​​
  • pidlist 是​​​用​​​空​​​格​​​分​​​开​​​的​​​进​​​程​​​识​​​别​​​符​​​(PID)列​​​表​​​
您​​​还​​​可​​​以​​​在​​​ pid 前​​​面​​​添​​​加​​​ -- sticky 选​​​项​​​以​​​保​​​证​​​所​​​有​​​子​​​进​​​程​​​位​​​于​​​同​​​一​​​ cgroup 中​​​。​​​如​​​果​​​您​​​没​​​有​​​设​​​定​​​这​​​个​​​选​​​项​​​且​​​ cgred 守​​​护​​​进​​​程​​​正​​​在​​​运​​​行​​​,则​​​会​​​根​​​据​​​ /etc/cgrules.conf 中​​​的​​​设​​​置​​​将​​​子​​​进​​​程​​​分​​​配​​​到​​​ cgroup 中​​​。​​​该​​​进​​​程​​​本​​​身​​​则​​​仍​​​保​​​留​​​在​​​启​​​动​​​它​​​的​​​ cgroup 中​​​。​​​
使​​​用​​​ cgclassify,您​​​可​​​以​​​同​​​时​​​移​​​动​​​多​​​个​​​进​​​程​​​。​​​例​​​如​​​:这​​​个​​​命​​​令​​​将​​​ PID 为​​​ 1701 和​​​ 1138 的​​​进​​​程​​​移​​​动​​​到​​​ cgroup 中​​​的​​​ group1/
~]# cgclassify -g cpu,memory:group1 1701 1138
请​​​注​​​意​​​要​​​移​​​动​​​的​​​ PID 间​​​要​​​用​​​空​​​格​​​分​​​开​​​,且​​​应​​​该​​​在​​​不​​​同​​​的​​​层​​​级​​​中​​​指​​​定​​​这​​​些​​​组​​​群​​​。​​​

备​​​用​​​方​​​法​​​

要​​​将​​​进​​​程​​​直​​​接​​​移​​​动​​​到​​​ cgroup 中​​​,请​​​将​​​其​​​ PID 写​​​入​​​该​​​ cgroup 中​​​的​​​ tasks 文​​​件​​​中​​​。​​​例​​​如​​​:要​​​将​​​ PID 为​​​ 1701 的​​​进​​​程​​​移​​​动​​​到​​​位​​​于​​​ /cgroup/lab1/group1/ 的​​​ cgroup 中​​​:
~]# echo 1701 > /cgroup/lab1/group1/tasks

2.8.1. cgred 守​​​护​​​进​​​程​​​

Cgred 是​​​一​​​个​​​守​​​护​​​进​​​程​​​,它​​​可​​​根​​​据​​​在​​​ /etc/cgrules.conf 文​​​件​​​中​​​设​​​定​​​的​​​参​​​数​​​将​​​任​​​务​​​移​​​动​​​到​​​ cgroup 中​​​。​​​/etc/cgrules.conf 文​​​件​​​中​​​的​​​条​​​目​​​可​​​以​​​使​​​用​​​以​​​下​​​两​​​个​​​格​​​式​​​之​​​一​​​:
  • user hierarchies control_group
  • user:command hierarchies control_group
例​​​如​​​:
maria			devices		/usergroup/staff
这​​​个​​​条​​​目​​​指​​​定​​​任​​​何​​​属​​​于​​​名​​​为​​​ maria 用​​​户​​​的​​​进​​​程​​​根​​​据​​​在​​​ /usergroup/staff cgroup 中​​​指​​​定​​​的​​​参​​​数​​​访​​​问​​​设​​​备​​​子​​​系​​​统​​​。​​​要​​​将​​​具​​​体​​​命​​​令​​​与​​​具​​​体​​​ cgroup 关​​​联​​​,请​​​添​​​加​​​ command 参​​​数​​​,如​​​下​​​:
maria:ftp		devices		/usergroup/staff/ftp
该​​​条​​​目​​​现​​​在​​​指​​​定​​​何​​​时​​​名​​​为​​​ maria 的​​​用​​​户​​​使​​​用​​​ ftp 命​​​令​​​,自​​​动​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​包​​​含​​​ devices 子​​​系​​​统​​​的​​​层​​​级​​​中​​​的​​​ /usergroup/staff/ftp cgroup 中​​​。​​​请​​​注​​​意​​​:该​​​守​​​护​​​进​​​程​​​只​​​有​​​在​​​符​​​合​​​适​​​当​​​的​​​条​​​件​​​后​​​才​​​可​​​将​​​该​​​进​​​程​​​移​​​动​​​到​​​该​​​ cgroup 中​​​。​​​因​​​此​​​,ftp 可​​​能​​​会​​​在​​​错​​​误​​​的​​​组​​​群​​​中​​​短​​​暂​​​运​​​行​​​。​​​再​​​有​​​,如​​​果​​​该​​​进​​​程​​​在​​​错​​​误​​​组​​​群​​​中​​​迅​​​速​​​生​​​出​​​子​​​进​​​程​​​,则​​​不​​​会​​​移​​​动​​​这​​​些​​​子​​​进​​​程​​​。​​​
/etc/cgrules.conf 文​​​件​​​中​​​的​​​条​​​目​​​可​​​包​​​括​​​以​​​下​​​额​​​外​​​符​​​号​​​:
  • @ - 当​​​在​​​ user 使​​​用​​​前​​​缀​​​时​​​,代​​​表​​​是​​​一​​​个​​​组​​​群​​​而​​​不​​​是​​​单​​​独​​​用​​​户​​​。​​​例​​​如​​​:@admins 是​​​ admins 组​​​群​​​中​​​的​​​所​​​有​​​用​​​户​​​。​​​
  • * - 代​​​表​​​“​​​所​​​有​​​”​​​。​​​例​​​如​​​:subsystem 字​​​段​​​中​​​的​​​ * 代​​​表​​​所​​​有​​​子​​​系​​​统​​​。​​​
  • % - 代​​​表​​​与​​​以​​​上​​​行​​​中​​​项​​​目​​​相​​​同​​​的​​​项​​​目​​​。​​​例​​​如​​​:
    @adminstaff		devices		/admingroup
    @labstaff		%		%
    

2.9. 在​​​控​​​制​​​组​​​群​​​中​​​启​​​动​​​一​​​个​​​进​​​程​​​

重要

有​​​些​​​子​​​系​​​统​​​拥​​​有​​​强​​​制​​​参​​​数​​​,您​​​在​​​可​​​以​​​将​​​任​​​务​​​移​​​动​​​到​​​使​​​用​​​那​​​些​​​子​​​系​​​统​​​的​​​ cgroup 前​​​必​​​须​​​设​​​定​​​这​​​些​​​参​​​数​​​。​​​例​​​如​​​:在​​​您​​​将​​​任​​​务​​​移​​​动​​​到​​​使​​​用​​​ cpuset 子​​​系​​​统​​​的​​​ cgroup 前​​​,必​​​须​​​为​​​那​​​个​​​ cgroup 定​​​义​​​ cpuset.cpus 和​​​ cpuset.mems 参​​​数​​​。​​​
本​​​章​​​的​​​示​​​例​​​演​​​示​​​了​​​命​​​令​​​的​​​正​​​确​​​语​​​法​​​,但​​​只​​​适​​​用​​​于​​​在​​​此​​​示​​​例​​​中​​​为​​​所​​​有​​​控​​​制​​​器​​​设​​​定​​​了​​​相​​​关​​​强​​​制​​​参​​​数​​​的​​​系​​​统​​​。​​​如​​​果​​​您​​​还​​​没​​​有​​​配​​​置​​​相​​​关​​​控​​​制​​​器​​​,您​​​就​​​无​​​法​​​直​​​接​​​将​​​本​​​章​​​中​​​的​​​命​​​令​​​示​​​例​​​直​​​接​​​用​​​于​​​您​​​的​​​系​​​统​​​。​​​
给​​​定​​​子​​​系​​​统​​​的​​​强​​​制​​​参​​​数​​​的​​​描​​​述​​​请​​​参​​​考​​​ 第 3.10 节 “附​​​加​​​资​​​源​​​”。​​​
您​​​还​​​可​​​以​​​运​​​行​​​ cgexec 命​​​令​​​在​​​ cgroup 中​​​启​​​动​​​进​​​程​​​。​​​例​​​如​​​:这​​​个​​​命​​​令​​​启​​​动​​​了​​​ group1 cgroup 中​​​的​​​ lynx 网​​​页​​​浏​​​览​​​器​​​,目​​​的​​​是​​​限​​​制​​​ cpu 子​​​系​​​统​​​为​​​那​​​个​​​组​​​群​​​造​​​成​​​的​​​负​​​担​​​。​​​
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec 语​​​法​​​为​​​:cgexec -g subsystems:path_to_cgroup command arguments ,其​​​中​​​:
  • subsystems 是​​​用​​​逗​​​号​​​分​​​开​​​的​​​子​​​系​​​统​​​列​​​表​​​或​​​者​​​ * 启​​​动​​​与​​​所​​​有​​​可​​​用​​​子​​​系​​​统​​​关​​​联​​​的​​​层​​​级​​​中​​​的​​​进​​​程​​​。​​​请​​​注​​​意​​​:如​​​ 第 2.7 节 “设​​​置​​​参​​​数​​​” 所​​​述​​​的​​​ cgset,如​​​果​​​在​​​多​​​个​​​层​​​级​​​中​​​有​​​同​​​名​​​的​​​ cgroup,-g 选​​​项​​​会​​​在​​​每​​​个​​​组​​​群​​​中​​​创​​​建​​​进​​​程​​​。​​​请​​​确​​​定​​​您​​​在​​​拥​​​有​​​在​​​此​​​指​​​定​​​的​​​子​​​系​​​统​​​的​​​层​​​级​​​中​​​都​​​有​​​该​​​ cgroup。​​​
  • path_to_cgroup 是​​​到​​​与​​​该​​​层​​​级​​​相​​​关​​​的​​​ cgroup 的​​​路​​​径​​​。​​​
  • command 是​​​要​​​运​​​行​​​的​​​命​​​令​​​
  • arguments 是​​​该​​​命​​​令​​​所​​​有​​​参​​​数​​​
您​​​还​​​可​​​以​​​在​​​ command 前​​​面​​​添​​​加​​​ -- sticky 将​​​所​​​有​​​子​​​进​​​程​​​放​​​在​​​同​​​一​​​ cgroup 中​​​。​​​如​​​果​​​您​​​没​​​有​​​设​​​定​​​这​​​个​​​选​​​项​​​,且​​​ cgred 守​​​护​​​进​​​程​​​正​​​在​​​运​​​行​​​,则​​​将​​​根​​​据​​​在​​​ /etc/cgrules.conf 中​​​的​​​设​​​置​​​将​​​子​​​进​​​程​​​分​​​配​​​到​​​ cgroup 中​​​。​​​而​​​该​​​进​​​程​​​本​​​身​​​仍​​​保​​​留​​​在​​​启​​​动​​​它​​​的​​​ cgroup 中​​​。​​​

备​​​用​​​方​​​法​​​

当​​​您​​​启​​​动​​​新​​​进​​​程​​​时​​​,它​​​会​​​继​​​承​​​其​​​父​​​进​​​程​​​的​​​组​​​群​​​。​​​因​​​此​​​在​​​具​​​体​​​ cgroup 中​​​启​​​动​​​进​​​程​​​的​​​备​​​选​​​方​​​法​​​是​​​将​​​您​​​的​​​ shell 进​​​程​​​移​​​动​​​到​​​那​​​个​​​组​​​群​​​中​​​(请​​​参​​​考​​​ 第 2.8 节 “将​​​某​​​个​​​进​​​程​​​移​​​动​​​到​​​控​​​制​​​组​​​群​​​中​​​”),然​​​后​​​在​​​那​​​个​​​ shell 中​​​启​​​动​​​该​​​进​​​程​​​。​​​例​​​如​​​:
~]# echo $$ > /cgroup/lab1/group1/tasks
lynx
请​​​注​​​意​​​:退​​​出​​​ lynx 后​​​,您​​​现​​​有​​​ shell 中​​​仍​​​在​​​ group1 cgroup 中​​​。​​​因​​​此​​​更​​​好​​​的​​​方​​​法​​​应​​​为​​​:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"

2.9.1. 在​​​控​​​制​​​组​​​群​​​中​​​启​​​动​​​服​​​务​​​

您​​​可​​​在​​​某​​​个​​​ cgroup 中​​​启​​​动​​​某​​​些​​​服​​​务​​​。​​​在​​​ cgroup 中​​​启​​​动​​​的​​​服​​​务​​​必​​​须​​​:
  • 使​​​用​​​ /etc/sysconfig/servicename 文​​​件​​​
  • 使​​​用​​​ /etc/init.d/functions 的​​​ daemon() 功​​​能​​​启​​​动​​​该​​​服​​​务​​​
要​​​在​​​某​​​个​​​ cgroup 中​​​启​​​动​​​合​​​格​​​服​​​务​​​,请​​​在​​​ /etc/sysconfig 中​​​编​​​辑​​​其​​​文​​​件​​​,使​​​该​​​文​​​件​​​包​​​含​​​格​​​式​​​如​​​下​​​的​​​条​​​目​​​:CGROUP_DAEMON="subsystem:control_group",其​​​中​​​ subsystem 是​​​与​​​具​​​体​​​层​​​级​​​关​​​联​​​的​​​子​​​进​​​程​​​,control_group 是​​​那​​​个​​​层​​​级​​​中​​​的​​​ cgroup。​​​例​​​如​​​:
CGROUP_DAEMON="cpuset:daemons/sql"

2.10. 获​​​得​​​有​​​关​​​控​​​制​​​组​​​群​​​的​​​信​​​息​​​

2.10.1. 查​​​找​​​某​​​个​​​进​​​程​​​

要​​​查​​​找​​​某​​​个​​​进​​​程​​​所​​​属​​​ cgroup,请​​​运​​​行​​​:
~]$ ps -O cgroup
或​​​者​​​如​​​果​​​您​​​知​​​道​​​该​​​进​​​程​​​的​​​ PID,请​​​运​​​行​​​:
~]$ cat /proc/PID/cgroup

2.10.2. 查​​​找​​​子​​​系​​​统​​​

要​​​查​​​找​​​可​​​在​​​您​​​内​​​核​​​中​​​使​​​用​​​的​​​子​​​系​​​统​​​以​​​及​​​如​​​何​​​将​​​其​​​挂​​​载​​​到​​​层​​​级​​​中​​​,请​​​运​​​行​​​:
~]$ cat /proc/cgroups
或​​​者​​​查​​​找​​​具​​​体​​​子​​​系​​​统​​​的​​​挂​​​载​​​点​​​,请​​​运​​​行​​​:
~]$ lssubsys -m subsystems
其​​​中​​​ subsystems 是​​​您​​​感​​​兴​​​趣​​​的​​​子​​​系​​​统​​​列​​​表​​​。​​​请​​​注​​​意​​​:lssubsys -m 命​​​令​​​只​​​返​​​回​​​每​​​个​​​层​​​级​​​的​​​顶​​​级​​​挂​​​载​​​点​​​。​​​

2.10.3. 查​​​找​​​层​​​级​​​

我​​​们​​​建​​​议​​​您​​​在​​​ /cgroup 挂​​​载​​​层​​​级​​​。​​​假​​​设​​​在​​​您​​​的​​​系​​​统​​​中​​​是​​​这​​​种​​​情​​​况​​​,列​​​出​​​或​​​者​​​浏​​​览​​​包​​​含​​​层​​​级​​​组​​​群​​​的​​​目​​​录​​​中​​​的​​​内​​​容​​​。​​​如​​​果​​​在​​​您​​​的​​​系​​​统​​​中​​​安​​​装​​​了​​​ tree,运​​​行​​​该​​​程​​​序​​​获​​​得​​​所​​​有​​​层​​​级​​​概​​​述​​​以​​​及​​​其​​​中​​​的​​​ cgroup:
~]$ tree /cgroup/

2.10.4. 查​​​找​​​控​​​制​​​组​​​群​​​

要​​​查​​​找​​​某​​​个​​​系​​​统​​​的​​​ cgroup,请​​​运​​​行​​​:
~]$ lscgroup
您​​​可​​​以​​​指​​​定​​​控​​​制​​​程​​​序​​​和​​​路​​​径​​​限​​​制​​​具​​​体​​​层​​​级​​​的​​​输​​​出​​​,格​​​式​​​为​​​ controller:path。​​​例​​​如​​​:
~]$ lscgroup cpuset:adminusers
只​​​列​​​出​​​附​​​加​​​ cpuset 子​​​系​​​统​​​的​​​层​​​级​​​中​​​的​​​ adminusers cgroup 的​​​子​​​组​​​群​​​。​​​

2.10.5. 显​​​示​​​控​​​制​​​组​​​群​​​的​​​参​​​数​​​

要​​​显​​​示​​​具​​​体​​​ cgroup 的​​​参​​​数​​​,请​​​运​​​行​​​:
~]$ cgget -r parameter list_of_cgroups
其​​​中​​​ parameter 是​​​包​​​含​​​子​​​系​​​统​​​值​​​的​​​伪​​​文​​​件​​​,list_of_cgroups 是​​​用​​​空​​​格​​​分​​​开​​​的​​​ cgroup 列​​​表​​​。​​​例​​​如​​​:
~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
显​​​示​​​ cgroup lab1 和​​​ lab2 的​​​ cpuset.cpus 和​​​ memory.limit_in_bytes 值​​​。​​​
如​​​果​​​您​​​不​​​知​​​道​​​参​​​数​​​名​​​称​​​,请​​​使​​​用​​​类​​​似​​​命​​​令​​​:
~]$ cgget -g cpuset /

2.11. 卸​​​载​​​控​​​制​​​组​​​群​​​

警告

cgclear 目​​​录​​​将​​​破​​​坏​​​所​​​有​​​层​​​级​​​中​​​的​​​所​​​有​​​ cgroup。​​​如​​​果​​​您​​​没​​​有​​​在​​​配​​​置​​​文​​​件​​​中​​​保​​​存​​​这​​​些​​​层​​​级​​​,则​​​您​​​无​​​法​​​再​​​次​​​构​​​建​​​它​​​们​​​。​​​
要​​​清​​​除​​​整​​​个​​​ cgroup 文​​​件​​​系​​​统​​​,请​​​使​​​用​​​ cgclear 命​​​令​​​。​​​
将​​​该​​​ cgroup 中​​​的​​​所​​​有​​​任​​​务​​​重​​​新​​​分​​​配​​​到​​​该​​​层​​​级​​​的​​​ root 节​​​点​​​中​​​;删​​​除​​​所​​​有​​​ cgroup;从​​​该​​​系​​​统​​​中​​​卸​​​载​​​这​​​个​​​文​​​件​​​系​​​统​​​;这​​​样​​​就​​​破​​​坏​​​了​​​所​​​有​​​之​​​前​​​挂​​​载​​​的​​​层​​​级​​​。​​​最​​​后​​​,实​​​际​​​上​​​是​​​删​​​除​​​了​​​挂​​​载​​​该​​​ cgroup 文​​​件​​​系​​​统​​​的​​​目​​​录​​​。​​​

注意

使​​​用​​​ mount 命​​​令​​​创​​​建​​​ cgroup(与​​​使​​​用​​​ cgconfig 服​​​务​​​创​​​建​​​它​​​们​​​相​​​反​​​),结​​​果​​​是​​​在​​​ /etc/mtab 文​​​件​​​(挂​​​载​​​的​​​文​​​件​​​系​​​统​​​表​​​)中​​​生​​​成​​​一​​​个​​​条​​​目​​​。​​​这​​​个​​​更​​​改​​​还​​​在​​​ /proc/mounts 有​​​所​​​体​​​现​​​。​​​但​​​是​​​使​​​用​​​ cgclear 命​​​令​​​卸​​​载​​​ cgroup,与​​​ cgconfig 命​​​令​​​一​​​同​​​使​​​用​​​直​​​接​​​内​​​核​​​界​​​面​​​则​​​不​​​会​​​在​​​ /etc/mtab 文​​​件​​​中​​​有​​​所​​​体​​​现​​​,而​​​只​​​是​​​在​​​ /proc/mounts 文​​​件​​​中​​​写​​​入​​​新​​​信​​​息​​​。​​​因​​​此​​​使​​​用​​​ cgclear 命​​​令​​​卸​​​载​​​ cgroup 仍​​​可​​​在​​​ /etc/mtab 文​​​件​​​中​​​看​​​出​​​来​​​,且​​​在​​​随​​​后​​​执​​​行​​​ mount 命​​​令​​​时​​​显​​​示​​​。​​​所​​​有​​​挂​​​载​​​ cgroup 的​​​准​​​确​​​列​​​表​​​,建​​​议​​​您​​​参​​​考​​​ /proc/mounts 文​​​件​​​。​​​

2.12. 附​​​加​​​资​​​源​​​

cgroup 命​​​令​​​最​​​权​​​威​​​的​​​文​​​档​​​是​​​ libcgroup 软​​​件​​​包​​​提​​​供​​​的​​​手​​​册​​​页​​​。​​​这​​​部​​​分​​​的​​​数​​​字​​​在​​​以​​​下​​​ man page 列​​​表​​​中​​​指​​​定​​​。​​​

libcgroup Man Page

  • man 1 cgclassify -- cgclassify 命​​​令​​​是​​​用​​​来​​​将​​​运​​​行​​​的​​​任​​​务​​​移​​​动​​​到​​​一​​​个​​​或​​​者​​​多​​​个​​​ cgroup。​​​
    man 1 cgclear -- cgclear 命​​​令​​​是​​​用​​​来​​​删​​​除​​​层​​​级​​​中​​​的​​​所​​​有​​​ cgroup。​​​
    man 5 cgconfig.conf -- 在​​​ cgconfig.conf 文​​​件​​​中​​​定​​​义​​​ cgroup。​​​
    man 8 cgconfigparser -- cgconfigparser 命​​​令​​​解​​​析​​​ cgconfig.conf 文​​​件​​​和​​​并​​​挂​​​载​​​层​​​级​​​。​​​
    man 1 cgcreate -- cgcreate 在​​​层​​​级​​​中​​​创​​​建​​​新​​​ cgroup。​​​
    man 1 cgdelete -- cgdelete 命​​​令​​​删​​​除​​​指​​​定​​​的​​​ cgroup。​​​
    man 1 cgexec -- cgexec 命​​​令​​​在​​​指​​​定​​​的​​​ cgroup 中​​​运​​​行​​​任​​​务​​​。​​​
    man 1 cgget -- cgget 命​​​令​​​显​​​示​​​ cgroup 参​​​数​​​。​​​
    man 5 cgred.conf -- cgred.conf 是​​​ cgred 服​​​务​​​的​​​配​​​置​​​文​​​件​​​。​​​
    man 5 cgrules.conf -- cgrules.conf 包​​​含​​​用​​​来​​​决​​​定​​​何​​​时​​​任​​​务​​​术​​​语​​​某​​​些​​​ cgroup 的​​​规​​​则​​​。​​​
    man 8 cgrulesengd -- cgrulesengd 在​​​ cgroup 中​​​发​​​布​​​任​​​务​​​。​​​
    man 1 cgset -- cgset 命​​​令​​​为​​​ cgroup 设​​​定​​​参​​​数​​​。​​​
    man 1 lscgroup -- lscgroup 命​​​令​​​列​​​出​​​层​​​级​​​中​​​的​​​ cgroup。​​​
    man 1 lssubsys -- lssubsys 命​​​令​​​列​​​出​​​包​​​含​​​指​​​定​​​子​​​系​​​统​​​的​​​层​​​级​​​。​​​


[3] lssubsys 是​​​ libcgroup 命​​​令​​​提​​​供​​​的​​​工​​​具​​​之​​​一​​​。​​​您​​​必​​​须​​​安​​​装​​​ libcgroup 方​​​可​​​使​​​用​​​这​​​个​​​工​​​具​​​:如​​​果​​​您​​​无​​​法​​​运​​​行​​​ lssubsys,请​​​参​​​考​​​ 第 2 章 使​​​用​​​控​​​制​​​组​​​群​​​。​​​

第 3 章 子​​​系​​​统​​​和​​​可​​​调​​​参​​​数​​​

子​​​系​​​统​​​是​​​识​​​别​​​ cgroup 的​​​内​​​核​​​模​​​块​​​。​​​通​​​常​​​它​​​们​​​是​​​为​​​不​​​同​​​ cgroup 分​​​配​​​各​​​种​​​系​​​统​​​登​​​记​​​的​​​资​​​源​​​控​​​制​​​器​​​。​​​但​​​是​​​可​​​为​​​其​​​它​​​与​​​内​​​核​​​的​​​互​​​动​​​编​​​辑​​​子​​​系​​​统​​​,这​​​些​​​互​​​动​​​需​​​要​​​以​​​不​​​同​​​方​​​式​​​对​​​待​​​不​​​同​​​的​​​进​​​程​​​组​​​群​​​。​​​开​​​发​​​新​​​子​​​系​​​统​​​的​​​应​​​用​​​程​​​序​​​编​​​程​​​界​​​面​​​(API)文​​​档​​​位​​​于​​​内​​​核​​​文​​​件​​​的​​​ cgroups.txt 中​​​,该​​​文​​​件​​​安​​​装​​​在​​​您​​​系​​​统​​​的​​​ /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/(由​​​ kernel-doc 软​​​件​​​包​​​提​​​供​​​)。​​​cgroup 文​​​档​​​的​​​最​​​新​​​版​​​本​​​还​​​可​​​在​​​ http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt 中​​​找​​​到​​​。​​​请​​​注​​​意​​​:最​​​新​​​文​​​档​​​中​​​的​​​功​​​能​​​可​​​能​​​不​​​与​​​您​​​系​​​统​​​中​​​安​​​装​​​的​​​内​​​核​​​匹​​​配​​​。​​​
用​​​于​​​ cgroup 的​​​包​​​含​​​子​​​系​​​统​​​参​​​数​​​的​​​状​​​态​​​对​​​象​​​在​​​ cgroup 的​​​虚​​​拟​​​文​​​件​​​系​​​统​​​中​​​是​​​以​​​伪​​​文​​​件​​​出​​​现​​​。​​​这​​​些​​​伪​​​文​​​件​​​可​​​由​​​ shell 命​​​令​​​或​​​者​​​与​​​其​​​对​​​等​​​的​​​系​​​统​​​调​​​用​​​操​​​作​​​。​​​例​​​如​​​:cpuset.cpus 是​​​用​​​来​​​指​​​定​​​可​​​允​​​许​​​ cgroup 访​​​问​​​哪​​​些​​​ CPU。​​​如​​​果​​​ /cgroup/cpuset/webserver 是​​​用​​​于​​​系​​​统​​​中​​​运​​​行​​​的​​​网​​​页​​​服​​​务​​​器​​​的​​​ cgroup,则​​​我​​​们​​​会​​​运​​​行​​​以​​​下​​​命​​​令​​​:
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
将​​​值​​​ 0,2 写​​​入​​​ cpuset.cpus 伪​​​文​​​件​​​,并​​​因​​​此​​​将​​​ PID 为​​​列​​​在​​​ /cgroup/cpuset/webserver/tasks/ 中​​​的​​​任​​​务​​​限​​​制​​​为​​​只​​​使​​​用​​​系​​​统​​​中​​​的​​​ CPU 0 和​​​ CPU 2。​​​

3.1. blkio

块​​​ I/O(blkio)子​​​系​​​统​​​控​​​制​​​并​​​监​​​控​​​ cgroup 中​​​的​​​任​​​务​​​对​​​块​​​设​​​备​​​的​​​ I/O 访​​​问​​​。​​​在​​​部​​​分​​​这​​​样​​​的​​​伪​​​文​​​件​​​中​​​写​​​入​​​值​​​可​​​限​​​制​​​访​​​问​​​或​​​者​​​带​​​宽​​​,且​​​从​​​这​​​些​​​伪​​​文​​​件​​​中​​​读​​​取​​​值​​​可​​​提​​​供​​​ I/O 操​​​作​​​信​​​息​​​。​​​
blkio.weight
指​​​定​​​ cgroup 默​​​认​​​可​​​用​​​访​​​问​​​块​​​ I/O 的​​​相​​​对​​​比​​​例​​​(加​​​权​​​),范​​​围​​​在​​​ 100 到​​​ 1000。​​​这​​​个​​​值​​​可​​​由​​​具​​​体​​​设​​​备​​​的​​​ blkio.weight_device 参​​​数​​​覆​​​盖​​​。​​​例​​​如​​​:如​​​果​​​将​​​ cgroup 访​​​问​​​块​​​设​​​备​​​的​​​默​​​认​​​加​​​权​​​设​​​定​​​为​​​ 500,请​​​运​​​行​​​:
echo 500 > blkio.weight
blkio.weight_device
指​​​定​​​对​​​ cgroup 中​​​可​​​用​​​的​​​具​​​体​​​设​​​备​​​ I/O 访​​​问​​​的​​​相​​​对​​​比​​​例​​​(加​​​权​​​),范​​​围​​​是​​​ 100 到​​​ 1000。​​​这​​​个​​​值​​​可​​​由​​​为​​​设​​​备​​​指​​​定​​​的​​​ blkio.weight 参​​​数​​​覆​​​盖​​​。​​​这​​​个​​​值​​​的​​​格​​​式​​​为​​​major:minor weight,其​​​中​​​ major 和​​​ minor 是​​​在​​​《​​​Linux 分​​​配​​​的​​​设​​​备​​​》​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,我​​​们​​​也​​​称​​​之​​​为​​​ Linux 设​​​备​​​列​​​表​​​,您​​​可​​​以​​​参​​​考​​​ http://www.kernel.org/doc/Documentation/devices.txt。​​​例​​​如​​​:如​​​果​​​为​​​访​​​问​​​ /dev/sda 的​​​ cgroup 分​​​配​​​加​​​权​​​ 500,请​​​运​​​行​​​:
echo 8:0 500 > blkio.weight_device
在​​​《​​​Linux 分​​​配​​​的​​​设​​​备​​​》​​​注​​​释​​​中​​​,8:0 代​​​表​​​ /dev/sda。​​​
blkio.time
报​​​告​​​ cgroup 对​​​具​​​体​​​设​​​备​​​的​​​ I/O 访​​​问​​​时​​​间​​​。​​​条​​​目​​​有​​​三​​​个​​​字​​​段​​​:major、​​​minor 和​​​ time。​​​Major 和​​​ minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,time 是​​​时​​​间​​​长​​​度​​​,单​​​位​​​为​​​毫​​​秒​​​(ms)。​​​
blkio.sectors
报​​​告​​​使​​​用​​​ cgroup 转​​​换​​​到​​​具​​​体​​​设​​​备​​​或​​​者​​​由​​​具​​​体​​​设​​​备​​​转​​​换​​​出​​​的​​​扇​​​区​​​数​​​。​​​条​​​目​​​有​​​三​​​个​​​字​​​段​​​:major、​​​minor 和​​​ sectors。​​​major、​​​minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,sectors 是​​​磁​​​盘​​​扇​​​区​​​数​​​。​​​
blkio.io_service_bytes
报​​​告​​​使​​​用​​​ cgroup 转​​​换​​​到​​​具​​​体​​​设​​​备​​​或​​​者​​​由​​​具​​​体​​​设​​​备​​​中​​​转​​​换​​​出​​​的​​​字​​​节​​​数​​​。​​​条​​​目​​​有​​​四​​​个​​​字​​​段​​​:major、​​​minor、​​​operation 和​​​ bytes。​​​Major 和​​​ minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async),bytes 是​​​转​​​换​​​的​​​字​​​节​​​数​​​。​​​
blkio.io_serviced
报​​​告​​​使​​​用​​​ cgroup 在​​​具​​​体​​​设​​​备​​​中​​​执​​​行​​​的​​​ I/O 操​​​作​​​数​​​。​​​条​​​目​​​有​​​四​​​个​​​字​​​段​​​:major、​​​minor、​​​operation 和​​​ number。​​​Major 和​​​ minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async),number 代​​​表​​​操​​​作​​​数​​​。​​​
blkio.io_service_time
报​​​告​​​使​​​用​​​ cgroup 在​​​具​​​体​​​设​​​备​​​中​​​的​​​ I/O 操​​​作​​​请​​​求​​​发​​​送​​​和​​​请​​​求​​​完​​​成​​​之​​​间​​​的​​​时​​​间​​​。​​​条​​​目​​​有​​​四​​​个​​​字​​​段​​​:major、​​​minor、​​​operation 和​​​ time。​​​Major 和​​​ minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async),time 是​​​时​​​间​​​长​​​度​​​,单​​​位​​​为​​​纳​​​秒​​​(ns)。​​​使​​​用​​​纳​​​秒​​​为​​​单​​​位​​​报​​​告​​​而​​​不​​​是​​​较​​​大​​​的​​​单​​​位​​​是​​​要​​​使​​​报​​​告​​​即​​​使​​​对​​​固​​​态​​​设​​​备​​​也​​​是​​​有​​​意​​​义​​​的​​​。​​​
blkio.io_wait_time
报​​​告​​​在​​​具​​​体​​​设​​​备​​​中​​​ cgroup 为​​​调​​​度​​​程​​​序​​​队​​​列​​​中​​​等​​​待​​​的​​​ I/O 操​​​作​​​时​​​间​​​总​​​计​​​。​​​当​​​您​​​解​​​读​​​这​​​个​​​报​​​告​​​时​​​,请​​​注​​​意​​​:
  • 报​​​告​​​的​​​时​​​间​​​可​​​以​​​比​​​消​​​耗​​​的​​​时​​​间​​​更​​​长​​​,因​​​为​​​报​​​告​​​的​​​时​​​间​​​是​​​该​​​ cgroup 所​​​有​​​ I/O 操​​​作​​​的​​​总​​​和​​​,而​​​不​​​是​​​该​​​ cgroup 本​​​身​​​等​​​待​​​ I/O 操​​​作​​​的​​​时​​​间​​​。​​​要​​​查​​​找​​​该​​​组​​​群​​​作​​​为​​​整​​​体​​​而​​​消​​​耗​​​的​​​等​​​待​​​时​​​间​​​,请​​​使​​​用​​​ blkio.group_wait_time。​​​
  • 如​​​果​​​该​​​设​​​备​​​有​​​ queue_depth > 1,则​​​报​​​告​​​的​​​时​​​间​​​只​​​包​​​括​​​向​​​该​​​设​​​备​​​发​​​送​​​请​​​求​​​之​​​前​​​的​​​时​​​间​​​,而​​​不​​​包​​​括​​​在​​​该​​​设​​​备​​​重​​​新​​​提​​​出​​​请​​​求​​​时​​​等​​​待​​​服​​​务​​​的​​​任​​​何​​​时​​​间​​​。​​​
条​​​目​​​有​​​四​​​个​​​字​​​段​​​:major、​​​minor、​​​operation 和​​​ bytes。​​​Major 和​​​ minor 是​​​在​​​《​​​Linux 分​​​配​​​的​​​设​​​备​​​》​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async),time 是​​​时​​​间​​​长​​​度​​​,单​​​位​​​为​​​纳​​​秒​​​(ns)。​​​使​​​用​​​纳​​​秒​​​报​​​告​​​而​​​不​​​是​​​更​​​大​​​的​​​单​​​位​​​可​​​让​​​这​​​个​​​报​​​告​​​对​​​固​​​态​​​设​​​备​​​也​​​有​​​意​​​义​​​。​​​
blkio.io_merged
报​​​告​​​使​​​用​​​ cgroup 将​​​ BIOS 请​​​求​​​合​​​并​​​到​​​ I/O 操​​​作​​​请​​​求​​​的​​​次​​​数​​​。​​​条​​​目​​​有​​​两​​​个​​​字​​​段​​​:number 和​​​ operation。​​​Number 是​​​请​​​求​​​次​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async)。​​​
blkio.io_queued
报​​​告​​​ cgroup 为​​​ I/O 操​​​作​​​排​​​队​​​的​​​请​​​求​​​次​​​数​​​。​​​条​​​目​​​有​​​两​​​个​​​字​​​段​​​:number 和​​​ operation。​​​Number 是​​​请​​​求​​​次​​​数​​​,operation 代​​​表​​​操​​​作​​​类​​​型​​​(read、​​​write、​​​sync 或​​​者​​​ async)。​​​
blkio.avg_queue_size
报​​​告​​​在​​​该​​​组​​​群​​​存​​​在​​​的​​​整​​​个​​​过​​​程​​​中​​​,cgroup 的​​​ I/O 操​​​作​​​的​​​平​​​均​​​队​​​列​​​大​​​小​​​。​​​每​​​次​​​这​​​个​​​ cgroup 获​​​得​​​一​​​个​​​时​​​间​​​单​​​位​​​时​​​都​​​对​​​该​​​队​​​列​​​大​​​小​​​进​​​行​​​采​​​样​​​。​​​请​​​注​​​意​​​这​​​个​​​报​​​告​​​只​​​有​​​在​​​将​​​系​​​统​​​设​​​定​​​为​​​ CONFIG_DEBUG_BLK_CGROUP=y 时​​​可​​​用​​​。​​​
blkio.group_wait_time
报​​​告​​​ cgroup 等​​​待​​​每​​​个​​​队​​​列​​​的​​​时​​​间​​​总​​​计​​​(单​​​位​​​为​​​纳​​​秒​​​ -- ns)。​​​每​​​次​​​这​​​个​​​ cgroup 的​​​队​​​列​​​获​​​得​​​一​​​个​​​时​​​间​​​单​​​位​​​时​​​就​​​会​​​更​​​新​​​这​​​个​​​报​​​告​​​,因​​​此​​​如​​​果​​​您​​​在​​​ cgroup 等​​​待​​​时​​​间​​​单​​​位​​​时​​​读​​​取​​​这​​​个​​​伪​​​文​​​件​​​,则​​​该​​​报​​​告​​​将​​​不​​​会​​​包​​​含​​​等​​​待​​​当​​​前​​​队​​​列​​​中​​​的​​​操​​​作​​​的​​​时​​​间​​​。​​​请​​​注​​​意​​​这​​​个​​​报​​​告​​​只​​​有​​​在​​​将​​​系​​​统​​​设​​​定​​​为​​​ CONFIG_DEBUG_BLK_CGROUP=y 时​​​可​​​用​​​。​​​
blkio.empty_time
报​​​告​​​ cgroup 在​​​没​​​有​​​任​​​何​​​等​​​待​​​处​​​理​​​请​​​求​​​时​​​花​​​费​​​的​​​时​​​间​​​总​​​计​​​(单​​​位​​​为​​​纳​​​秒​​​ -- ns)。​​​每​​​次​​​这​​​个​​​ cgroup 有​​​等​​​待​​​处​​​理​​​请​​​求​​​时​​​都​​​会​​​更​​​新​​​这​​​个​​​报​​​告​​​,因​​​此​​​如​​​果​​​您​​​在​​​ cgroup 没​​​有​​​任​​​何​​​等​​​待​​​处​​​理​​​请​​​求​​​是​​​读​​​取​​​这​​​个​​​伪​​​文​​​件​​​,则​​​该​​​报​​​告​​​中​​​不​​​会​​​包​​​含​​​消​​​耗​​​在​​​当​​​前​​​空​​​状​​​态​​​中​​​的​​​时​​​间​​​。​​​请​​​注​​​意​​​这​​​个​​​报​​​告​​​只​​​有​​​在​​​将​​​该​​​系​​​统​​​设​​​定​​​为​​​ CONFIG_DEBUG_BLK_CGROUP=y 时​​​可​​​用​​​。​​​
blkio.idle_time
报​​​告​​​调​​​度​​​程​​​序​​​在​​​ cgroup 等​​​待​​​比​​​已​​​经​​​在​​​其​​​它​​​队​​​列​​​或​​​者​​​来​​​自​​​其​​​它​​​组​​​群​​​请​​​求​​​更​​​好​​​的​​​请​​​求​​​时​​​显​​​示​​​闲​​​置​​​的​​​时​​​间​​​总​​​计​​​(单​​​位​​​为​​​纳​​​秒​​​ -- ns)。​​​每​​​次​​​该​​​组​​​群​​​不​​​显​​​示​​​闲​​​置​​​时​​​就​​​会​​​更​​​新​​​这​​​个​​​报​​​告​​​,因​​​此​​​如​​​果​​​您​​​在​​​ cgroup 闲​​​置​​​时​​​读​​​取​​​这​​​个​​​伪​​​文​​​件​​​,则​​​该​​​报​​​告​​​将​​​不​​​会​​​包​​​括​​​消​​​耗​​​在​​​当​​​前​​​闲​​​置​​​状​​​态​​​的​​​时​​​间​​​。​​​请​​​注​​​意​​​,只​​​有​​​在​​​将​​​系​​​统​​​设​​​定​​​为​​​ CONFIG_DEBUG_BLK_CGROUP=y 时​​​这​​​个​​​报​​​告​​​才​​​可​​​用​​​。​​​
blkio.dequeue
报​​​告​​​ cgroup 的​​​ I/O 操​​​作​​​请​​​求​​​被​​​具​​​体​​​设​​​备​​​从​​​队​​​列​​​中​​​移​​​除​​​的​​​次​​​数​​​。​​​条​​​目​​​有​​​三​​​个​​​字​​​段​​​:major、​​​minor 和​​​ number。​​​major 和​​​ minor 是​​​在​​​ Linux 分​​​配​​​的​​​设​​​备​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,number 是​​​将​​​该​​​组​​​群​​​从​​​队​​​列​​​中​​​移​​​除​​​的​​​次​​​数​​​。​​​请​​​注​​​意​​​这​​​个​​​报​​​告​​​只​​​有​​​在​​​将​​​系​​​统​​​设​​​定​​​为​​​ CONFIG_DEBUG_BLK_CGROUP=y 时​​​可​​​用​​​。​​​
blkio.reset_stats
重​​​新​​​设​​​定​​​在​​​其​​​它​​​伪​​​文​​​件​​​中​​​记​​​录​​​的​​​统​​​计​​​数​​​据​​​。​​​在​​​这​​​个​​​文​​​件​​​中​​​写​​​入​​​一​​​个​​​整​​​数​​​为​​​这​​​个​​​ cgroup 重​​​新​​​设​​​定​​​统​​​计​​​数​​​据​​​。​​​

3.2. cpu

cpu 子​​​系​​​统​​​调​​​度​​​对​​​ cgroup 的​​​ CPU 访​​​问​​​。​​​可​​​根​​​据​​​以​​​下​​​参​​​数​​​调​​​度​​​对​​​ CPU 资​​​源​​​的​​​访​​​问​​​,每​​​个​​​参​​​数​​​都​​​独​​​立​​​存​​​在​​​于​​​ cgroup 虚​​​拟​​​文​​​件​​​系​​​统​​​的​​​伪​​​文​​​件​​​中​​​:
cpu.shares
包​​​含​​​用​​​来​​​指​​​定​​​在​​​ cgroup 中​​​的​​​任​​​务​​​可​​​用​​​的​​​相​​​对​​​共​​​享​​​ CPU 时​​​间​​​的​​​整​​​数​​​值​​​。​​​例​​​如​​​:在​​​两​​​个​​​ cgroup 中​​​都​​​将​​​ cpu.shares 设​​​定​​​为​​​ 1 的​​​任​​​务​​​将​​​有​​​相​​​同​​​的​​​ CPU 时​​​间​​​,但​​​在​​​ cgroup 中​​​将​​​ cpu.shares 设​​​定​​​为​​​ 2 的​​​任​​​务​​​可​​​使​​​用​​​的​​​ CPU 时​​​间​​​是​​​在​​​ cgroup 中​​​将​​​ cpu.shares 设​​​定​​​为​​​ 1 的​​​任​​​务​​​可​​​使​​​用​​​的​​​ CPU 时​​​间​​​的​​​两​​​倍​​​。​​​
cpu.rt_runtime_us
以​​​微​​​秒​​​(µs,这​​​里​​​以​​​“​​​us”​​​代​​​表​​​)为​​​单​​​位​​​指​​​定​​​在​​​某​​​个​​​时​​​间​​​段​​​中​​​ cgroup 中​​​的​​​任​​​务​​​对​​​ CPU 资​​​源​​​的​​​最​​​长​​​连​​​续​​​访​​​问​​​时​​​间​​​。​​​建​​​立​​​这​​​个​​​限​​​制​​​是​​​为​​​了​​​防​​​止​​​一​​​个​​​ cgroup 中​​​的​​​任​​​务​​​独​​​占​​​ CPU 时​​​间​​​。​​​如​​​果​​​ cgroup 中​​​的​​​任​​​务​​​应​​​该​​​可​​​以​​​每​​​ 5 秒​​​中​​​可​​​有​​​ 4 秒​​​时​​​间​​​访​​​问​​​ CPU 资​​​源​​​,请​​​将​​​ cpu.rt_runtime_us 设​​​定​​​为​​​ 4000000,并​​​将​​​ cpu.rt_period_us 设​​​定​​​为​​​ 5000000。​​​
cpu.rt_period_us
以​​​微​​​秒​​​(µs,这​​​里​​​以​​​“​​​us”​​​代​​​表​​​)为​​​单​​​位​​​指​​​定​​​在​​​某​​​个​​​时​​​间​​​段​​​中​​​ cgroup 对​​​ CPU 资​​​源​​​访​​​问​​​重​​​新​​​分​​​配​​​的​​​频​​​率​​​。​​​如​​​果​​​某​​​个​​​ cgroup 中​​​的​​​任​​​务​​​应​​​该​​​每​​​ 5 秒​​​钟​​​有​​​ 4 秒​​​时​​​间​​​可​​​访​​​问​​​ CPU 资​​​源​​​,则​​​请​​​将​​​ cpu.rt_runtime_us 设​​​定​​​为​​​ 4000000,并​​​将​​​ cpu.rt_period_us 设​​​定​​​为​​​ 5000000。​​​

3.3. cpuacct

CPU Accounting(cpuacct)子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​ CPU 资​​​源​​​报​​​告​​​,其​​​中​​​包​​​括​​​子​​​组​​​群​​​中​​​的​​​任​​​务​​​。​​​三​​​个​​​可​​​用​​​报​​​告​​​为​​​:
cpuacct.stat
报​​​告​​​这​​​个​​​ cgroup 及​​​其​​​子​​​组​​​群​​​中​​​的​​​任​​​务​​​使​​​用​​​用​​​户​​​模​​​式​​​和​​​系​​​统​​​(内​​​核​​​)模​​​式​​​消​​​耗​​​的​​​ CPU 循​​​环​​​数​​​(单​​​位​​​由​​​系​​​统​​​中​​​的​​​ USER_HZ 定​​​义​​​)。​​​
cpuacct.usage
报​​​告​​​这​​​个​​​ cgroup 中​​​所​​​有​​​任​​​务​​​(包​​​括​​​层​​​级​​​中​​​的​​​低​​​端​​​任​​​务​​​)消​​​耗​​​的​​​总​​​ CPU 时​​​间​​​(纳​​​秒​​​)。​​​
cpuacct.usage_percpu
报​​​告​​​这​​​个​​​ cgroup 中​​​所​​​有​​​任​​​务​​​(包​​​括​​​层​​​级​​​中​​​的​​​低​​​端​​​任​​​务​​​)在​​​每​​​个​​​ CPU 中​​​消​​​耗​​​的​​​ CPU 时​​​间​​​(以​​​纳​​​秒​​​为​​​单​​​位​​​)。​​​

3.4. cpuset

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

重要

有​​​些​​​子​​​系​​​统​​​拥​​​有​​​强​​​制​​​参​​​数​​​,您​​​在​​​可​​​以​​​将​​​任​​​务​​​移​​​动​​​到​​​使​​​用​​​那​​​些​​​子​​​系​​​统​​​的​​​ cgroup 前​​​必​​​须​​​设​​​定​​​这​​​些​​​参​​​数​​​。​​​例​​​如​​​:在​​​您​​​将​​​任​​​务​​​移​​​动​​​到​​​使​​​用​​​ cpuset 子​​​系​​​统​​​的​​​ cgroup 前​​​,必​​​须​​​为​​​那​​​个​​​ cgroup 定​​​义​​​ cpuset.cpus 和​​​ cpuset.mems 参​​​数​​​。​​​
cpuset.cpus(强​​​制​​​)
指​​​定​​​允​​​许​​​这​​​个​​​ cgroup 中​​​任​​​务​​​访​​​问​​​的​​​ CPU。​​​这​​​是​​​一​​​个​​​用​​​逗​​​号​​​分​​​开​​​的​​​列​​​表​​​,格​​​式​​​为​​​ ASCII,使​​​用​​​小​​​横​​​线​​​("-")代​​​表​​​范​​​围​​​。​​​例​​​如​​​:
0-2,16
代​​​表​​​ CPU 0、​​​1、​​​2 和​​​ 16。​​​
cpuset.mems(强​​​制​​​)
指​​​定​​​允​​​许​​​这​​​个​​​ cgroup 中​​​任​​​务​​​可​​​访​​​问​​​的​​​内​​​存​​​节​​​点​​​。​​​这​​​是​​​一​​​个​​​用​​​逗​​​号​​​分​​​开​​​的​​​列​​​表​​​,格​​​式​​​为​​​ ASCII,使​​​用​​​小​​​横​​​线​​​("-")代​​​表​​​范​​​围​​​。​​​例​​​如​​​:
0-2,16
代​​​表​​​内​​​存​​​节​​​点​​​ 0、​​​1、​​​2 和​​​ 16。​​​
cpuset.memory_migrate
包​​​含​​​用​​​来​​​指​​​定​​​当​​​ cpuset.mems 中​​​的​​​值​​​更​​​改​​​时​​​是​​​否​​​应​​​该​​​将​​​内​​​存​​​中​​​的​​​页​​​迁​​​移​​​到​​​新​​​节​​​点​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​下​​​禁​​​止​​​内​​​存​​​迁​​​移​​​(0)且​​​页​​​就​​​保​​​留​​​在​​​原​​​来​​​分​​​配​​​的​​​节​​​点​​​中​​​,即​​​使​​​在​​​ cpuset.mems 中​​​现​​​已​​​不​​​再​​​指​​​定​​​这​​​个​​​节​​​点​​​。​​​如​​​果​​​启​​​用​​​(1),则​​​该​​​系​​​统​​​会​​​将​​​页​​​迁​​​移​​​到​​​由​​​ cpuset.mems 指​​​定​​​的​​​新​​​参​​​数​​​中​​​的​​​内​​​存​​​节​​​点​​​中​​​,可​​​能​​​的​​​情​​​况​​​下​​​保​​​留​​​其​​​相​​​对​​​位​​​置​​​ - 例​​​如​​​:原​​​来​​​由​​​ cpuset.mems 指​​​定​​​的​​​列​​​表​​​中​​​第​​​二​​​个​​​节​​​点​​​中​​​的​​​页​​​将​​​会​​​重​​​新​​​分​​​配​​​给​​​现​​​在​​​由​​​ cpuset.mems 指​​​定​​​的​​​列​​​表​​​的​​​第​​​二​​​个​​​节​​​点​​​中​​​,如​​​果​​​这​​​个​​​位​​​置​​​是​​​可​​​用​​​的​​​。​​​
cpuset.cpu_exclusive
包​​​含​​​指​​​定​​​是​​​否​​​其​​​它​​​ cpuset 及​​​其​​​上​​​、​​​下​​​级​​​族​​​群​​​可​​​共​​​享​​​为​​​这​​​个​​​ cpuset 指​​​定​​​的​​​ CPU 的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​下​​​(0)CPU 不​​​是​​​专​​​门​​​分​​​配​​​给​​​某​​​个​​​ cpuset 的​​​。​​​
cpuset.mem_exclusive
包​​​含​​​指​​​定​​​是​​​否​​​其​​​它​​​ cpuset 可​​​共​​​享​​​为​​​这​​​个​​​ cpuset 指​​​定​​​的​​​内​​​存​​​节​​​点​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​下​​​(0)内​​​存​​​节​​​点​​​不​​​是​​​专​​​门​​​分​​​配​​​给​​​某​​​个​​​ cpuset 的​​​。​​​专​​​门​​​为​​​某​​​个​​​ cpuset 保​​​留​​​内​​​存​​​节​​​点​​​(1)与​​​使​​​用​​​ cpuset.mem_hardwall 启​​​用​​​内​​​存​​​ hardwall 功​​​能​​​是​​​一​​​致​​​的​​​。​​​
cpuset.mem_hardwall
包​​​含​​​指​​​定​​​是​​​否​​​应​​​将​​​内​​​存​​​页​​​面​​​的​​​内​​​核​​​分​​​配​​​限​​​制​​​在​​​为​​​这​​​个​​​ cpuset 指​​​定​​​的​​​内​​​存​​​节​​​点​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​下​​​为​​​ 0,属​​​于​​​多​​​个​​​用​​​户​​​的​​​进​​​程​​​共​​​享​​​页​​​面​​​和​​​缓​​​冲​​​。​​​启​​​用​​​ hardwall 时​​​(1)每​​​个​​​任​​​务​​​的​​​用​​​户​​​分​​​配​​​应​​​保​​​持​​​独​​​立​​​。​​​
cpuset.memory_pressure
包​​​含​​​运​​​行​​​在​​​这​​​个​​​ cpuset 中​​​产​​​生​​​的​​​平​​​均​​​内​​​存​​​压​​​力​​​的​​​只​​​读​​​文​​​件​​​。​​​启​​​用​​​ cpuset.memory_pressure_enabled 时​​​,这​​​个​​​伪​​​文​​​件​​​中​​​的​​​值​​​会​​​自​​​动​​​更​​​新​​​,否​​​则​​​伪​​​文​​​件​​​包​​​含​​​的​​​值​​​为​​​ 0。​​​
cpuset.memory_pressure_enabled
包​​​含​​​指​​​定​​​系​​​统​​​是​​​否​​​应​​​该​​​计​​​算​​​这​​​个​​​ cgroup 中​​​进​​​程​​​所​​​生​​​成​​​内​​​存​​​压​​​力​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​计​​​算​​​出​​​的​​​值​​​会​​​输​​​出​​​到​​​ cpuset.memory_pressure,且​​​代​​​表​​​进​​​程​​​试​​​图​​​释​​​放​​​使​​​用​​​中​​​内​​​存​​​的​​​比​​​例​​​,报​​​告​​​为​​​尝​​​试​​​每​​​秒​​​再​​​生​​​内​​​存​​​的​​​整​​​数​​​值​​​再​​​乘​​​ 1000。​​​
cpuset.memory_spread_page
包​​​含​​​指​​​定​​​是​​​否​​​应​​​将​​​文​​​件​​​系​​​统​​​缓​​​冲​​​平​​​均​​​分​​​配​​​给​​​这​​​个​​​ cpuset 的​​​内​​​存​​​节​​​点​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​为​​​ 0,不​​​尝​​​试​​​为​​​这​​​些​​​缓​​​冲​​​平​​​均​​​分​​​配​​​内​​​存​​​页​​​面​​​,且​​​将​​​缓​​​冲​​​放​​​置​​​在​​​运​​​行​​​生​​​成​​​缓​​​冲​​​的​​​进​​​程​​​的​​​同​​​一​​​节​​​点​​​中​​​。​​​
cpuset.memory_spread_slab
包​​​含​​​指​​​定​​​是​​​否​​​应​​​在​​​ cpuset 间​​​平​​​均​​​分​​​配​​​用​​​于​​​文​​​件​​​输​​​入​​​/输​​​出​​​操​​​作​​​的​​​内​​​核​​​缓​​​存​​​板​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​是​​​ 0,即​​​不​​​尝​​​试​​​平​​​均​​​分​​​配​​​内​​​核​​​缓​​​存​​​板​​​,并​​​将​​​缓​​​存​​​板​​​放​​​在​​​生​​​成​​​这​​​些​​​缓​​​存​​​的​​​进​​​程​​​所​​​运​​​行​​​的​​​同​​​一​​​节​​​点​​​中​​​。​​​
cpuset.sched_load_balance
包​​​含​​​指​​​定​​​是​​​否​​​在​​​这​​​个​​​ cpuset 中​​​跨​​​ CPU 平​​​衡​​​负​​​载​​​内​​​核​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​默​​​认​​​情​​​况​​​是​​​ 1,即​​​内​​​核​​​将​​​超​​​载​​​ CPU 中​​​的​​​进​​​程​​​移​​​动​​​到​​​负​​​载​​​较​​​低​​​的​​​ CPU 中​​​以​​​便​​​平​​​衡​​​负​​​载​​​。​​​
请​​​注​​​意​​​:如​​​果​​​在​​​任​​​意​​​上​​​级​​​ cgroup 中​​​启​​​用​​​负​​​载​​​平​​​衡​​​,则​​​在​​​ cgroup 中​​​设​​​定​​​这​​​个​​​标​​​签​​​没​​​有​​​任​​​何​​​效​​​果​​​,因​​​为​​​已​​​经​​​在​​​较​​​高​​​一​​​级​​​ cgroup 中​​​处​​​理​​​了​​​负​​​载​​​平​​​衡​​​。​​​因​​​此​​​,要​​​在​​​ cgroup 中​​​禁​​​用​​​负​​​载​​​平​​​衡​​​,还​​​要​​​在​​​该​​​层​​​级​​​的​​​每​​​一​​​个​​​上​​​级​​​ cgroup 中​​​禁​​​用​​​负​​​载​​​平​​​衡​​​。​​​这​​​里​​​您​​​还​​​应​​​该​​​考​​​虑​​​是​​​否​​​应​​​在​​​所​​​有​​​平​​​级​​​ cgroup 中​​​启​​​用​​​负​​​载​​​平​​​衡​​​。​​​
cpuset.sched_relax_domain_level
包​​​含​​​ -1 到​​​小​​​正​​​数​​​间​​​的​​​整​​​数​​​,它​​​代​​​表​​​内​​​核​​​应​​​尝​​​试​​​平​​​衡​​​负​​​载​​​的​​​ CPU 宽​​​度​​​范​​​围​​​。​​​如​​​果​​​禁​​​用​​​了​​​ cpuset.sched_load_balance,则​​​该​​​值​​​毫​​​无​​​意​​​义​​​。​​​
根​​​据​​​不​​​同​​​系​​​统​​​构​​​架​​​这​​​个​​​值​​​的​​​具​​​体​​​效​​​果​​​不​​​同​​​,但​​​以​​​下​​​值​​​是​​​常​​​用​​​的​​​:
cpuset.sched_relax_domain_level 值​​​
值​​​效​​​果​​​
-1为​​​负​​​载​​​平​​​衡​​​使​​​用​​​系​​​统​​​默​​​认​​​值​​​
0不​​​执​​​行​​​直​​​接​​​负​​​载​​​平​​​衡​​​;负​​​载​​​平​​​衡​​​只​​​是​​​阶​​​段​​​性​​​的​​​
1在​​​同​​​一​​​核​​​中​​​的​​​跨​​​线​​​程​​​直​​​接​​​负​​​载​​​平​​​衡​​​
2在​​​同​​​一​​​软​​​件​​​包​​​中​​​的​​​跨​​​线​​​程​​​直​​​接​​​负​​​载​​​平​​​衡​​​
3在​​​同​​​一​​​节​​​点​​​或​​​者​​​刀​​​片​​​中​​​的​​​跨​​​线​​​程​​​直​​​接​​​负​​​载​​​平​​​衡​​​
4在​​​不​​​使​​​用​​​统​​​一​​​内​​​存​​​访​​​问​​​(NUMA)构​​​架​​​中​​​跨​​​多​​​个​​​ CPU 的​​​直​​​接​​​负​​​载​​​平​​​衡​​​
5在​​​使​​​用​​​统​​​一​​​内​​​存​​​访​​​问​​​(NUMA)构​​​架​​​中​​​跨​​​多​​​个​​​ CPU 的​​​直​​​接​​​负​​​载​​​平​​​衡​​​

3.5. devices

devices 子​​​系​​​统​​​允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备​​​。​​​

重要

在​​​红​​​帽​​​企​​​业​​​版​​​ Linux 6 中​​​将​​​设​​​备​​​白​​​名​​​单​​​列​​​表​​​(devices)子​​​系​​​统​​​视​​​为​​​技​​​术​​​预​​​览​​​。​​​
目​​​前​​​红​​​帽​​​企​​​业​​​版​​​ Linux 6 订​​​阅​​​服​​​务​​​还​​​不​​​支​​​持​​​技​​​术​​​预​​​览​​​功​​​能​​​,可​​​能​​​功​​​能​​​并​​​不​​​完​​​备​​​,且​​​通​​​常​​​不​​​适​​​合​​​产​​​品​​​使​​​用​​​。​​​但​​​红​​​帽​​​在​​​操​​​作​​​系​​​统​​​中​​​包​​​含​​​这​​​些​​​功​​​能​​​是​​​为​​​了​​​方​​​便​​​用​​​户​​​,并​​​提​​​供​​​更​​​广​​​泛​​​的​​​功​​​能​​​。​​​您​​​会​​​发​​​现​​​这​​​些​​​功​​​能​​​可​​​能​​​在​​​非​​​产​​​品​​​环​​​境​​​中​​​很​​​有​​​用​​​,同​​​时​​​还​​​请​​​提​​​供​​​反​​​馈​​​一​​​件​​​和​​​功​​​能​​​建​​​议​​​,以​​​便​​​今​​​后​​​全​​​面​​​支​​​持​​​这​​​个​​​技​​​术​​​预​​​览​​​。​​​
devices.allow
指​​​定​​​ cgroup 中​​​的​​​任​​​务​​​可​​​访​​​问​​​的​​​设​​​备​​​。​​​每​​​个​​​条​​​目​​​有​​​四​​​个​​​字​​​段​​​:type、​​​major、​​​minor 和​​​ access。​​​type、​​​major 和​​​ minor 字​​​段​​​中​​​使​​​用​​​的​​​值​​​对​​​应​​​ Linux 分​​​配​​​的​​​设​​​备​​​,也​​​称​​​ Linux 设​​​备​​​列​​​表​​​中​​​指​​​定​​​的​​​设​​​备​​​类​​​型​​​和​​​节​​​点​​​数​​​,这​​​两​​​本​​​书​​​可​​​见​​​于​​​ http://www.kernel.org/doc/Documentation/devices.txt。​​​
type
type 可​​​以​​​是​​​以​​​下​​​三​​​个​​​值​​​之​​​一​​​:
  • a - 应​​​用​​​所​​​有​​​设​​​备​​​,可​​​以​​​是​​​字​​​符​​​设​​​备​​​,也​​​可​​​以​​​是​​​块​​​设​​​备​​​
  • b - 指​​​定​​​块​​​设​​​备​​​
  • c - 指​​​定​​​字​​​符​​​设​​​备​​​
major, minor
major 和​​​ minor 是​​​由​​​《​​​Linux 分​​​配​​​设​​​备​​​》​​​指​​​定​​​的​​​设​​​备​​​节​​​点​​​数​​​。​​​主​​​设​​​备​​​号​​​和​​​副​​​设​​​备​​​号​​​使​​​用​​​冒​​​号​​​分​​​开​​​。​​​例​​​如​​​:8 是​​​主​​​设​​​备​​​号​​​,指​​​定​​​ SCSI 磁​​​盘​​​驱​​​动​​​器​​​;副​​​设​​​备​​​号​​​ 1 指​​​定​​​第​​​一​​​个​​​ SCSI 磁​​​盘​​​驱​​​动​​​器​​​中​​​的​​​第​​​一​​​个​​​分​​​区​​​;因​​​此​​​8:1 完​​​整​​​指​​​定​​​这​​​个​​​分​​​区​​​,对​​​应​​​位​​​于​​​ /dev/sda1 的​​​一​​​个​​​文​​​件​​​系​​​统​​​。​​​
* 可​​​代​​​表​​​所​​​有​​​主​​​要​​​和​​​次​​​要​​​设​​​备​​​节​​​点​​​,例​​​如​​​:9:*(所​​​有​​​ RAID 设​​​备​​​)或​​​者​​​ *:*(所​​​有​​​设​​​备​​​)。​​​
access
access 是​​​以​​​下​​​一​​​个​​​或​​​者​​​多​​​个​​​字​​​母​​​序​​​列​​​:
  • r - 允​​​许​​​任​​​务​​​从​​​指​​​定​​​设​​​备​​​中​​​读​​​取​​​
  • w - 允​​​许​​​任​​​务​​​写​​​入​​​指​​​定​​​设​​​备​​​
  • m - 允​​​许​​​任​​​务​​​生​​​成​​​还​​​不​​​存​​​在​​​的​​​设​​​备​​​文​​​件​​​
例​​​如​​​:当​​​将​​​ access 指​​​定​​​为​​​ r 时​​​,则​​​只​​​能​​​从​​​指​​​定​​​设​​​备​​​中​​​读​​​取​​​任​​​务​​​,但​​​当​​​将​​​ access 指​​​定​​​为​​​ rw 时​​​,则​​​既​​​可​​​从​​​该​​​设​​​备​​​中​​​读​​​取​​​任​​​务​​​,也​​​可​​​向​​​该​​​设​​​备​​​中​​​写​​​入​​​任​​​务​​​。​​​
devices.deny
指​​​定​​​ cgroup 中​​​任​​​务​​​不​​​能​​​访​​​问​​​的​​​设​​​备​​​。​​​条​​​目​​​语​​​法​​​与​​​ devices.allow 一​​​致​​​。​​​
devices.list
报​​​告​​​为​​​这​​​个​​​ cgroup 中​​​的​​​任​​​务​​​设​​​定​​​访​​​问​​​控​​​制​​​的​​​设​​​备​​​。​​​

3.6. freezer

freezer 子​​​系​​​统​​​挂​​​起​​​或​​​者​​​恢​​​复​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
freezer.state
freezer.state 有​​​三​​​个​​​可​​​能​​​的​​​值​​​:
  • FROZEN -- 挂​​​起​​​该​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
  • FREEZING -- 该​​​系​​​统​​​正​​​在​​​挂​​​起​​​该​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
  • THAWED -- 已​​​经​​​恢​​​复​​​该​​​ cgroup 中​​​的​​​任​​​务​​​。​​​
要​​​挂​​​起​​​具​​​体​​​进​​​程​​​:
  1. 将​​​那​​​个​​​进​​​程​​​移​​​动​​​到​​​附​​​加​​​了​​​ freezer 子​​​系​​​统​​​的​​​层​​​级​​​的​​​ cgroup 中​​​。​​​
  2. 停​​​滞​​​那​​​个​​​具​​​体​​​ cgroup 以​​​便​​​挂​​​起​​​其​​​中​​​包​​​含​​​的​​​这​​​个​​​进​​​程​​​。​​​
不​​​可​​​能​​​将​​​进​​​程​​​移​​​动​​​到​​​挂​​​起​​​(frozen)的​​​ cgroup 中​​​。​​​
请​​​注​​​意​​​可​​​将​​​ FROZEN 和​​​ THAWED 值​​​写​​​入​​​ freezer.state,但​​​无​​​法​​​写​​​入​​​ FREEZING,只​​​能​​​读​​​取​​​它​​​。​​​

3.7. memory

memory 子​​​系​​​统​​​自​​​动​​​生​​​成​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​资​​​源​​​报​​​告​​​,并​​​设​​​定​​​由​​​那​​​些​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​:
memory.stat
报​​​告​​​大​​​范​​​围​​​内​​​存​​​统​​​计​​​,如​​​下​​​表​​​所​​​述​​​:

表 3.1. memory.stat 报​​​告​​​的​​​值​​​

统​​​计​​​ 描​​​述​​​
cache 页​​​缓​​​存​​​,包​​​括​​​ tmpfsshmem),单​​​位​​​为​​​字​​​节​​​
rss 匿​​​名​​​和​​​ swap 缓​​​存​​​,不​​​包​​​括​​​ tmpfsshmem),单​​​位​​​为​​​字​​​节​​​
mapped_file memory-mapped 映​​​射​​​的​​​文​​​件​​​大​​​小​​​,包​​​括​​​ tmpfsshmem),单​​​位​​​为​​​字​​​节​​​
pgpgin 存​​​入​​​内​​​存​​​中​​​的​​​页​​​数​​​
pgpgout 从​​​内​​​存​​​中​​​读​​​出​​​的​​​页​​​数​​​
swap swap 用​​​量​​​,单​​​位​​​为​​​字​​​节​​​
active_anon 在​​​活​​​跃​​​的​​​最​​​近​​​最​​​少​​​使​​​用​​​(least-recently-used,LRU)列​​​表​​​中​​​的​​​匿​​​名​​​和​​​ swap 缓​​​存​​​,包​​​括​​​ tmpfsshmem),单​​​位​​​为​​​字​​​节​​​
inactive_anon 不​​​活​​​跃​​​的​​​ LRU 列​​​表​​​中​​​的​​​匿​​​名​​​和​​​ swap 缓​​​存​​​,包​​​括​​​ tmpfsshmem),单​​​位​​​为​​​字​​​节​​​
active_file 活​​​跃​​​ LRU 列​​​表​​​中​​​的​​​ file-backed 内​​​存​​​,以​​​字​​​节​​​为​​​单​​​位​​​
inactive_file 不​​​活​​​跃​​​ LRU 列​​​表​​​中​​​的​​​ file-backed 内​​​存​​​,以​​​字​​​节​​​为​​​单​​​位​​​
unevictable 无​​​法​​​再​​​生​​​的​​​内​​​存​​​,以​​​字​​​节​​​为​​​单​​​位​​​
hierarchical_memory_limit 包​​​含​​​ memory cgroup 的​​​层​​​级​​​的​​​内​​​存​​​限​​​制​​​,单​​​位​​​为​​​字​​​节​​​
hierarchical_memsw_limit 包​​​含​​​ memory cgroup 的​​​层​​​级​​​的​​​内​​​存​​​加​​​ swap 限​​​制​​​,单​​​位​​​为​​​字​​​节​​​
另​​​外​​​,这​​​些​​​文​​​件​​​除​​​ hierarchical_memory_limit 和​​​ hierarchical_memsw_limit 之​​​外​​​,都​​​有​​​一​​​个​​​对​​​应​​​前​​​缀​​​ total,它​​​不​​​仅​​​可​​​在​​​该​​​ cgroup 中​​​报​​​告​​​,还​​​可​​​在​​​其​​​下​​​级​​​ cgroup 中​​​报​​​告​​​。​​​例​​​如​​​:swap 报​​​告​​​ cgroup 的​​​ swap 用​​​量​​​,total_swap 报​​​告​​​该​​​ cgroup 及​​​其​​​所​​​有​​​子​​​组​​​群​​​的​​​ swap 用​​​量​​​总​​​和​​​。​​​
当​​​您​​​解​​​读​​​ memory.stat 报​​​告​​​的​​​数​​​值​​​时​​​,请​​​注​​​意​​​各​​​个​​​统​​​计​​​数​​​据​​​之​​​间​​​的​​​关​​​系​​​:
  • active_anon + inactive_anon = 匿​​​名​​​内​​​存​​​ + tmpfs 的​​​文​​​件​​​缓​​​存​​​ + swap 缓​​​存​​​
    因​​​此​​​,active_anon + inactive_anon ≠​​​ rss,因​​​为​​​ rss 不​​​包​​​括​​​ tmpfs。​​​
  • active_file + inactive_file = 缓​​​存​​​减​​​去​​​ tmpfs 大​​​小​​​
memory.usage_in_bytes
报​​​告​​​该​​​ cgroup中​​​进​​​程​​​使​​​用​​​的​​​当​​​前​​​总​​​内​​​存​​​用​​​量​​​(以​​​字​​​节​​​为​​​单​​​位​​​)。​​​
memory.memsw.usage_in_bytes
报​​​告​​​该​​​ cgroup 中​​​进​​​程​​​使​​​用​​​的​​​当​​​前​​​内​​​存​​​用​​​量​​​和​​​ swap 空​​​间​​​总​​​和​​​(以​​​字​​​节​​​为​​​单​​​位​​​)。​​​
memory.max_usage_in_bytes
报​​​告​​​该​​​ cgroup 中​​​进​​​程​​​使​​​用​​​的​​​最​​​大​​​内​​​存​​​用​​​量​​​(以​​​字​​​节​​​为​​​单​​​位​​​)。​​​
memory.memsw.max_usage_in_bytes
报​​​告​​​该​​​ cgroup 中​​​进​​​程​​​使​​​用​​​的​​​最​​​大​​​内​​​存​​​用​​​量​​​和​​​ swap 空​​​间​​​用​​​量​​​(以​​​字​​​节​​​为​​​单​​​位​​​)。​​​
memory.limit_in_bytes
设​​​定​​​用​​​户​​​内​​​存​​​的​​​最​​​大​​​量​​​(包​​​括​​​文​​​件​​​缓​​​存​​​)。​​​如​​​果​​​没​​​有​​​指​​​定​​​单​​​位​​​,则​​​将​​​该​​​数​​​值​​​理​​​解​​​为​​​字​​​节​​​。​​​但​​​是​​​可​​​以​​​使​​​用​​​前​​​缀​​​代​​​表​​​更​​​大​​​的​​​单​​​位​​​ - k 或​​​者​​​ K 代​​​表​​​千​​​字​​​节​​​,m 或​​​者​​​ M 代​​​表​​​ MB,g 或​​​者​​​ G 代​​​表​​​ GB。​​​
您​​​不​​​能​​​使​​​用​​​ memory.limit_in_bytes 限​​​制​​​ root cgroup;您​​​只​​​能​​​在​​​该​​​层​​​级​​​中​​​较​​​低​​​的​​​组​​​群​​​中​​​应​​​用​​​这​​​些​​​值​​​。​​​
在​​​ memory.limit_in_bytes 中​​​写​​​入​​​ -1 删​​​除​​​现​​​有​​​限​​​制​​​。​​​
memory.memsw.limit_in_bytes
设​​​定​​​最​​​大​​​内​​​存​​​与​​​ swap 用​​​量​​​之​​​和​​​。​​​如​​​果​​​没​​​有​​​指​​​定​​​单​​​位​​​,则​​​将​​​该​​​值​​​解​​​读​​​为​​​字​​​节​​​。​​​但​​​是​​​可​​​以​​​使​​​用​​​前​​​缀​​​代​​​表​​​更​​​大​​​的​​​单​​​位​​​ - k 或​​​者​​​ K 代​​​表​​​千​​​字​​​节​​​,m 或​​​者​​​ M 代​​​表​​​ MB,g 或​​​者​​​ G 代​​​表​​​ GB。​​​
您​​​不​​​能​​​使​​​用​​​ memory.memsw.limit_in_bytes 限​​​制​​​ root cgroup;您​​​只​​​能​​​在​​​该​​​层​​​级​​​中​​​较​​​低​​​的​​​组​​​群​​​中​​​应​​​用​​​这​​​些​​​值​​​。​​​
在​​​ memory.memsw.limit_in_bytes 中​​​写​​​入​​​ -1 删​​​除​​​现​​​有​​​限​​​制​​​。​​​
memory.failcnt
报​​​告​​​内​​​存​​​达​​​到​​​在​​​ memory.limit_in_bytes 设​​​定​​​的​​​限​​​制​​​值​​​的​​​次​​​数​​​。​​​
memory.memsw.failcnt
报​​​告​​​内​​​存​​​加​​​ swap 空​​​间​​​限​​​制​​​达​​​到​​​在​​​ memory.memsw.limit_in_bytes 设​​​定​​​的​​​值​​​的​​​次​​​数​​​。​​​
memory.force_empty
当​​​设​​​定​​​为​​​ 0 时​​​,会​​​清​​​空​​​这​​​个​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​所​​​有​​​页​​​面​​​的​​​内​​​存​​​。​​​这​​​个​​​接​​​口​​​只​​​可​​​在​​​ cgroup 中​​​没​​​有​​​任​​​务​​​时​​​使​​​用​​​。​​​如​​​果​​​无​​​法​​​清​​​空​​​内​​​存​​​,则​​​在​​​可​​​能​​​的​​​情​​​况​​​下​​​将​​​其​​​移​​​动​​​到​​​上​​​级​​​ cgroup 中​​​。​​​删​​​除​​​ cgroup 前​​​请​​​使​​​用​​​ memory.force_empty 以​​​避​​​免​​​将​​​不​​​再​​​使​​​用​​​的​​​页​​​面​​​缓​​​存​​​移​​​动​​​到​​​它​​​的​​​上​​​级​​​ cgroup 中​​​。​​​
memory.swappiness
将​​​内​​​核​​​倾​​​向​​​设​​​定​​​为​​​换​​​出​​​这​​​个​​​ cgroup 中​​​任​​​务​​​所​​​使​​​用​​​的​​​进​​​程​​​内​​​存​​​,而​​​不​​​是​​​从​​​页​​​缓​​​冲​​​中​​​再​​​生​​​页​​​面​​​。​​​这​​​也​​​是​​​在​​​ /proc/sys/vm/swappiness 中​​​设​​​定​​​的​​​使​​​用​​​同​​​一​​​方​​​法​​​为​​​整​​​个​​​系​​​统​​​设​​​定​​​的​​​内​​​核​​​倾​​​向​​​。​​​默​​​认​​​值​​​为​​​ 60。​​​低​​​于​​​这​​​个​​​值​​​会​​​降​​​低​​​内​​​核​​​换​​​出​​​进​​​程​​​内​​​存​​​的​​​倾​​​向​​​,将​​​其​​​设​​​定​​​为​​​ 0 则​​​完​​​全​​​不​​​会​​​为​​​ cgroup 中​​​的​​​任​​​务​​​换​​​出​​​进​​​程​​​内​​​存​​​。​​​高​​​于​​​这​​​个​​​值​​​将​​​提​​​高​​​内​​​核​​​换​​​出​​​进​​​程​​​内​​​存​​​的​​​倾​​​向​​​,大​​​于​​​ 100 时​​​内​​​核​​​将​​​开​​​始​​​换​​​出​​​作​​​为​​​这​​​个​​​ cgroup 中​​​进​​​程​​​的​​​地​​​址​​​空​​​间​​​一​​​部​​​分​​​的​​​页​​​面​​​。​​​
请​​​注​​​意​​​那​​​个​​​值​​​为​​​ 0 不​​​会​​​阻​​​止​​​换​​​出​​​进​​​程​​​内​​​存​​​;系​​​统​​​缺​​​少​​​内​​​存​​​时​​​仍​​​可​​​能​​​发​​​生​​​换​​​出​​​内​​​存​​​,这​​​是​​​因​​​为​​​全​​​局​​​虚​​​拟​​​内​​​存​​​管​​​理​​​逻​​​辑​​​不​​​读​​​取​​​该​​​ cgroup 值​​​。​​​要​​​完​​​全​​​锁​​​定​​​页​​​面​​​,请​​​使​​​用​​​ mlock() 而​​​不​​​时​​​ cgroup。​​​
您​​​不​​​能​​​更​​​改​​​以​​​下​​​组​​​群​​​的​​​ swappiness:
  • root cgroup,它​​​使​​​用​​​在​​​ /proc/sys/vm/swappiness 中​​​设​​​定​​​的​​​ swappiness。​​​
  • 有​​​属​​​于​​​它​​​的​​​子​​​组​​​群​​​的​​​ cgroup。​​​
memory.use_hierarchy
包​​​含​​​指​​​定​​​是​​​否​​​应​​​将​​​内​​​存​​​用​​​量​​​计​​​入​​​ cgroup 层​​​级​​​的​​​吞​​​吐​​​量​​​的​​​标​​​签​​​(0 或​​​者​​​ 1)。​​​如​​​果​​​启​​​用​​​(1),内​​​存​​​子​​​系​​​统​​​会​​​从​​​超​​​过​​​其​​​内​​​存​​​限​​​制​​​的​​​子​​​进​​​程​​​中​​​再​​​生​​​内​​​存​​​。​​​默​​​认​​​情​​​况​​​(0)是​​​子​​​系​​​统​​​不​​​从​​​任​​​务​​​的​​​子​​​进​​​程​​​中​​​再​​​生​​​内​​​存​​​。​​​

3.8. net_cls

net_cls 子​​​系​​​统​​​使​​​用​​​等​​​级​​​识​​​别​​​符​​​(classid)标​​​记​​​网​​​络​​​数​​​据​​​包​​​,可​​​允​​​许​​​ Linux 流​​​量​​​控​​​制​​​程​​​序​​​(tc)识​​​别​​​从​​​具​​​体​​​ cgroup 中​​​生​​​成​​​的​​​数​​​据​​​包​​​。​​​可​​​将​​​流​​​量​​​控​​​制​​​程​​​序​​​配​​​置​​​为​​​给​​​不​​​同​​​ cgroup 中​​​的​​​数​​​据​​​包​​​分​​​配​​​不​​​同​​​的​​​优​​​先​​​权​​​。​​​
net_cls.classid
net_cls.classid 包​​​含​​​一​​​个​​​说​​​明​​​流​​​量​​​控​​​制​​​句​​​柄​​​的​​​十​​​六​​​进​​​制​​​的​​​值​​​。​​​例​​​如​​​:0x1001 代​​​表​​​通​​​常​​​写​​​成​​​ 10:1 的​​​句​​​柄​​​,这​​​是​​​ iproute2 使​​​用​​​的​​​格​​​式​​​。​​​
这​​​些​​​句​​​柄​​​的​​​格​​​式​​​为​​​:0xAAAABBBB,其​​​中​​​ AAAA 是​​​十​​​六​​​进​​​制​​​主​​​设​​​备​​​号​​​,BBBB 是​​​十​​​六​​​进​​​制​​​副​​​设​​​备​​​号​​​。​​​您​​​可​​​以​​​忽​​​略​​​前​​​面​​​的​​​零​​​;0x10001 与​​​ 0x00010001 一​​​样​​​,代​​​表​​​ 1:1。​​​
参​​​考​​​ tc 的​​​ man page 了​​​解​​​如​​​何​​​配​​​置​​​流​​​量​​​控​​​制​​​程​​​序​​​使​​​用​​​ net_cls 添​​​加​​​到​​​网​​​络​​​数​​​据​​​包​​​中​​​的​​​句​​​柄​​​。​​​

3.9. ns

ns 子​​​系​​​统​​​提​​​供​​​了​​​一​​​个​​​将​​​进​​​程​​​分​​​组​​​到​​​不​​​同​​​名​​​称​​​空​​​间​​​的​​​方​​​法​​​。​​​在​​​具​​​体​​​名​​​称​​​空​​​间​​​中​​​,进​​​程​​​可​​​彼​​​此​​​互​​​动​​​,但​​​会​​​与​​​在​​​其​​​它​​​名​​​称​​​空​​​间​​​中​​​运​​​行​​​的​​​进​​​程​​​隔​​​绝​​​。​​​这​​​些​​​分​​​开​​​的​​​名​​​称​​​空​​​间​​​在​​​用​​​于​​​操​​​作​​​系​​​统​​​级​​​别​​​的​​​虚​​​拟​​​化​​​时​​​,有​​​时​​​也​​​称​​​之​​​为​​​容​​​器​​​。​​​

3.10. 附​​​加​​​资​​​源​​​

具​​​体​​​子​​​系​​​统​​​内​​​核​​​文​​​档​​​

以​​​下​​​所​​​有​​​文​​​件​​​都​​​位​​​于​​​ /usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/ 目​​​录​​​中​​​(由​​​ kernel-doc 软​​​件​​​包​​​提​​​供​​​)。​​​
  • blkio 子​​​系​​​统​​​ -- blkio-controller.txt
  • cpuacct 子​​​系​​​统​​​ -- cpuacct.txt
  • cpuset 子​​​系​​​统​​​ -- cpusets.txt
  • devices 子​​​系​​​统​​​ -- devices.txt
  • freezer 子​​​系​​​统​​​ -- freezer-subsystem.txt
  • memory 子​​​系​​​统​​​ -- memory.txt

附录 A. 修​​​订​​​记​​​录​​​

修订历史
修订 1-3.4002013-10-31Rüdiger Landmann
Rebuild with publican 4.0.0
修订 1-32012-07-18Anthony Towns
Rebuild for Publican 3.0
修订 1.0-5Thu May 19 2011Martin Prpič
《​​​资​​​源​​​管​​​理​​​指​​​南​​​ 的​​​ Red Hat Enterprise Linux 6.1 正​​​式​​​发​​​行​​​本​​​。​​​
修订 1.0-4Tue Mar 1 2011Martin Prpič
修​​​复​​​的​​​多​​​个​​​示​​​例​​​ -- BZ#667623、​​​BZ#667676、​​​BZ#667699
cgclear 命​​​令​​​说​​​明​​​ -- BZ#577101
lssubsystem 命​​​令​​​说​​​明​​​ -- BZ#678517
冻​​​结​​​进​​​程​​​ -- BZ#677548
修订 1.0-3Wed Nov 17 2010Rüdiger Landmann
修​​​正​​​重​​​新​​​挂​​​载​​​示​​​例​​​ -- BZ#612805
修订 1.0-2Thu Nov 11 2010Rüdiger Landmann
删​​​除​​​预​​​先​​​发​​​布​​​的​​​反​​​馈​​​说​​​明​​​
修订 1.0-1Wed Nov 10 2010Rüdiger Landmann
修​​​正​​​来​​​自​​​ QE 的​​​反​​​馈​​​ -- BZ#581702 和​​​ BZ#612805
修订 1.0-0Tue Nov 9 2010Rüdiger Landmann
正​​​式​​​发​​​行​​​本​​​的​​​完​​​整​​​功​​​能​​​版​​​本​​​

法律通告

Copyright © 2011 Red Hat, Inc.
This document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.