章 1. 控​​​制​​​群​​​組​​​(Cgroup)簡​​​介​​​

Red Hat Enterprise Linux 6 提​​​供​​​了​​​一​​​項​​​新​​​的​​​ kernel 功​​​能​​​:control groups,在​​​本​​​指​​​南​​​中​​​簡​​​稱​​​為​​​ cgroup。​​​Cgroup 能​​​讓​​​您​​​分​​​配​​​資​​​源​​​ —​​​ 例​​​如​​​ CPU 時​​​間​​​、​​​系​​​統​​​記​​​憶​​​體​​​、​​​網​​​路​​​頻​​​寬​​​,或​​​這​​​些​​​資​​​源​​​的​​​組​​​合​​​ —​​​ 於​​​系​​​統​​​上​​​,使​​​用​​​者​​​定​​​義​​​的​​​運​​​作​​​中​​​工​​​作​​​群​​​組​​​(程​​​序​​​)。​​​您​​​可​​​監​​​控​​​您​​​所​​​配​​​置​​​的​​​ cgroup,拒​​​絕​​​ cgroup 對​​​於​​​特​​​定​​​資​​​源​​​的​​​存​​​取​​​,甚​​​至​​​是​​​在​​​一​​​部​​​運​​​作​​​中​​​的​​​系​​​統​​​上​​​,動​​​態​​​式​​​地​​​重​​​新​​​配​​​置​​​您​​​的​​​ cgroup。​​​cgconfig控​​​制​​​群​​​組​​​配​​​置​​​ )服​​​務​​​可​​​被​​​配​​​置​​​成​​​在​​​開​​​機​​​時​​​啟​​​用​​​,並​​​重​​​新​​​建​​​立​​​您​​​預​​​定​​​義​​​的​​​ cgroup,如​​​此​​​便​​​能​​​使​​​它​​​們​​​在​​​重​​​新​​​開​​​機​​​時​​​可​​​保​​​有​​​一​​​致​​​性​​​。​​​
透​​​過​​​使​​​用​​​ cgroup,系​​​統​​​管​​​理​​​員​​​能​​​取​​​得​​​分​​​配​​​、​​​處​​​理​​​優​​​先​​​順​​​序​​​、​​​拒​​​絕​​​、​​​管​​​理​​​,以​​​及​​​監​​​控​​​系​​​統​​​資​​​源​​​的​​​細​​​部​​​控​​​制​​​。​​​硬​​​體​​​資​​​源​​​可​​​機​​​敏​​​地​​​分​​​配​​​於​​​工​​​作​​​與​​​使​​​用​​​者​​​之​​​間​​​,並​​​提​​​昇​​​整​​​體​​​效​​​率​​​。​​​

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

Cgroup 是​​​透​​​過​​​階​​​層​​​式​​​的​​​方​​​式​​​來​​​管​​​理​​​的​​​,和​​​程​​​序​​​、​​​子​​​群​​​組​​​相​​​同​​​,都​​​會​​​由​​​它​​​們​​​的​​​ parent 繼​​​承​​​部​​​份​​​屬​​​性​​​。​​​然​​​而​​​,這​​​兩​​​個​​​模​​​型​​​之​​​間​​​有​​​所​​​不​​​同​​​。​​​

Linux 程​​​序​​​模​​​型​​​

Linux 系​​​統​​​上​​​的​​​所​​​有​​​程​​​序​​​皆​​​為​​​相​​​同​​​ parent 的​​​子​​​程​​​序​​​:init 程​​​序​​​,由​​​ kernel 在​​​開​​​機​​​時​​​執​​​行​​​,並​​​啟​​​用​​​其​​​它​​​程​​​序​​​(並​​​且​​​可​​​能​​​會​​​相​​​應​​​地​​​啟​​​用​​​它​​​們​​​自​​​己​​​的​​​子​​​程​​​序​​​)。​​​因​​​為​​​所​​​有​​​程​​​序​​​皆​​​源​​​自​​​於​​​單​​​獨​​​的​​​父​​​程​​​序​​​,因​​​此​​​ Linux 的​​​程​​​序​​​模​​​型​​​屬​​​於​​​單​​​獨​​​的​​​階​​​層​​​或​​​樹​​​狀​​​目​​​錄​​​。​​​
此​​​外​​​,所​​​有​​​除​​​了​​​ init 以​​​外​​​的​​​程​​​序​​​皆​​​會​​​繼​​​承​​​其​​​父​​​程​​​序​​​的​​​環​​​境​​​(例​​​如​​​ PATH 變​​​數​​​)[1] 與​​​特​​​定​​​屬​​​性​​​(例​​​如​​​開​​​放​​​式​​​的​​​檔​​​案​​​描​​​述​​​元​​​)。​​​

Cgroup 模​​​型​​​

Cgroup 與​​​程​​​序​​​的​​​相​​​似​​​點​​​為​​​:
  • 它​​​們​​​皆​​​屬​​​於​​​階​​​層​​​式​​​,並​​​且​​​
  • 子​​​ cgroup 會​​​繼​​​承​​​其​​​父​​​群​​​組​​​的​​​特​​​定​​​屬​​​性​​​。​​​
基​​​礎​​​差​​​異​​​就​​​是​​​在​​​同​​​一​​​部​​​系​​​統​​​上​​​,能​​​夠​​​同​​​時​​​存​​​在​​​許​​​多​​​不​​​同​​​的​​​ cgroup 階​​​層​​​。​​​若​​​ Linux 程​​​序​​​模​​​型​​​是​​​個​​​程​​​序​​​的​​​單​​​樹​​​狀​​​,那​​​麼​​​ cgroup 模​​​型​​​便​​​是​​​個​​​各​​​別​​​、​​​未​​​連​​​接​​​的​​​樹​​​狀​​​工​​​作​​​(例​​​如​​​程​​​序​​​)。​​​
多​​​重​​​各​​​別​​​的​​​ cgroup 階​​​層​​​是​​​必​​​要​​​的​​​,因​​​為​​​各​​​個​​​階​​​層​​​皆​​​連​​​至​​​了​​​「​​​一​​​個​​​或​​​更​​​多​​​」​​​個​​​「​​​子​​​系​​​統​​​」​​​。​​​子​​​系​​​統​​​[2]代​​​表​​​單​​​獨​​​的​​​資​​​源​​​,例​​​如​​​ CPU 時​​​間​​​或​​​記​​​憶​​​體​​​。​​​Red Hat Enterprise Linux 6 提​​​供​​​了​​​九​​​個​​​控​​​制​​​群​​​組​​​子​​​系​​​統​​​,以​​​名​​​稱​​​和​​​功​​​能​​​列​​​在​​​下​​​方​​​。​​​

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

  • blkio —​​​ 此​​​子​​​系​​​統​​​可​​​設​​​置​​​來​​​自​​​於​​​,以​​​及​​​至​​​區​​​塊​​​裝​​​置​​​(例​​​如​​​像​​​是​​​固​​​態​​​、​​​USB 等​​​等​​​的​​​實​​​體​​​磁​​​碟​​​)的​​​輸​​​入​​​/輸​​​出​​​存​​​取​​​限​​​制​​​。​​​
  • cpu —​​​ 此​​​子​​​系​​​統​​​使​​​用​​​了​​​排​​​程​​​器​​​,以​​​提​​​供​​​ CPU cgroup 工​​​作​​​的​​​存​​​取​​​權​​​限​​​。​​​
  • cpuacct —​​​ 此​​​子​​​系​​​統​​​會​​​自​​​動​​​產​​​生​​​ cgroup 中​​​的​​​工​​​作​​​所​​​使​​​用​​​的​​​ CPU 資​​​源​​​報​​​告​​​。​​​
  • cpuset —​​​ 此​​​子​​​系​​​統​​​會​​​將​​​個​​​別​​​的​​​ CPU 與​​​記​​​憶​​​體​​​節​​​點​​​分​​​配​​​給​​​ cgroup 中​​​的​​​工​​​作​​​。​​​
  • devices —​​​ 此​​​子​​​系​​​統​​​能​​​允​​​許​​​或​​​拒​​​絕​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​存​​​取​​​裝​​​置​​​。​​​
  • freezer —​​​ 此​​​子​​​系​​​統​​​可​​​中​​​止​​​或​​​復​​​原​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​。​​​
  • memory —​​​ 此​​​子​​​系​​​統​​​會​​​根​​​據​​​使​​​用​​​於​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​的​​​記​​​憶​​​體​​​資​​​源​​​,自​​​動​​​產​​​生​​​記​​​憶​​​體​​​報​​​告​​​,然​​​後​​​設​​​定​​​這​​​些​​​工​​​作​​​所​​​能​​​使​​​用​​​的​​​記​​​憶​​​體​​​限​​​制​​​:
  • net_cls —​​​ 此​​​子​​​系​​​統​​​會​​​以​​​一​​​個​​​ class 標​​​識​​​符​​​號​​​(classid)來​​​標​​​記​​​網​​​路​​​封​​​包​​​,這​​​能​​​讓​​​ Linux 流​​​量​​​控​​​制​​​器​​​(tc)辨​​​識​​​源​​​自​​​於​​​特​​​定​​​控​​​制​​​群​​​組​​​的​​​封​​​包​​​。​​​流​​​量​​​控​​​制​​​器​​​能​​​被​​​配​​​置​​​來​​​指​​​定​​​不​​​同​​​的​​​優​​​先​​​順​​​序​​​給​​​來​​​自​​​於​​​不​​​同​​​控​​​制​​​群​​​組​​​的​​​封​​​包​​​。​​​
  • ns —​​​ namespace 子​​​系​​​統​​​。​​​

注意

您​​​在​​​控​​​制​​​群​​​組​​​文​​​件​​​(例​​​如​​​ man page 或​​​是​​​ kernel 文​​​件​​​)中​​​,可​​​能​​​會​​​看​​​見​​​資​​​源​​​控​​​制​​​器​​​(resource controller)或​​​控​​​制​​​器​​​(controller)這​​​些​​​名​​​詞​​​。​​​這​​​兩​​​個​​​名​​​詞​​​皆​​​與​​​子​​​系​​​統​​​(subsystem)同​​​義​​​,這​​​是​​​因​​​為​​​子​​​系​​​統​​​一​​​般​​​會​​​排​​​程​​​資​​​源​​​,或​​​套​​​用​​​限​​​制​​​至​​​它​​​所​​​連​​​至​​​之​​​階​​​層​​​中​​​的​​​控​​​制​​​群​​​組​​​。​​​
子​​​系​​​統​​​(資​​​源​​​控​​​制​​​器​​​)的​​​定​​​義​​​非​​​常​​​地​​​一​​​般​​​:它​​​是​​​個​​​會​​​針​​​對​​​於​​​工​​​作​​​群​​​組​​​(例​​​如​​​程​​​序​​​)進​​​行​​​動​​​作​​​的​​​物​​​件​​​。​​​


[1] 父​​​程​​​序​​​能​​​在​​​將​​​環​​​境​​​傳​​​送​​​給​​​子​​​程​​​序​​​之​​​前​​​,先​​​進​​​行​​​修​​​改​​​。​​​
[2] 請​​​注​​​意​​​,子​​​系​​​統​​​在​​​ libcgroup man page 和​​​其​​​它​​​文​​​件​​​中​​​亦​​​稱​​​為​​​「​​​資​​​源​​​控​​​制​​​器​​​」​​​(resource controller),或​​​僅​​​是​​​「​​​控​​​制​​​器​​​」​​​(controller)。​​​