Red Hat Training

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

資​​​源​​​管​​​理​​​指​​​南​​​

Red Hat Enterprise Linux 6

在​​​ Red Hat Enterprise Linux 6 上​​​管​​​理​​​系​​​統​​​資​​​源​​​

版 1

Martin Prpič

Red Hat 工​​​程​​​部​​​出​​​版​​​中​​​心​​​

Rüdiger Landmann

Red Hat 工​​​程​​​部​​​出​​​版​​​中​​​心​​​

Douglas Silas

Red Hat 工​​​程​​​部​​​出​​​版​​​中​​​心​​​

摘要

在​​​ Red Hat Enterprise Linux 6 上​​​管​​​理​​​系​​​統​​​資​​​源​​​

章 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. 子​​​系​​​統​​​、​​​階​​​層​​​、​​​控​​​制​​​群​​​組​​​與​​​工​​​作​​​之​​​間​​​的​​​關​​​係​​​

請​​​記​​​得​​​,在​​​控​​​制​​​群​​​組​​​術​​​語​​​中​​​,系​​​統​​​程​​​序​​​會​​​被​​​稱​​​為​​​工​​​作​​​。​​​
以​​​下​​​為​​​幾​​​項​​​子​​​系​​​統​​​、​​​cgroup 階​​​層​​​與​​​工​​​作​​​之​​​間​​​之​​​關​​​係​​​上​​​的​​​規​​​則​​​,以​​​及​​​這​​​些​​​規​​​則​​​的​​​相​​​關​​​解​​​釋​​​。​​​
規​​​則​​​ 1

任​​​何​​​單​​​獨​​​子​​​系​​​統​​​(例​​​如​​​ cpu)最​​​多​​​皆​​​可​​​連​​​接​​​至​​​一​​​個​​​階​​​層​​​。​​​

因​​​為​​​如​​​此​​​,cpu 子​​​系​​​統​​​無​​​法​​​連​​​至​​​兩​​​個​​​不​​​同​​​的​​​階​​​層​​​。​​​
規​​​則​​​ 2

一​​​個​​​階​​​層​​​能​​​夠​​​連​​​接​​​一​​​個​​​或​​​更​​​多​​​個​​​子​​​系​​​統​​​。​​​

因​​​此​​​,cpu 和​​​ memory 子​​​系​​​統​​​(或​​​任​​​何​​​數​​​量​​​的​​​子​​​系​​​統​​​)能​​​連​​​接​​​至​​​一​​​個​​​單​​​獨​​​的​​​階​​​層​​​,不​​​過​​​它​​​們​​​不​​​可​​​連​​​至​​​任​​​何​​​其​​​它​​​階​​​層​​​。​​​
規​​​則​​​ 3

每​​​當​​​系​​​統​​​上​​​建​​​立​​​了​​​新​​​的​​​階​​​層​​​,系​​​統​​​上​​​的​​​所​​​有​​​工​​​作​​​一​​​開​​​始​​​都​​​會​​​是​​​該​​​階​​​層​​​的​​​預​​​設​​​控​​​制​​​群​​​組​​​的​​​成​​​員​​​,該​​​控​​​制​​​群​​​組​​​亦​​​稱​​​為​​​ root cgroup。​​​當​​​您​​​建​​​立​​​了​​​任​​​何​​​一​​​個​​​階​​​層​​​時​​​,系​​​統​​​上​​​的​​​各​​​項​​​工​​​作​​​,都​​​只​​​能​​​是​​​該​​​階​​​層​​​中​​​一​​​個​​​ cgroup 的​​​成​​​員​​​。​​​一​​​項​​​單​​​獨​​​的​​​工​​​作​​​能​​​包​​​含​​​在​​​多​​​個​​​控​​​制​​​群​​​組​​​中​​​,只​​​要​​​這​​​些​​​控​​​制​​​群​​​組​​​皆​​​位​​​於​​​不​​​同​​​的​​​階​​​層​​​中​​​。​​​當​​​工​​​作​​​成​​​為​​​相​​​同​​​階​​​層​​​中​​​,第​​​二​​​個​​​控​​​制​​​群​​​組​​​的​​​成​​​員​​​時​​​,它​​​便​​​會​​​被​​​由​​​該​​​階​​​層​​​中​​​的​​​第​​​一​​​個​​​控​​​制​​​群​​​組​​​中​​​移​​​除​​​。​​​一​​​項​​​工​​​作​​​不​​​會​​​有​​​任​​​何​​​時​​​候​​​處​​​於​​​相​​​同​​​階​​​層​​​中​​​的​​​兩​​​個​​​控​​​制​​​群​​​組​​​中​​​。​​​

因​​​此​​​,若​​​ cpu 和​​​ memory 子​​​系​​​統​​​連​​​至​​​了​​​一​​​個​​​名​​​為​​​ cpu_and_mem 的​​​階​​​層​​​,並​​​且​​​ net_cls 子​​​系​​​統​​​連​​​至​​​了​​​一​​​個​​​名​​​為​​​ net 的​​​階​​​層​​​,那​​​麼​​​一​​​項​​​執​​​行​​​中​​​的​​​ httpd 程​​​序​​​便​​​能​​​成​​​為​​​ cpu_and_mem 中​​​,任​​​何​​​一​​​個​​​控​​​制​​​群​​​組​​​的​​​成​​​員​​​,以​​​及​​​ net 中​​​,任​​​何​​​一​​​個​​​控​​​制​​​群​​​組​​​的​​​成​​​員​​​。​​​
cpu_and_mem 裡​​​、​​​屬​​​於​​​ http 程​​​序​​​之​​​控​​​制​​​群​​​組​​​,可​​​能​​​會​​​將​​​它​​​的​​​ CPU 時​​​間​​​限​​​制​​​為​​​其​​​它​​​程​​​序​​​所​​​配​​​置​​​的​​​一​​​半​​​,並​​​將​​​它​​​的​​​記​​​憶​​​體​​​使​​​用​​​量​​​限​​​制​​​為​​​最​​​大​​​ 1,024 MB。​​​此​​​外​​​,在​​​ net 中​​​,它​​​所​​​屬​​​的​​​控​​​制​​​群​​​組​​​可​​​能​​​會​​​將​​​它​​​的​​​傳​​​輸​​​率​​​限​​​制​​​為​​​每​​​秒​​​ 30 MB。​​​
當​​​第​​​一​​​個​​​階​​​層​​​被​​​建​​​立​​​時​​​,系​​​統​​​上​​​的​​​所​​​有​​​工​​​作​​​都​​​會​​​屬​​​於​​​至​​​少​​​一​​​個​​​控​​​制​​​群​​​組​​​中​​​的​​​成​​​員​​​:root cgroup。​​​因​​​此​​​當​​​使​​​用​​​控​​​制​​​群​​​組​​​時​​​,所​​​有​​​系​​​統​​​工​​​作​​​皆​​​會​​​屬​​​於​​​至​​​少​​​一​​​個​​​ cgroup。​​​
規​​​則​​​ 4

系​​​統​​​上​​​任​​​何​​​會​​​自​​​行​​​分​​​叉​​​的​​​程​​​序​​​(工​​​作​​​),皆​​​會​​​建​​​立​​​一​​​項​​​子​​​程​​​序​​​(工​​​作​​​)。​​​子​​​工​​​作​​​會​​​自​​​動​​​地​​​成​​​為​​​其​​​父​​​程​​​序​​​所​​​屬​​​之​​​所​​​有​​​控​​​制​​​群​​​組​​​的​​​成​​​員​​​。​​​接​​​著​​​,子​​​工​​​作​​​便​​​可​​​視​​​需​​​求​​​被​​​移​​​至​​​不​​​同​​​的​​​控​​​制​​​群​​​組​​​,不​​​過​​​一​​​開​​​始​​​,它​​​總​​​是​​​會​​​繼​​​承​​​其​​​父​​​工​​​作​​​的​​​控​​​制​​​群​​​組​​​(以​​​程​​​序​​​的​​​術​​​語​​​來​​​講​​​為​​​「​​​環​​​境​​​」​​​)。​​​

因​​​此​​​,請​​​考​​​量​​​ httpd 工​​​作​​​,它​​​是​​​個​​​在​​​ cpu_and_mem 階​​​層​​​中​​​,名​​​為​​​ half_cpu_1gb_max 的​​​控​​​制​​​群​​​組​​​中​​​的​​​成​​​員​​​,並​​​且​​​也​​​是​​​ net 階​​​層​​​中​​​,一​​​個​​​名​​​為​​​ trans_rate_30 的​​​控​​​制​​​群​​​組​​​中​​​的​​​成​​​員​​​。​​​當​​​該​​​ httpd 程​​​序​​​將​​​它​​​自​​​己​​​分​​​支​​​時​​​,它​​​的​​​子​​​程​​​序​​​將​​​會​​​自​​​動​​​地​​​成​​​為​​​ half_cpu_1gb_max 控​​​制​​​群​​​組​​​以​​​及​​​ trans_rate_30 控​​​制​​​群​​​組​​​的​​​成​​​員​​​。​​​它​​​會​​​繼​​​承​​​其​​​父​​​工​​​作​​​所​​​屬​​​的​​​相​​​同​​​的​​​控​​​制​​​群​​​組​​​。​​​
在​​​這​​​之​​​後​​​,父​​​工​​​作​​​與​​​子​​​工​​​作​​​便​​​會​​​是​​​完​​​全​​​獨​​​立​​​的​​​:更​​​改​​​一​​​項​​​工​​​作​​​所​​​屬​​​的​​​控​​​制​​​群​​​組​​​不​​​會​​​影​​​響​​​其​​​它​​​工​​​作​​​。​​​更​​​改​​​父​​​工​​​作​​​的​​​控​​​制​​​群​​​組​​​亦​​​不​​​會​​​對​​​其​​​子​​​工​​​作​​​有​​​任​​​何​​​影​​​響​​​。​​​概​​​述​​​:所​​​有​​​子​​​工​​​作​​​一​​​開​​​始​​​皆​​​會​​​繼​​​承​​​與​​​其​​​父​​​工​​​作​​​相​​​同​​​的​​​控​​​制​​​群​​​組​​​成​​​員​​​資​​​格​​​,然​​​而​​​這​​​些​​​成​​​員​​​資​​​格​​​可​​​之​​​後​​​更​​​改​​​或​​​移​​​除​​​。​​​

1.3. 資​​​源​​​管​​​理​​​隱​​​含​​​式​​​

  • 因​​​為​​​工​​​作​​​只​​​能​​​屬​​​於​​​任​​​何​​​一​​​個​​​階​​​層​​​中​​​的​​​一​​​個​​​控​​​制​​​群​​​組​​​,因​​​此​​​只​​​有​​​一​​​種​​​方​​​式​​​能​​​使​​​子​​​系​​​統​​​限​​​制​​​或​​​影​​​響​​​工​​​作​​​。​​​這​​​是​​​種​​​邏​​​輯​​​:一​​​項​​​功​​​能​​​,而​​​非​​​限​​​制​​​。​​​
  • 您​​​可​​​將​​​數​​​個​​​子​​​系​​​統​​​分​​​組​​​在​​​一​​​起​​​,如​​​此​​​一​​​來​​​它​​​們​​​便​​​會​​​影​​​響​​​單​​​獨​​​階​​​層​​​中​​​的​​​所​​​有​​​工​​​作​​​。​​​因​​​為​​​該​​​階​​​層​​​中​​​的​​​控​​​制​​​群​​​組​​​設​​​置​​​了​​​不​​​同​​​的​​​參​​​數​​​,因​​​此​​​這​​​些​​​工​​​作​​​的​​​影​​​響​​​會​​​有​​​所​​​不​​​同​​​。​​​
  • 您​​​可​​​能​​​有​​​時​​​必​​​須​​​重​​​構​​​一​​​個​​​階​​​層​​​。​​​比​​​方​​​說​​​將​​​一​​​個​​​子​​​系​​​統​​​由​​​連​​​接​​​了​​​數​​​個​​​子​​​系​​​統​​​的​​​階​​​層​​​中​​​移​​​除​​​,並​​​將​​​它​​​連​​​至​​​一​​​個​​​新​​​的​​​、​​​獨​​​立​​​的​​​階​​​層​​​。​​​
  • 相​​​反​​​地​​​,若​​​是​​​無​​​須​​​將​​​子​​​系​​​統​​​分​​​開​​​在​​​個​​​別​​​的​​​階​​​層​​​上​​​,您​​​可​​​將​​​階​​​層​​​移​​​除​​​並​​​將​​​其​​​子​​​系​​​統​​​連​​​至​​​既​​​有​​​的​​​階​​​層​​​。​​​
  • 這​​​項​​​設​​​計​​​能​​​讓​​​您​​​輕​​​易​​​地​​​使​​​用​​​控​​​制​​​群​​​組​​​,例​​​如​​​為​​​單​​​獨​​​階​​​層​​​(例​​​如​​​僅​​​連​​​接​​​了​​​ cpu 與​​​記​​​憶​​​體​​​子​​​系​​​統​​​的​​​階​​​層​​​)中​​​的​​​特​​​定​​​工​​​作​​​設​​​定​​​幾​​​個​​​參​​​數​​​。​​​
  • 此​​​設​​​計​​​能​​​讓​​​您​​​進​​​行​​​高​​​度​​​指​​​定​​​的​​​配​​​置​​​:系​​​統​​​上​​​各​​​項​​​工​​​作​​​(程​​​序​​​)皆​​​能​​​是​​​各​​​個​​​階​​​層​​​的​​​成​​​員​​​,並​​​且​​​每​​​個​​​階​​​層​​​皆​​​連​​​接​​​了​​​一​​​個​​​單​​​獨​​​的​​​子​​​系​​​統​​​。​​​此​​​類​​​型​​​的​​​配​​​置​​​能​​​讓​​​系​​​統​​​管​​​理​​​員​​​擁​​​有​​​所​​​有​​​單​​​獨​​​工​​​作​​​的​​​所​​​有​​​絕​​​對​​​控​​​制​​​權​​​。​​​


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

章 2. 使​​​用​​​控​​​制​​​群​​​組​​​

控​​​制​​​群​​​組​​​最​​​容​​​易​​​的​​​使​​​用​​​方​​​法​​​就​​​是​​​安​​​裝​​​ libcgroup 套​​​件​​​,此​​​套​​​件​​​包​​​含​​​了​​​數​​​個​​​與​​​ cgroup 相​​​聯​​​的​​​指​​​令​​​列​​​工​​​具​​​程​​​式​​​,以​​​及​​​其​​​相​​​聯​​​的​​​ man page。​​​您​​​可​​​「​​​掛​​​載​​​」​​​階​​​層​​​,並​​​使​​​用​​​任​​​何​​​系​​​統​​​上​​​的​​​ shell 指​​​令​​​和​​​工​​​具​​​程​​​式​​​,設​​​置​​​ cgroup 參​​​數​​​(非​​​一​​​致​​​性​​​)。​​​然​​​而​​​,使​​​用​​​ libcgroup 所​​​提​​​供​​​的​​​工​​​具​​​程​​​式​​​可​​​簡​​​化​​​程​​​序​​​與​​​延​​​伸​​​功​​​能​​​。​​​因​​​此​​​,本​​​指​​​南​​​內​​​容​​​專​​​注​​​於​​​ libcgroup 指​​​令​​​。​​​在​​​大​​​部​​​分​​​情​​​況​​​下​​​,我​​​們​​​皆​​​包​​​含​​​了​​​相​​​等​​​的​​​ shell 指​​​令​​​,以​​​協​​​助​​​描​​​述​​​基​​​礎​​​機​​​制​​​。​​​然​​​而​​​,我​​​們​​​建​​​議​​​您​​​使​​​用​​​ libcgroup 指​​​令​​​。​​​

注意

若​​​要​​​使​​​用​​​ cgroups,首​​​先​​​請​​​以​​​ root 身​​​份​​​,透​​​過​​​下​​​列​​​指​​​令​​​確​​​認​​​ libcgroup 套​​​件​​​已​​​安​​​裝​​​在​​​您​​​的​​​系​​​統​​​上​​​:
~]# yum install libcgroup

2.1. cgconfig 服​​​務​​​

透​​​過​​​ libcgroup 套​​​件​​​安​​​裝​​​的​​​ cgconfig 服​​​務​​​,提​​​供​​​了​​​方​​​便​​​地​​​建​​​立​​​階​​​層​​​、​​​將​​​子​​​系​​​統​​​連​​​接​​​至​​​階​​​層​​​,並​​​在​​​這​​​些​​​階​​​層​​​中​​​管​​​理​​​ cgroup 的​​​方​​​式​​​。​​​我​​​們​​​建​​​議​​​您​​​使​​​用​​​ cgconfig 來​​​管​​​理​​​您​​​系​​​統​​​上​​​的​​​階​​​層​​​和​​​ cgroup。​​​
就​​​預​​​設​​​值​​​,在​​​ Red Hat Enterprise Linux 6 上​​​,cgconfig 服​​​務​​​不​​​會​​​被​​​啟​​​用​​​。​​​當​​​您​​​透​​​過​​​ chkconfig 啟​​​用​​​該​​​項​​​服​​​務​​​時​​​,它​​​會​​​讀​​​取​​​控​​​制​​​群​​​組​​​配​​​置​​​檔​​​案​​​ /etc/cgconfig.conf。​​​如​​​此​​​一​​​來​​​,控​​​制​​​群​​​組​​​會​​​在​​​ session 執​​​行​​​時​​​重​​​新​​​建​​​立​​​,並​​​持​​​續​​​運​​​行​​​。​​​根​​​據​​​配​​​置​​​檔​​​案​​​的​​​內​​​容​​​,cgconfig 會​​​建​​​立​​​階​​​層​​​、​​​掛​​​載​​​所​​​需​​​的​​​檔​​​案​​​系​​​統​​​、​​​建​​​立​​​控​​​制​​​群​​​組​​​、​​​並​​​為​​​每​​​個​​​群​​​組​​​設​​​定​​​子​​​系​​​統​​​。​​​
與​​​ libcgroup 套​​​件​​​一​​​起​​​安​​​裝​​​的​​​預​​​設​​​ /etc/cgconfig.conf 檔​​​案​​​,會​​​為​​​各​​​系​​​統​​​建​​​立​​​與​​​掛​​​載​​​個​​​別​​​的​​​階​​​層​​​,並​​​將​​​子​​​系​​​統​​​連​​​接​​​至​​​這​​​些​​​階​​​層​​​。​​​
若​​​您​​​停​​​用​​​了​​​ cgconfig 服​​​務​​​(透​​​過​​​ service cgconfig stop),它​​​會​​​將​​​它​​​所​​​掛​​​載​​​的​​​所​​​有​​​階​​​層​​​卸​​​載​​​。​​​

2.1.1. cgconfig.conf 檔​​​案​​​

/etc/cgconfig.conf 檔​​​案​​​包​​​含​​​了​​​兩​​​種​​​主​​​要​​​的​​​條​​​目​​​:mount 與​​​ group。​​​掛​​​載​​​條​​​目​​​會​​​建​​​立​​​、​​​掛​​​載​​​階​​​層​​​,使​​​之​​​成​​​為​​​虛​​​擬​​​檔​​​案​​​系​​​統​​​;並​​​把​​​子​​​系​​​統​​​連​​​結​​​到​​​這​​​些​​​階​​​層​​​上​​​。​​​舉​​​例​​​來​​​說​​​:
mount {
    <controller> = <path>;
    …
}
範​​​例​​​用​​​法​​​請​​​見​​​〈​​​範例 2.1, “建​​​立​​​掛​​​載​​​點​​​”〉​​​。​​​

範例 2.1. 建​​​立​​​掛​​​載​​​點​​​

以​​​下​​​範​​​例​​​會​​​為​​​ cpuset 子​​​系​​​統​​​建​​​立​​​一​​​組​​​階​​​層​​​:
mount {
    cpuset = /cgroup/cpu;
}
這​​​命​​​令​​​列​​​相​​​當​​​於​​​:
~]# mkdir /cgroup/cpu
~]# mount -t cgroup -o cpu cpu /cgroup/cpu
群​​​組​​​條​​​目​​​會​​​建​​​立​​​控​​​制​​​群​​​組​​​,並​​​設​​​定​​​子​​​系​​​統​​​參​​​數​​​。​​​群​​​組​​​條​​​目​​​會​​​透​​​過​​​以​​​下​​​語​​​法​​​定​​​義​​​:
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 daemon 建​​​立​​​控​​​制​​​群​​​組​​​,賦​​​予​​​ sqladmin 群​​​組​​​的​​​使​​​用​​​者​​​把​​​任​​​務​​​加​​​入​​​控​​​制​​​群​​​組​​​的​​​權​​​限​​​,並​​​賦​​​予​​​ root 使​​​用​​​者​​​修​​​改​​​子​​​系​​​統​​​參​​​數​​​的​​​權​​​限​​​。​​​
group daemons/sql {
    perm {
        task {
            uid = root;
            gid = sqladmin;
        } admin {
            uid = root;
            gid = root;
        }
    } cpu {
        cpu.shares = 100;
    }
}
跟​​​〈​​​範例 2.1, “建​​​立​​​掛​​​載​​​點​​​”〉​​​裡​​​的​​​掛​​​載​​​點​​​範​​​例​​​結​​​合​​​之​​​後​​​,相​​​當​​​於​​​以​​​下​​​指​​​令​​​:
~]# 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

注意

要​​​讓​​​ /etc/cgconfig.conf 裡​​​的​​​改​​​變​​​生​​​效​​​,請​​​重​​​新​​​啟​​​動​​​ cgconfig 服​​​務​​​:
~]# service cgconfig restart
當​​​您​​​安​​​裝​​​ cgroups 時​​​,配​​​置​​​範​​​例​​​會​​​寫​​​入​​​ /etc/cgconfig.conf。​​​以​​​ # 符​​​號​​​開​​​始​​​的​​​每​​​一​​​行​​​表​​​示​​​註​​​解​​​,cgconfig 服​​​務​​​不​​​會​​​處​​​理​​​。​​​

2.2. 建​​​立​​​階​​​層​​​和​​​連​​​接​​​子​​​系​​​統​​​

警告

下​​​列​​​指​​​示​​​涵​​​蓋​​​了​​​建​​​立​​​新​​​階​​​層​​​,並​​​將​​​子​​​系​​​統​​​連​​​至​​​此​​​階​​​層​​​的​​​指​​​示​​​,它​​​假​​​設​​​了​​​控​​​制​​​群​​​組​​​尚​​​未​​​配​​​置​​​於​​​您​​​的​​​系​​​統​​​上​​​。​​​在​​​此​​​情​​​況​​​下​​​,這​​​些​​​指​​​示​​​將​​​不​​​會​​​影​​​響​​​系​​​統​​​的​​​作​​​業​​​。​​​然​​​而​​​,更​​​改​​​一​​​個​​​含​​​有​​​工​​​作​​​的​​​控​​​制​​​群​​​組​​​的​​​可​​​調​​​整​​​參​​​數​​​,則​​​會​​​即​​​刻​​​影​​​響​​​這​​​些​​​工​​​作​​​。​​​本​​​指​​​南​​​會​​​在​​​第​​​一​​​次​​​更​​​改​​​可​​​能​​​會​​​影​​​響​​​一​​​或​​​更​​​多​​​項​​​工​​​作​​​的​​​可​​​調​​​整​​​控​​​制​​​群​​​組​​​參​​​數​​​時​​​,進​​​行​​​警​​​告​​​。​​​
在​​​一​​​部​​​已​​​(透​​​過​​​手​​​動​​​式​​​或​​​ cgconfig 服​​​務​​​)配​​​置​​​了​​​控​​​制​​​群​​​組​​​的​​​系​​​統​​​上​​​,這​​​些​​​指​​​令​​​將​​​會​​​失​​​敗​​​,除​​​非​​​您​​​先​​​將​​​會​​​影​​​響​​​系​​​統​​​作​​​業​​​的​​​既​​​有​​​階​​​層​​​卸​​​載​​​。​​​請​​​勿​​​在​​​生​​​產​​​系​​​統​​​上​​​試​​​驗​​​這​​​些​​​指​​​示​​​。​​​
若​​​要​​​建​​​立​​​一​​​個​​​階​​​層​​​,並​​​將​​​子​​​系​​​統​​​連​​​至​​​該​​​階​​​層​​​,請​​​以​​​ root 身​​​份​​​編​​​輯​​​ /etc/cgconfig.conf 檔​​​案​​​的​​​ mount 部​​​份​​​。​​​mount 部​​​份​​​中​​​的​​​項​​​目​​​格​​​式​​​如​​​下​​​:
子​​​系​​​統​​​ = /cgroup/階​​​層​​​;
當​​​ 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 身​​​份​​​為​​​階​​​層​​​建​​​立​​​「​​​掛​​​載​​​點​​​」​​​。​​​請​​​在​​​掛​​​載​​​點​​​中​​​包​​​含​​​控​​​制​​​群​​​組​​​的​​​名​​​稱​​​:
~]# 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. 使​​​用​​​掛​​​載​​​指​​​令​​​來​​​連​​​接​​​子​​​系​​​統​​​

在​​​此​​​範​​​例​​​中​​​,有​​​個​​​名​​​為​​​ /cgroup/cpu_and_mem 的​​​目​​​錄​​​已​​​存​​​在​​​,它​​​會​​​被​​​作​​​為​​​是​​​我​​​們​​​所​​​建​​​立​​​之​​​階​​​層​​​的​​​掛​​​載​​​點​​​。​​​我​​​們​​​將​​​ cpu、​​​cpuset 和​​​ memory 子​​​系​​​統​​​連​​​至​​​一​​​個​​​我​​​們​​​命​​​名​​​為​​​ cpu_and_mem 的​​​階​​​層​​​,並​​​ mount cpu_and_mem 階​​​層​​​於​​​ /cgroup/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
此​​​輸​​​出​​​顯​​​示​​​了​​​:
  • cpu、​​​cpuset 和​​​ memory 子​​​系​​​統​​​連​​​至​​​了​​​一​​​個​​​掛​​​載​​​於​​​ /cgroup/cpu_and_mem 上​​​的​​​階​​​層​​​,並​​​且​​​
  • 基​​​於​​​缺​​​少​​​相​​​對​​​映​​​的​​​掛​​​載​​​點​​​,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 指​​​令​​​現​​​在​​​顯​​​示​​​了​​​ cpuacct 已​​​連​​​至​​​ cpu_and_mem 階​​​層​​​:
~]# 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 指​​​令​​​來​​​卸​​​載​​​控​​​制​​​群​​​組​​​的​​​階​​​層​​​:
~]# umount /cgroup/name
例​​​如​​​:
~]# umount /cgroup/cpu_and_mem
若​​​階​​​層​​​目​​​前​​​是​​​空​​​的​​​(也​​​就​​​是​​​說​​​它​​​只​​​包​​​含​​​了​​​ root 控​​​制​​​群​​​組​​​),該​​​階​​​層​​​將​​​會​​​在​​​卸​​​載​​​時​​​被​​​停​​​用​​​。​​​若​​​階​​​層​​​包​​​含​​​任​​​何​​​其​​​它​​​控​​​制​​​群​​​組​​​,儘​​​管​​​該​​​階​​​層​​​已​​​卸​​​載​​​,它​​​在​​​ kernel 中​​​也​​​會​​​保​​​持​​​為​​​啟​​​用​​​狀​​​態​​​。​​​
若​​​要​​​移​​​除​​​階​​​層​​​,請​​​在​​​卸​​​載​​​階​​​層​​​之​​​前​​​,確​​​認​​​所​​​有​​​子​​​群​​​組​​​皆​​​已​​​移​​​除​​​,或​​​使​​​用​​​ cgclear 指​​​令​​​,來​​​停​​​用​​​就​​​算​​​是​​​非​​​空​​​的​​​階​​​層​​​ —​​​ 請​​​參​​​閱​​​〈​​​節 2.11, “卸​​​除​​​控​​​制​​​群​​​組​​​”〉​​​。​​​

2.5. 建​​​立​​​控​​​制​​​群​​​組​​​

使​​​用​​​ cgcreate 指​​​令​​​來​​​建​​​立​​​控​​​制​​​群​​​組​​​。​​​cgcreate 的​​​語​​​法​​​為​​​:cgcreate -t uid:gid -a uid:gid -g subsystems:path ,其​​​中​​​:
  • -t(選​​​用​​​)—​​​ 指​​​定​​​使​​​用​​​者​​​(透​​​過​​​使​​​用​​​者​​​ ID,也​​​就​​​是​​​ uid)以​​​及​​​群​​​組​​​(透​​​過​​​群​​​組​​​ ID,亦​​​即​​​ gid)來​​​擁​​​有​​​ tasks 偽​​​檔​​​案​​​,給​​​此​​​控​​​制​​​群​​​組​​​使​​​用​​​。​​​該​​​使​​​用​​​者​​​可​​​新​​​增​​​工​​​作​​​至​​​控​​​制​​​群​​​組​​​。​​​

    注意

    請​​​注​​​意​​​,由​​​控​​​制​​​群​​​組​​​移​​​除​​​工​​​作​​​的​​​唯​​​一​​​方​​​法​​​就​​​是​​​將​​​它​​​移​​​至​​​不​​​同​​​的​​​控​​​制​​​群​​​組​​​。​​​若​​​要​​​移​​​動​​​一​​​項​​​工​​​作​​​,使​​​用​​​者​​​必​​​須​​​擁​​​有​​​ destination 控​​​制​​​群​​​組​​​的​​​寫​​​入​​​權​​​限​​​;來​​​源​​​控​​​制​​​群​​​組​​​的​​​寫​​​入​​​權​​​限​​​並​​​不​​​重​​​要​​​。​​​
  • -a(選​​​用​​​):讓​​​使​​​用​​​者​​​(透​​​過​​​使​​​用​​​者​​​ ID,也​​​就​​​是​​​ uid)以​​​及​​​群​​​組​​​(透​​​過​​​群​​​組​​​ ID,亦​​​即​​​ gid)來​​​擁​​​有​​​所​​​有​​​偽​​​檔​​​案​​​,而​​​不​​​是​​​讓​​​此​​​控​​​制​​​群​​​組​​​的​​​ tasks 擁​​​有​​​。​​​這​​​使​​​用​​​者​​​可​​​以​​​修​​​改​​​擁​​​有​​​系​​​統​​​資​​​源​​​的​​​控​​​制​​​群​​​組​​​之​​​任​​​務​​​。​​​
  • -g —​​​ 指​​​定​​​控​​​制​​​群​​​組​​​應​​​建​​​立​​​於​​​哪​​​個​​​階​​​層​​​中​​​,作​​​為​​​以​​​逗​​​號​​​區​​​隔​​​開​​​、​​​與​​​這​​​些​​​階​​​層​​​相​​​聯​​​的​​​子​​​系​​​統​​​。​​​若​​​此​​​清​​​單​​​中​​​的​​​子​​​系​​​統​​​位​​​於​​​不​​​同​​​的​​​階​​​層​​​中​​​,那​​​麼​​​群​​​組​​​便​​​會​​​建​​​立​​​於​​​各​​​個​​​這​​​些​​​階​​​層​​​中​​​。​​​階​​​層​​​之​​​後​​​會​​​包​​​含​​​一​​​個​​​冒​​​號​​​,以​​​及​​​與​​​階​​​層​​​相​​​關​​​之​​​子​​​群​​​組​​​的​​​路​​​徑​​​。​​​請​​​勿​​​在​​​路​​​徑​​​中​​​包​​​含​​​階​​​層​​​的​​​掛​​​載​​​點​​​。​​​
    比​​​方​​​說​​​,位​​​於​​​ /cgroup/cpu_and_mem/lab1/ 目​​​錄​​​的​​​控​​​制​​​群​​​組​​​會​​​稱​​​為​​​ lab1 —​​​ 它​​​的​​​路​​​徑​​​已​​​獨​​​特​​​地​​​指​​​定​​​了​​​,因​​​為​​​一​​​個​​​子​​​系​​​統​​​最​​​多​​​只​​​能​​​屬​​​於​​​一​​​個​​​階​​​層​​​。​​​此​​​外​​​,請​​​注​​​意​​​群​​​組​​​是​​​由​​​控​​​制​​​群​​​組​​​所​​​建​​​立​​​於​​​的​​​所​​​有​​​階​​​層​​​中​​​的​​​子​​​系​​​統​​​所​​​控​​​制​​​的​​​,儘​​​管​​​這​​​些​​​子​​​系​​​統​​​未​​​指​​​定​​​於​​​ cgcreate 指​​​令​​​中​​​ —​​​ 請​​​參​​​閱​​​ 範例 2.5, “cgcreate 使​​​用​​​方​​​法​​​”。​​​
因​​​為​​​相​​​同​​​階​​​層​​​中​​​的​​​所​​​有​​​控​​​制​​​群​​​組​​​皆​​​擁​​​有​​​相​​​同​​​的​​​控​​​制​​​器​​​,因​​​此​​​子​​​群​​​組​​​會​​​擁​​​有​​​與​​​其​​​父​​​群​​​組​​​相​​​同​​​的​​​控​​​制​​​器​​​。​​​

範例 2.5. cgcreate 使​​​用​​​方​​​法​​​

考​​​量​​​一​​​部​​​系​​​統​​​,其​​​ cpu 和​​​ memory 子​​​系​​​統​​​一​​​起​​​掛​​​載​​​於​​​ cpu_and_mem 階​​​層​​​中​​​,並​​​且​​​ 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 指​​​令​​​:
~]# mkdir /cgroup/hierarchy/name/child_name
例​​​如​​​:
~]# mkdir /cgroup/cpuset/lab1/group1

2.6. 移​​​除​​​控​​​制​​​群​​​組​​​

以​​​ cgdelete 移​​​除​​​控​​​制​​​群​​​組​​​,其​​​語​​​法​​​與​​​ cgcreate 相​​​似​​​。​​​請​​​執​​​行​​​:cgdelete 子​​​系​​​統​​​:路​​​徑​​​,而​​​:
  • 子​​​系​​​統​​​代​​​表​​​一​​​個​​​以​​​逗​​​號​​​區​​​隔​​​開​​​的​​​子​​​系​​​統​​​清​​​單​​​。​​​
  • 路​​​徑​​​代​​​表​​​與​​​階​​​層​​​之​​​ root 相​​​關​​​的​​​控​​​制​​​群​​​組​​​路​​​徑​​​。​​​
例​​​如​​​:
~]# cgdelete cpu,net_cls:/test-subgroup
cgdelete 亦​​​可​​​遞​​​迴​​​地​​​透​​​過​​​ -r 選​​​項​​​,移​​​除​​​所​​​有​​​子​​​群​​​組​​​。​​​
當​​​您​​​刪​​​除​​​控​​​制​​​群​​​組​​​時​​​,它​​​所​​​有​​​的​​​工​​​作​​​皆​​​會​​​移​​​至​​​它​​​的​​​父​​​群​​​組​​​中​​​。​​​

2.7. 設​​​定​​​參​​​數​​​

請​​​以​​​一​​​組​​​含​​​有​​​權​​​限​​​的​​​使​​​用​​​者​​​帳​​​號​​​執​​​行​​​ cgset 指​​​令​​​來​​​設​​​置​​​子​​​系​​​統​​​參​​​數​​​,以​​​修​​​改​​​相​​​關​​​的​​​控​​​制​​​群​​​組​​​。​​​比​​​方​​​說​​​,若​​​ /cgroup/cpuset/group1 存​​​在​​​的​​​話​​​,請​​​以​​​下​​​列​​​指​​​令​​​來​​​指​​​定​​​此​​​群​​​組​​​擁​​​有​​​其​​​存​​​取​​​權​​​限​​​的​​​ CPU:
cpuset]# cgset -r cpuset.cpus=0-1 group1
cgset 的​​​語​​​法​​​為​​​:cgset -r 參​​​數​​​=值​​​ 控​​​制​​​群​​​組​​​路​​​徑​​​ ,而​​​:
  • 參​​​數​​​代​​​表​​​欲​​​設​​​置​​​的​​​參​​​數​​​,這​​​與​​​控​​​制​​​群​​​組​​​目​​​錄​​​中​​​的​​​檔​​​案​​​相​​​應​​​
  • 值​​​為​​​參​​​數​​​的​​​值​​​
  • path_to_cgroup 代​​​表​​​與​​​階​​​層​​​ root 相​​​關​​​的​​​控​​​制​​​群​​​組​​​之​​​路​​​徑​​​。​​​比​​​方​​​說​​​,若​​​要​​​設​​​置​​​ root 群​​​組​​​(如​​​果​​​ /cgroup/cpuacct 存​​​在​​​的​​​話​​​)的​​​參​​​數​​​,請​​​執​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 /
    此​​​外​​​,因​​​為​​​ . 與​​​ root 群​​​組​​​相​​​關​​​(也​​​就​​​是​​​ root 群​​​組​​​本​​​身​​​),因​​​此​​​您​​​亦​​​可​​​執​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 .
    然​​​而​​​,請​​​注​​​意​​​ / 為​​​建​​​議​​​的​​​語​​​法​​​。​​​

    注意

    只​​​有​​​一​​​小​​​部​​​份​​​的​​​參​​​數​​​可​​​以​​​用​​​來​​​設​​​定​​​ root 群​​​組​​​(例​​​如​​​上​​​述​​​範​​​例​​​所​​​顯​​​示​​​的​​​ cpuacct.usage)。​​​這​​​是​​​因​​​為​​​ root 群​​​組​​​擁​​​有​​​所​​​有​​​的​​​現​​​有​​​資​​​源​​​,因​​​此​​​透​​​過​​​定​​​義​​​某​​​些​​​參​​​數​​​(例​​​如​​​ cpuset.cpu 參​​​數​​​)以​​​限​​​制​​​現​​​有​​​程​​​序​​​,是​​​沒​​​有​​​道​​​理​​​的​​​。​​​
    若​​​要​​​設​​​置​​​ group1 參​​​數​​​(也​​​就​​​是​​​ root 群​​​組​​​的​​​一​​​個​​​子​​​群​​​組​​​),請​​​執​​​行​​​:
    cpuacct]# cgset -r cpuacct.usage=0 group1
    群​​​組​​​名​​​稱​​​後​​​的​​​斜​​​線​​​(例​​​如​​​ cpuacct.usage=0 group1/)乃​​​非​​​必​​​要​​​的​​​。​​​
您​​​可​​​以​​​ cgset 設​​​置​​​的​​​值​​​取​​​決​​​於​​​特​​​定​​​階​​​層​​​中​​​上​​​層​​​所​​​設​​​置​​​的​​​值​​​。​​​比​​​方​​​說​​​,若​​​ group1 被​​​限​​​制​​​為​​​在​​​一​​​部​​​系​​​統​​​上​​​只​​​使​​​用​​​ CPU 0,您​​​無​​​法​​​設​​​置​​​ group1/subgroup1 來​​​使​​​用​​​ CPUs 0 和​​​ 1,或​​​是​​​只​​​使​​​用​​​ CPU 1。​​​
您​​​亦​​​可​​​使​​​用​​​ cgset 來​​​將​​​一​​​個​​​控​​​制​​​群​​​組​​​中​​​的​​​參​​​數​​​複​​​製​​​至​​​另​​​一​​​個​​​既​​​有​​​的​​​控​​​制​​​群​​​組​​​中​​​。​​​例​​​如​​​:
~]# cgset --copy-from group1/ group2/
透​​​過​​​ cgset 來​​​複​​​製​​​參​​​數​​​的​​​語​​​法​​​為​​​:cgset --copy-from path_to_source_cgroup path_to_target_cgroup,而​​​:
  • path_to_source_cgroup 代​​​表​​​與​​​階​​​層​​​之​​​ root 群​​​組​​​相​​​關​​​,欲​​​複​​​製​​​其​​​參​​​數​​​的​​​控​​​制​​​群​​​組​​​之​​​路​​​徑​​​
  • path_to_target_cgroup 是​​​目​​​的​​​地​​​控​​​制​​​群​​​組​​​的​​​路​​​徑​​​,與​​​階​​​層​​​之​​​ root 群​​​組​​​相​​​關​​​
在​​​您​​​由​​​一​​​個​​​群​​​組​​​複​​​製​​​參​​​數​​​至​​​另​​​一​​​群​​​組​​​前​​​,請​​​確​​​認​​​各​​​子​​​系​​​統​​​的​​​所​​​有​​​必​​​要​​​參​​​數​​​皆​​​已​​​設​​​置​​​,否​​​則​​​指​​​令​​​將​​​會​​​失​​​敗​​​。​​​欲​​​知​​​必​​​要​​​參​​​數​​​的​​​詳​​​細​​​資​​​訊​​​,請​​​參​​​閱​​​〈​​​重​​​要​​​ —​​​ 必​​​要​​​的​​​參​​​數​​​〉​​​。​​​

額​​​外​​​方​​​式​​​

若​​​要​​​直​​​接​​​設​​​置​​​一​​​個​​​控​​​制​​​群​​​組​​​中​​​的​​​子​​​系​​​統​​​的​​​參​​​數​​​,請​​​透​​​過​​​使​​​用​​​ echo 指​​​令​​​來​​​將​​​值​​​插​​​入​​​至​​​相​​​聯​​​的​​​子​​​系​​​統​​​偽​​​檔​​​案​​​中​​​。​​​比​​​方​​​說​​​,這​​​項​​​指​​​令​​​會​​​將​​​ 0-1 這​​​個​​​值​​​插​​​入​​​ group1 控​​​制​​​群​​​組​​​的​​​ cpuset.cpus 偽​​​檔​​​案​​​中​​​:
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
當​​​使​​​用​​​了​​​這​​​個​​​值​​​時​​​,此​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​會​​​被​​​限​​​制​​​僅​​​可​​​使​​​用​​​系​​​統​​​上​​​的​​​ CPU 0 和​​​ 1。​​​

2.8. 將​​​程​​​序​​​移​​​動​​​至​​​控​​​制​​​群​​​組​​​中​​​

您​​​可​​​透​​​過​​​執​​​行​​​ cgclassify 指​​​令​​​來​​​將​​​程​​​序​​​移​​​至​​​控​​​制​​​群​​​組​​​中​​​:
~]# cgclassify -g cpu,memory:group1 1701
cgclassify 的​​​語​​​法​​​為​​​:cgclassify -g subsystem:path_to_cgroup pidlist,而​​​:
  • subsystem(子​​​系​​​統​​​)代​​​表​​​一​​​個​​​逗​​​號​​​區​​​隔​​​開​​​的​​​子​​​系​​​統​​​清​​​單​​​,* 以​​​啟​​​動​​​與​​​所​​​有​​​可​​​用​​​子​​​系​​​統​​​相​​​聯​​​的​​​階​​​層​​​中​​​的​​​程​​​序​​​。​​​請​​​注​​​意​​​,若​​​相​​​同​​​名​​​稱​​​的​​​控​​​制​​​群​​​組​​​存​​​在​​​多​​​重​​​階​​​層​​​中​​​,-g 選​​​項​​​便​​​會​​​移​​​動​​​各​​​個​​​這​​​些​​​群​​​組​​​中​​​的​​​程​​​序​​​。​​​請​​​確​​​認​​​控​​​制​​​群​​​組​​​存​​​在​​​您​​​在​​​此​​​所​​​指​​​定​​​的​​​子​​​系​​​統​​​的​​​各​​​個​​​階​​​層​​​中​​​。​​​
  • path_to_cgroup 代​​​表​​​階​​​層​​​中​​​的​​​控​​​制​​​群​​​組​​​之​​​路​​​徑​​​
  • pid 清​​​單​​​代​​​表​​​以​​​空​​​格​​​隔​​​開​​​的​​​ process identifier(PID)清​​​單​​​
您​​​亦​​​可​​​在​​​ pid 之​​​前​​​附​​​加​​​一​​​個​​​ --sticky 選​​​項​​​,以​​​保​​​留​​​相​​​同​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​何​​​子​​​程​​​序​​​。​​​若​​​您​​​不​​​設​​​置​​​此​​​選​​​項​​​,並​​​且​​​ cgred daemon 正​​​在​​​執​​​行​​​的​​​話​​​,子​​​程​​​序​​​將​​​會​​​被​​​根​​​據​​​ /etc/cgrules.conf 中​​​的​​​設​​​定​​​,分​​​配​​​給​​​控​​​制​​​群​​​組​​​。​​​然​​​而​​​,程​​​序​​​本​​​身​​​將​​​會​​​保​​​留​​​在​​​您​​​所​​​啟​​​動​​​該​​​程​​​序​​​的​​​控​​​制​​​群​​​組​​​中​​​。​​​
透​​​過​​​使​​​用​​​ cgclassify,您​​​能​​​夠​​​同​​​時​​​地​​​移​​​動​​​多​​​項​​​程​​​序​​​。​​​比​​​方​​​說​​​,這​​​項​​​指​​​令​​​可​​​將​​​ PID 為​​​ 1701 以​​​及​​​ 1138 的​​​程​​​序​​​移​​​至​​​控​​​制​​​群​​​組​​​ group1/ 中​​​:
~]# cgclassify -g cpu,memory:group1 1701 1138
請​​​注​​​意​​​,欲​​​移​​​動​​​的​​​ PID 將​​​以​​​空​​​格​​​區​​​隔​​​開​​​來​​​,並​​​且​​​已​​​指​​​定​​​的​​​群​​​組​​​應​​​位​​​於​​​不​​​同​​​的​​​階​​​層​​​中​​​。​​​

額​​​外​​​方​​​式​​​

若​​​要​​​直​​​接​​​將​​​一​​​項​​​程​​​序​​​移​​​至​​​控​​​制​​​群​​​組​​​中​​​,請​​​將​​​它​​​的​​​ PID 寫​​​入​​​控​​​制​​​群​​​組​​​的​​​ tasks 檔​​​案​​​中​​​。​​​比​​​方​​​說​​​,若​​​要​​​將​​​ PID 為​​​ 1701 的​​​程​​​序​​​移​​​至​​​位​​​於​​​ /cgroup/lab1/group1/ 的​​​控​​​制​​​群​​​組​​​中​​​:
~]# echo 1701 > /cgroup/lab1/group1/tasks

2.8.1. cgred Daemon

Cgred 是​​​個​​​會​​​根​​​據​​​設​​​定​​​於​​​ /etc/cgrules.conf 檔​​​案​​​中​​​的​​​參​​​數​​​,來​​​將​​​工​​​作​​​移​​​至​​​控​​​制​​​群​​​組​​​中​​​的​​​ daemon。​​​/etc/cgrules.conf 檔​​​案​​​中​​​的​​​項​​​目​​​能​​​夠​​​是​​​以​​​下​​​兩​​​種​​​格​​​式​​​之​​​一​​​:
  • 使​​​用​​​者​​​ 階​​​層​​​ 控​​​制​​​群​​​組​​​
  • 使​​​用​​​者​​​:指​​​令​​​ 階​​​層​​​ 控​​​制​​​群​​​組​​​
例​​​如​​​:
maria			devices		/usergroup/staff
此​​​項​​​目​​​指​​​定​​​了​​​任​​​何​​​屬​​​於​​​使​​​用​​​者​​​ maria 的​​​程​​​序​​​將​​​根​​​據​​​指​​​定​​​於​​​ /usergroup/staff 控​​​制​​​群​​​組​​​中​​​的​​​參​​​數​​​,存​​​取​​​裝​​​置​​​子​​​系​​​統​​​。​​​若​​​要​​​相​​​聯​​​特​​​定​​​指​​​令​​​與​​​特​​​定​​​控​​​制​​​群​​​組​​​,請​​​如​​​下​​​附​​​加​​​command參​​​數​​​:
maria:ftp		devices		/usergroup/staff/ftp
項​​​目​​​現​​​在​​​指​​​定​​​了​​​當​​​名​​​稱​​​為​​​ maria 的​​​使​​​用​​​者​​​使​​​用​​​了​​​ ftp 指​​​令​​​時​​​,程​​​序​​​會​​​自​​​動​​​地​​​移​​​至​​​包​​​含​​​了​​​ devices 子​​​系​​​統​​​的​​​階​​​層​​​中​​​的​​​ /usergroup/staff/ftp 控​​​制​​​群​​​組​​​。​​​然​​​而​​​,請​​​注​​​意​​​,daemon 只​​​會​​​在​​​適​​​當​​​的​​​條​​​件​​​滿​​​足​​​後​​​,才​​​會​​​將​​​程​​​序​​​移​​​至​​​控​​​制​​​群​​​組​​​。​​​因​​​此​​​,ftp 程​​​序​​​可​​​能​​​會​​​在​​​錯​​​誤​​​的​​​群​​​組​​​中​​​,短​​​暫​​​執​​​行​​​。​​​此​​​外​​​,若​​​該​​​程​​​序​​​在​​​錯​​​誤​​​的​​​群​​​組​​​中​​​,快​​​速​​​地​​​衍​​​生​​​了​​​子​​​程​​​序​​​,這​​​些​​​子​​​程​​​序​​​將​​​可​​​能​​​不​​​會​​​被​​​移​​​動​​​。​​​
/etc/cgrules.conf 檔​​​案​​​中​​​的​​​項​​​目​​​可​​​包​​​含​​​下​​​列​​​額​​​外​​​標​​​記​​​法​​​:
  • @ —​​​ 當​​​放​​​置​​​在​​​使​​​用​​​者​​​之​​​前​​​,便​​​代​​​表​​​群​​​組​​​,而​​​非​​​各​​​別​​​的​​​使​​​用​​​者​​​。​​​比​​​方​​​說​​​,@admins 代​​​表​​​ admins 群​​​組​​​中​​​的​​​所​​​有​​​使​​​用​​​者​​​。​​​
  • * —​​​ 代​​​表​​​了​​​「​​​全​​​部​​​」​​​。​​​例​​​如​​​,子​​​系​​​統​​​欄​​​位​​​中​​​的​​​ * 代​​​表​​​了​​​所​​​有​​​的​​​子​​​系​​​統​​​。​​​
  • % —​​​ 代​​​表​​​了​​​一​​​個​​​與​​​上​​​面​​​一​​​行​​​中​​​的​​​項​​​目​​​相​​​同​​​的​​​項​​​目​​​。​​​例​​​如​​​:
    @adminstaff		devices		/admingroup
    @labstaff		%		%
    

2.9. 在​​​控​​​制​​​群​​​組​​​中​​​啟​​​動​​​一​​​項​​​程​​​序​​​

重要

有​​​些​​​子​​​系​​​統​​​需​​​要​​​您​​​在​​​將​​​任​​​務​​​移​​​動​​​到​​​使​​​用​​​這​​​些​​​子​​​系​​​統​​​的​​​控​​​制​​​群​​​組​​​之​​​前​​​,先​​​設​​​置​​​必​​​要​​​的​​​參​​​數​​​。​​​比​​​方​​​說​​​,在​​​您​​​使​​​用​​​ cpuset 子​​​系​​​統​​​之​​​前​​​,您​​​必​​​須​​​先​​​定​​​義​​​ cpuset.cpus 和​​​ cpuset.mems 參​​​數​​​。​​​
此​​​部​​​份​​​中​​​的​​​範​​​例​​​描​​​述​​​了​​​指​​​令​​​的​​​正​​​確​​​語​​​法​​​,不​​​過​​​這​​​只​​​在​​​已​​​設​​​置​​​了​​​範​​​例​​​中​​​所​​​使​​​用​​​的​​​控​​​制​​​器​​​之​​​必​​​要​​​參​​​數​​​的​​​系​​​統​​​上​​​有​​​效​​​。​​​若​​​您​​​還​​​未​​​配​​​置​​​相​​​關​​​的​​​控​​​制​​​器​​​,您​​​不​​​能​​​將​​​此​​​部​​​份​​​中​​​的​​​範​​​例​​​指​​​令​​​直​​​接​​​複​​​製​​​,並​​​預​​​期​​​它​​​們​​​能​​​在​​​您​​​的​​​系​​​統​​​上​​​運​​​作​​​。​​​
請​​​參​​​閱​​​ 節 3.10, “額​​​外​​​資​​​源​​​”,以​​​取​​​得​​​特​​​定​​​子​​​系​​​統​​​的​​​必​​​要​​​參​​​數​​​之​​​詳​​​述​​​。​​​
您​​​可​​​透​​​過​​​執​​​行​​​ cgexec 指​​​令​​​來​​​在​​​控​​​制​​​群​​​組​​​中​​​啟​​​動​​​程​​​序​​​。​​​比​​​方​​​說​​​,這​​​項​​​指​​​令​​​會​​​在​​​ group1 控​​​制​​​群​​​組​​​中​​​啟​​​動​​​ lynx 網​​​站​​​瀏​​​覽​​​器​​​,並​​​且​​​遵​​​照​​​ cpu 子​​​系​​​統​​​在​​​該​​​群​​​組​​​上​​​所​​​強​​​制​​​使​​​用​​​的​​​限​​​制​​​:
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec 的​​​語​​​法​​​為​​​:cgexec -g subsystems:path_to_cgroup command arguments ,而​​​:
  • subsystem(子​​​系​​​統​​​)代​​​表​​​一​​​個​​​逗​​​號​​​區​​​隔​​​開​​​的​​​子​​​系​​​統​​​清​​​單​​​,* 以​​​啟​​​動​​​與​​​所​​​有​​​可​​​用​​​子​​​系​​​統​​​相​​​聯​​​的​​​階​​​層​​​中​​​的​​​程​​​序​​​。​​​請​​​注​​​意​​​,如​​​描​​​述​​​於​​​〈​​​節 2.7, “設​​​定​​​參​​​數​​​”〉​​​中​​​的​​​ cgset,若​​​相​​​同​​​名​​​稱​​​的​​​控​​​制​​​群​​​組​​​存​​​在​​​多​​​重​​​階​​​層​​​中​​​,-g 選​​​項​​​便​​​會​​​在​​​各​​​個​​​這​​​些​​​群​​​組​​​中​​​建​​​立​​​程​​​序​​​。​​​請​​​確​​​認​​​控​​​制​​​群​​​組​​​存​​​在​​​您​​​在​​​此​​​所​​​指​​​定​​​的​​​子​​​系​​​統​​​的​​​各​​​個​​​階​​​層​​​中​​​。​​​
  • path_to_cgroup 代​​​表​​​與​​​階​​​層​​​相​​​關​​​的​​​控​​​制​​​群​​​組​​​之​​​路​​​徑​​​。​​​
  • command 代​​​表​​​欲​​​執​​​行​​​的​​​指​​​令​​​
  • arguments 為​​​指​​​令​​​的​​​任​​​何​​​引​​​數​​​
您​​​亦​​​可​​​在​​​ command 之​​​前​​​附​​​加​​​ --sticky 選​​​項​​​,以​​​保​​​留​​​相​​​同​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​何​​​子​​​程​​​序​​​。​​​若​​​您​​​不​​​設​​​置​​​此​​​選​​​項​​​,而​​​ cgred daemon 正​​​在​​​執​​​行​​​的​​​話​​​,子​​​程​​​序​​​將​​​會​​​被​​​根​​​據​​​ /etc/cgrules.conf 中​​​的​​​設​​​定​​​,分​​​配​​​給​​​控​​​制​​​群​​​組​​​。​​​然​​​而​​​,程​​​序​​​本​​​身​​​將​​​會​​​保​​​留​​​在​​​您​​​所​​​啟​​​動​​​其​​​的​​​控​​​制​​​群​​​組​​​中​​​。​​​

額​​​外​​​方​​​式​​​

當​​​您​​​啟​​​動​​​一​​​項​​​新​​​程​​​序​​​時​​​,它​​​會​​​繼​​​承​​​其​​​父​​​程​​​序​​​的​​​群​​​組​​​。​​​因​​​此​​​,另​​​一​​​項​​​在​​​特​​​定​​​控​​​制​​​群​​​組​​​中​​​啟​​​動​​​程​​​序​​​的​​​方​​​式​​​,就​​​是​​​將​​​您​​​的​​​ shell 程​​​序​​​移​​​至​​​該​​​群​​​組​​​(請​​​參​​​閱​​​〈​​​節 2.8, “將​​​程​​​序​​​移​​​動​​​至​​​控​​​制​​​群​​​組​​​中​​​”〉​​​),並​​​由​​​該​​​ shell 啟​​​動​​​程​​​序​​​。​​​例​​​如​​​:
~]# echo $$ > /cgroup/lab1/group1/tasks
lynx
請​​​注​​​意​​​,在​​​退​​​出​​​了​​​ lynx 之​​​後​​​,您​​​既​​​有​​​的​​​ shell 還​​​會​​​存​​​在​​​ group1 控​​​制​​​群​​​組​​​中​​​。​​​因​​​此​​​,有​​​個​​​更​​​佳​​​的​​​方​​​式​​​就​​​是​​​:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"

2.9.1. 在​​​控​​​制​​​群​​​組​​​中​​​啟​​​動​​​一​​​項​​​服​​​務​​​

您​​​可​​​在​​​控​​​制​​​群​​​組​​​中​​​啟​​​用​​​一​​​些​​​服​​​務​​​。​​​可​​​啟​​​用​​​於​​​控​​​制​​​群​​​組​​​中​​​的​​​服​​​務​​​必​​​須​​​:
  • 使​​​用​​​一​​​個​​​ /etc/sysconfig/servicename 檔​​​案​​​
  • 使​​​用​​​來​​​自​​​於​​​ /etc/init.d/functions 的​​​ daemon() 功​​​能​​​來​​​啟​​​用​​​服​​​務​​​
若​​​要​​​在​​​控​​​制​​​群​​​組​​​中​​​啟​​​動​​​一​​​項​​​服​​​務​​​,請​​​編​​​輯​​​它​​​位​​​於​​​ /etc/sysconfig 目​​​錄​​​中​​​的​​​檔​​​案​​​,以​​​包​​​含​​​一​​​項​​​格​​​式​​​為​​​ CGROUP_DAEMON="subsystem:control_group" 的​​​項​​​目​​​,subsystem 為​​​與​​​特​​​定​​​階​​​層​​​相​​​聯​​​的​​​子​​​系​​​統​​​,control_group 則​​​為​​​該​​​階​​​層​​​中​​​的​​​控​​​制​​​群​​​組​​​。​​​例​​​如​​​:
CGROUP_DAEMON="cpuset:daemons/sql"

2.10. 取​​​得​​​有​​​關​​​於​​​控​​​制​​​群​​​組​​​的​​​相​​​關​​​資​​​訊​​​

2.10.1. 尋​​​找​​​程​​​序​​​

若​​​要​​​找​​​出​​​某​​​項​​​程​​​序​​​屬​​​於​​​哪​​​個​​​控​​​制​​​群​​​組​​​,請​​​執​​​行​​​:
~]$ ps -O cgroup
或​​​是​​​,若​​​您​​​知​​​道​​​程​​​序​​​的​​​ PID,請​​​執​​​行​​​:
~]$ cat /proc/PID/cgroup

2.10.2. 尋​​​找​​​子​​​系​​​統​​​

若​​​要​​​尋​​​找​​​在​​​您​​​ kernel 中​​​可​​​用​​​的​​​子​​​系​​​統​​​,以​​​及​​​它​​​們​​​是​​​如​​​何​​​一​​​起​​​掛​​​載​​​至​​​階​​​層​​​,請​​​執​​​行​​​:
~]$ cat /proc/cgroups
或​​​是​​​,若​​​要​​​尋​​​找​​​特​​​定​​​子​​​系​​​統​​​的​​​掛​​​載​​​點​​​,請​​​執​​​行​​​:
~]$ lssubsys -m subsystems
其​​​中​​​ subsystem 代​​​表​​​您​​​有​​​興​​​趣​​​的​​​子​​​系​​​統​​​之​​​清​​​單​​​。​​​請​​​注​​​意​​​ lssubsys -m 指​​​令​​​只​​​會​​​傳​​​回​​​每​​​個​​​階​​​層​​​的​​​最​​​高​​​層​​​掛​​​載​​​點​​​。​​​

2.10.3. 尋​​​找​​​階​​​層​​​

建​​​議​​​您​​​將​​​階​​​層​​​掛​​​載​​​在​​​ /cgroup 下​​​。​​​假​​​設​​​您​​​系​​​統​​​上​​​已​​​這​​​麼​​​做​​​了​​​,請​​​列​​​出​​​或​​​瀏​​​覽​​​該​​​目​​​錄​​​的​​​內​​​容​​​,以​​​取​​​得​​​一​​​列​​​階​​​層​​​的​​​清​​​單​​​。​​​若​​​ tree 已​​​安​​​裝​​​在​​​您​​​的​​​系​​​統​​​上​​​,請​​​執​​​行​​​它​​​以​​​取​​​得​​​所​​​有​​​階​​​層​​​與​​​其​​​中​​​的​​​控​​​制​​​群​​​組​​​的​​​總​​​覽​​​:
~]$ tree /cgroup/

2.10.4. 尋​​​找​​​控​​​制​​​群​​​組​​​

若​​​要​​​列​​​出​​​系​​​統​​​上​​​的​​​控​​​制​​​群​​​組​​​,請​​​執​​​行​​​:
~]$ lscgroup
您​​​可​​​藉​​​由​​​指​​​定​​​控​​​制​​​器​​​與​​​路​​​徑​​​(格​​​式​​​為​​​ 控​​​制​​​器​​​:路​​​徑​​​),來​​​限​​​制​​​至​​​特​​​定​​​階​​​層​​​的​​​輸​​​出​​​。​​​例​​​如​​​:
~]$ lscgroup cpuset:adminusers
只​​​列​​​出​​​ cpuset 子​​​系​​​統​​​連​​​至​​​的​​​階​​​層​​​中​​​的​​​ adminusers 控​​​制​​​群​​​組​​​的​​​子​​​群​​​組​​​。​​​

2.10.5. 顯​​​示​​​控​​​制​​​群​​​組​​​的​​​參​​​數​​​

若​​​要​​​顯​​​示​​​特​​​定​​​控​​​制​​​群​​​組​​​的​​​參​​​數​​​,請​​​執​​​行​​​:
~]$ cgget -r parameter list_of_cgroups
parameter 代​​​表​​​一​​​個​​​包​​​含​​​了​​​子​​​系​​​統​​​的​​​值​​​的​​​偽​​​檔​​​案​​​,並​​​且​​​list_of_cgroups則​​​代​​​表​​​以​​​空​​​格​​​區​​​隔​​​開​​​的​​​控​​​制​​​群​​​組​​​之​​​清​​​單​​​。​​​例​​​如​​​:
~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
顯​​​示​​​了​​​控​​​制​​​群​​​組​​​ lab1 和​​​ lab2 的​​​ cpuset.cpus 與​​​ memory.limit_in_bytes 的​​​值​​​。​​​
若​​​您​​​不​​​曉​​​得​​​參​​​數​​​本​​​身​​​的​​​名​​​稱​​​為​​​何​​​,請​​​使​​​用​​​一​​​項​​​類​​​似​​​下​​​列​​​的​​​指​​​令​​​:
~]$ cgget -g cpuset /

2.11. 卸​​​除​​​控​​​制​​​群​​​組​​​

警告

cgclear 指​​​令​​​會​​​將​​​所​​​有​​​階​​​層​​​中​​​全​​​部​​​的​​​控​​​制​​​群​​​組​​​刪​​​除​​​掉​​​。​​​若​​​您​​​沒​​​有​​​將​​​這​​​些​​​階​​​層​​​儲​​​存​​​在​​​一​​​個​​​配​​​置​​​檔​​​案​​​中​​​的​​​話​​​,您​​​將​​​無​​​法​​​重​​​新​​​建​​​立​​​它​​​。​​​
若​​​要​​​清​​​除​​​整​​​個​​​控​​​制​​​群​​​組​​​檔​​​案​​​系​​​統​​​,請​​​使​​​用​​​ cgclear 指​​​令​​​。​​​
控​​​制​​​群​​​組​​​中​​​的​​​所​​​有​​​工​​​作​​​皆​​​會​​​被​​​重​​​新​​​分​​​配​​​至​​​階​​​層​​​的​​​ root 節​​​點​​​,所​​​有​​​的​​​控​​​制​​​群​​​組​​​皆​​​會​​​被​​​移​​​除​​​,並​​​且​​​檔​​​案​​​系​​​統​​​本​​​身​​​將​​​會​​​由​​​系​​​統​​​上​​​卸​​​載​​​,並​​​同​​​時​​​刪​​​除​​​所​​​有​​​先​​​前​​​掛​​​載​​​的​​​階​​​層​​​。​​​最​​​後​​​,控​​​制​​​群​​​組​​​檔​​​案​​​系​​​統​​​所​​​掛​​​載​​​於​​​的​​​目​​​錄​​​,也​​​會​​​被​​​刪​​​除​​​掉​​​。​​​

注意

使​​​用​​​ mount 指​​​令​​​來​​​建​​​立​​​控​​​制​​​群​​​組​​​(相​​​對​​​於​​​透​​​過​​​ cgconfig 服​​​務​​​來​​​建​​​立​​​)會​​​在​​​ /etc/mtab 檔​​​案​​​(檔​​​案​​​系​​​統​​​掛​​​載​​​表​​​)裡​​​建​​​立​​​條​​​目​​​。​​​這​​​項​​​改​​​變​​​也​​​會​​​反​​​映​​​在​​​ /proc/mounts 檔​​​案​​​裡​​​。​​​然​​​而​​​,使​​​用​​​ cgclear 指​​​令​​​卸​​​載​​​控​​​制​​​群​​​組​​​,加​​​上​​​其​​​它​​​ cgconfig 指​​​令​​​,會​​​使​​​用​​​直​​​接​​​的​​​ kernel 介​​​面​​​,不​​​會​​​改​​​變​​​ /etc/mtab 檔​​​案​​​中​​​的​​​內​​​容​​​,而​​​且​​​只​​​會​​​將​​​新​​​的​​​指​​​令​​​寫​​​入​​​ /proc/mounts 檔​​​案​​​裡​​​。​​​因​​​此​​​,使​​​用​​​ cgclear 指​​​令​​​上​​​傳​​​控​​​制​​​群​​​組​​​之​​​後​​​,卸​​​載​​​的​​​控​​​制​​​群​​​組​​​可​​​能​​​還​​​是​​​會​​​在​​​ /etc/mtab 檔​​​案​​​裡​​​,而​​​且​​​也​​​因​​​此​​​,執​​​行​​​ mount 指​​​令​​​還​​​是​​​會​​​顯​​​示​​​出​​​來​​​。​​​我​​​們​​​建​​​議​​​您​​​參​​​考​​​ /proc/mounts 檔​​​案​​​,以​​​得​​​知​​​正​​​確​​​的​​​已​​​掛​​​載​​​的​​​控​​​制​​​群​​​組​​​清​​​單​​​。​​​

2.12. 額​​​外​​​資​​​源​​​

控​​​制​​​群​​​組​​​指​​​令​​​的​​​定​​​義​​​文​​​件​​​為​​​ libcgroup 套​​​件​​​所​​​提​​​供​​​的​​​指​​​南​​​。​​​部​​​份​​​號​​​碼​​​指​​​定​​​於​​​下​​​列​​​的​​​ man page 清​​​單​​​中​​​。​​​

libcgroup Man Page

  • man 1 cgclassify —​​​ cgclassify 指​​​令​​​可​​​使​​​用​​​來​​​將​​​執​​​行​​​中​​​的​​​工​​​作​​​,移​​​至​​​一​​​個​​​或​​​更​​​多​​​個​​​ cgroups 中​​​。​​​
    man 1 cgclear —​​​ cgclear 指​​​令​​​可​​​使​​​用​​​來​​​刪​​​除​​​階​​​層​​​中​​​的​​​所​​​有​​​ cgroup。​​​
    man 5 cgconfig.conf —​​​ cgroup 定​​​義​​​於​​​ cgconfig.conf 檔​​​案​​​中​​​。​​​
    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. 子​​​系​​​統​​​和​​​可​​​調​​​整​​​的​​​參​​​數​​​

「​​​子​​​系​​​統​​​」​​​(Subsystem)是​​​可​​​偵​​​測​​​到​​​控​​​制​​​群​​​組​​​的​​​數​​​個​​​ kernel 模​​​組​​​。​​​一​​​般​​​來​​​講​​​,它​​​們​​​是​​​能​​​將​​​不​​​同​​​層​​​級​​​的​​​系​​​統​​​資​​​源​​​,分​​​配​​​給​​​不​​​同​​​控​​​制​​​群​​​組​​​的​​​資​​​源​​​控​​​制​​​器​​​。​​​然​​​而​​​,子​​​系​​​統​​​亦​​​可​​​針​​​對​​​不​​​同​​​程​​​序​​​群​​​組​​​而​​​定​​​,被​​​設​​​計​​​為​​​與​​​ kernel 進​​​行​​​任​​​何​​​的​​​其​​​它​​​互​​​動​​​。​​​用​​​來​​​開​​​發​​​新​​​子​​​系​​​統​​​的​​​「​​​應​​​用​​​程​​​式​​​介​​​面​​​」​​​(API)記​​​載​​​於​​​ kernel 文​​​件​​​中​​​的​​​ cgroups.txt 中​​​,存​​​放​​​在​​​您​​​系​​​統​​​的​​​ /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/ 上​​​(由​​​ kernel-doc 套​​​件​​​提​​​供​​​)。​​​最​​​新​​​版​​​本​​​的​​​ cgroups 文​​​件​​​亦​​​可​​​藉​​​由​​​ http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt 取​​​得​​​。​​​不​​​過​​​請​​​注​​​意​​​,最​​​新​​​版​​​本​​​文​​​件​​​中​​​的​​​功​​​能​​​,可​​​能​​​會​​​與​​​安​​​裝​​​在​​​您​​​系​​​統​​​上​​​的​​​ kernel 中​​​的​​​功​​​能​​​不​​​相​​​符​​​。​​​
包​​​含​​​了​​​控​​​制​​​群​​​組​​​的​​​子​​​系​​​統​​​參​​​數​​​的​​​「​​​狀​​​態​​​物​​​件​​​」​​​會​​​被​​​顯​​​示​​​為​​​控​​​制​​​群​​​組​​​的​​​虛​​​擬​​​檔​​​案​​​系​​​統​​​中​​​的​​​「​​​偽​​​檔​​​案​​​」​​​(pseudofiles)。​​​這​​​些​​​偽​​​檔​​​案​​​可​​​透​​​過​​​ shell 指​​​令​​​,或​​​是​​​它​​​們​​​的​​​相​​​等​​​系​​​統​​​調​​​用​​​來​​​操​​​作​​​。​​​比​​​方​​​說​​​,cpuset.cpus 是​​​個​​​可​​​指​​​定​​​控​​​制​​​群​​​組​​​允​​​許​​​存​​​取​​​哪​​​個​​​ CPU 的​​​偽​​​檔​​​案​​​。​​​若​​​是​​​ /cgroup/cpuset/webserver 是​​​個​​​在​​​一​​​部​​​系​​​統​​​上​​​執​​​行​​​的​​​網​​​站​​​伺​​​服​​​器​​​的​​​控​​​制​​​群​​​組​​​,而​​​我​​​們​​​執​​​行​​​下​​​列​​​指​​​令​​​:
~]# 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)子​​​系​​​統​​​負​​​責​​​控​​​制​​​和​​​監​​​控​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​,對​​​於​​​區​​​塊​​​裝​​​置​​​上​​​ I/O 的​​​存​​​取​​​權​​​限​​​。​​​將​​​數​​​值​​​寫​​​入​​​某​​​些​​​偽​​​檔​​​案​​​中​​​會​​​限​​​制​​​存​​​取​​​功​​​能​​​或​​​頻​​​寬​​​,從​​​這​​​些​​​偽​​​檔​​​案​​​中​​​讀​​​取​​​資​​​訊​​​能​​​提​​​供​​​關​​​於​​​ I/O 運​​​作​​​的​​​資​​​訊​​​。​​​
blkio.weight
這​​​指​​​定​​​了​​​控​​​制​​​群​​​組​​​就​​​預​​​設​​​值​​​,可​​​使​​​用​​​的​​​區​​​塊​​​ I/O 存​​​取​​​權​​​限​​​的​​​相​​​應​​​比​​​例​​​(權​​​重​​​),範​​​圍​​​為​​​ 100 到​​​ 1000。​​​特​​​定​​​裝​​​置​​​會​​​以​​​ blkio.weight_device 參​​​數​​​置​​​換​​​這​​​個​​​值​​​。​​​比​​​方​​​說​​​,若​​​要​​​指​​​定​​​預​​​設​​​權​​​重​​​ 500 給​​​某​​​個​​​控​​​制​​​群​​​組​​​,使​​​其​​​能​​​夠​​​存​​​取​​​區​​​塊​​​裝​​​置​​​,請​​​執​​​行​​​:
echo 500 > blkio.weight
blkio.weight_device
這​​​指​​​定​​​了​​​控​​​制​​​群​​​組​​​可​​​使​​​用​​​的​​​特​​​定​​​裝​​​置​​​的​​​ I/O 存​​​取​​​權​​​限​​​的​​​相​​​關​​​比​​​例​​​(權​​​重​​​),範​​​圍​​​為​​​ 100 到​​​ 1000。​​​此​​​參​​​數​​​的​​​值​​​會​​​置​​​換​​​所​​​指​​​定​​​的​​​裝​​​置​​​的​​​ blkio.weight 值​​​。​​​這​​​些​​​值​​​的​​​格​​​式​​​為​​​ major:minor weight,其​​​中​​​ major 與​​​ minor 和​​​裝​​​置​​​類​​​型​​​與​​​節​​​點​​​編​​​號​​​表​​​示​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​,亦​​​稱​​​為​​​ Linux 裝​​​置​​​清​​​單​​​,並​​​可​​​藉​​​由​​​ http://www.kernel.org/doc/Documentation/devices.txt 取​​​得​​​。​​​比​​​方​​​說​​​,若​​​要​​​指​​​定​​​權​​​重​​​ 500 給​​​某​​​個​​​控​​​制​​​群​​​組​​​使​​​其​​​能​​​夠​​​存​​​取​​​ /dev/sda,請​​​執​​​行​​​:
echo 8:0 500 > blkio.weight_device
在​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​標​​​記​​​法​​​中​​​,8:0 代​​​表​​​ /dev/sda。​​​
blkio.time
回​​​報​​​控​​​制​​​群​​​組​​​擁​​​有​​​特​​​定​​​裝​​​置​​​的​​​ I/O 存​​​取​​​權​​​限​​​的​​​時​​​間​​​。​​​項​​​目​​​含​​​有​​​三​​​個​​​欄​​​位​​​:major、​​​minor 以​​​及​​​ time。​​​Major 和​​​ minor 為​​​指​​​定​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​的​​​裝​​​置​​​類​​​型​​​與​​​節​​​點​​​編​​​號​​​,而​​​ time 為​​​時​​​間​​​長​​​度​​​,單​​​位​​​為​​​毫​​​秒​​​(ms)。​​​
blkio.sectors
回​​​報​​​控​​​制​​​群​​​組​​​的​​​特​​​定​​​裝​​​置​​​的​​​輸​​​入​​​與​​​輸​​​出​​​磁​​​區​​​的​​​數​​​量​​​。​​​項​​​目​​​包​​​含​​​四​​​個​​​欄​​​位​​​:major、​​​minor 以​​​及​​​ sectors。​​​major 和​​​ minor 為​​​指​​​定​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​的​​​裝​​​置​​​類​​​型​​​和​​​節​​​點​​​編​​​號​​​,sectors 則​​​為​​​磁​​​碟​​​磁​​​區​​​的​​​數​​​量​​​。​​​
blkio.io_service_bytes
回​​​報​​​了​​​控​​​制​​​群​​​組​​​由​​​特​​​定​​​裝​​​置​​​傳​​​出​​​或​​​傳​​​入​​​的​​​位​​​元​​​組​​​數​​​量​​​。​​​項​​​目​​​含​​​有​​​四​​​個​​​欄​​​位​​​:major、​​​minor、​​​operation,以​​​及​​​ bytes。​​​major 與​​​ minor 為​​​指​​​定​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​的​​​裝​​​置​​​類​​​型​​​與​​​節​​​點​​​編​​​號​​​,operation 代​​​表​​​作​​​業​​​的​​​類​​​型​​​(read、​​​write、​​​sync,或​​​是​​​ async),並​​​且​​​ bytes 代​​​表​​​已​​​傳​​​輸​​​的​​​位​​​元​​​組​​​數​​​量​​​。​​​
blkio.io_serviced
回​​​報​​​控​​​制​​​群​​​組​​​在​​​特​​​定​​​裝​​​置​​​上​​​執​​​行​​​的​​​ I/O 作​​​業​​​數​​​量​​​。​​​項​​​目​​​含​​​有​​​四​​​個​​​欄​​​位​​​:major、​​​minor、​​​operation 以​​​及​​​ bytes。​​​major 和​​​ minor 為​​​指​​​定​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​的​​​裝​​​置​​​類​​​型​​​與​​​節​​​點​​​編​​​號​​​,而​​​ operation 代​​​表​​​作​​​業​​​的​​​類​​​型​​​(read、​​​write、​​​sync 或​​​ async),並​​​且​​​ number 代​​​表​​​作​​​業​​​的​​​數​​​量​​​。​​​
blkio.io_service_time
回​​​報​​​控​​​制​​​群​​​組​​​在​​​特​​​定​​​裝​​​置​​​上​​​,I/O 作​​​業​​​的​​​請​​​求​​​送​​​出​​​與​​​完​​​成​​​之​​​間​​​所​​​花​​​的​​​時​​​間​​​。​​​項​​​目​​​含​​​有​​​四​​​個​​​欄​​​位​​​:major、​​​minor、​​​operation 以​​​及​​​ bytes。​​​major 和​​​ minor 為​​​指​​​定​​​於​​​ Linux 已​​​分​​​配​​​的​​​裝​​​置​​​中​​​的​​​裝​​​置​​​類​​​型​​​和​​​節​​​點​​​編​​​號​​​,operation 代​​​表​​​作​​​業​​​的​​​類​​​型​​​(read、​​​write、​​​sync 或​​​ async),並​​​且​​​ time 為​​​時​​​間​​​的​​​長​​​度​​​,單​​​位​​​為​​​十​​​億​​​分​​​之​​​一​​​秒​​​(ns)。​​​時​​​間​​​會​​​以​​​十​​​億​​​分​​​之​​​一​​​秒​​​為​​​單​​​位​​​回​​​報​​​,而​​​非​​​較​​​大​​​的​​​單​​​位​​​,如​​​此​​​一​​​來​​​此​​​報​​​告​​​會​​​較​​​有​​​意​​​義​​​,就​​​算​​​是​​​針​​​對​​​於​​​固​​​態​​​裝​​​置​​​亦​​​然​​​。​​​
blkio.io_wait_time
回​​​報​​​控​​​制​​​群​​​組​​​在​​​特​​​定​​​裝​​​置​​​上​​​的​​​ I/O 作​​​業​​​,等​​​待​​​排​​​程​​​器​​​佇​​​列​​​中​​​的​​​服​​​務​​​所​​​耗​​​費​​​的​​​時​​​間​​​總​​​長​​​。​​​當​​​您​​​詮​​​釋​​​此​​​報​​​告​​​時​​​,請​​​注​​​意​​​:
  • 所​​​回​​​報​​​的​​​時​​​間​​​可​​​能​​​會​​​比​​​花​​​掉​​​的​​​時​​​間​​​長​​​,因​​​為​​​回​​​報​​​的​​​時​​​間​​​為​​​控​​​制​​​群​​​組​​​的​​​所​​​有​​​ I/O 作​​​業​​​的​​​時​​​間​​​總​​​長​​​,而​​​非​​​控​​​制​​​群​​​組​​​本​​​身​​​花​​​在​​​等​​​待​​​ 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
回​​​報​​​控​​​制​​​群​​​組​​​請​​​求​​​合​​​併​​​入​​​ I/O 作​​​業​​​請​​​求​​​的​​​ BIOS 數​​​量​​​。​​​項​​​目​​​含​​​有​​​兩​​​個​​​欄​​​位​​​:number 和​​​ operation。​​​number 為​​​請​​​求​​​的​​​數​​​量​​​,並​​​且​​​ operation 代​​​表​​​作​​​業​​​類​​​型​​​(read、​​​write、​​​sync 或​​​ async)。​​​
blkio.io_queued
回​​​報​​​控​​​制​​​群​​​組​​​的​​​ I/O 作​​​業​​​請​​​求​​​排​​​程​​​數​​​量​​​。​​​項​​​目​​​含​​​有​​​兩​​​個​​​欄​​​位​​​:number 和​​​ operation。​​​number 為​​​回​​​報​​​請​​​求​​​的​​​數​​​量​​​,並​​​且​​​ operation 代​​​表​​​作​​​業​​​類​​​型​​​(read、​​​write、​​​sync 或​​​ async)。​​​
blkio.avg_queue_size
回​​​報​​​控​​​制​​​群​​​組​​​的​​​平​​​均​​​ I/O 作​​​業​​​佇​​​列​​​大​​​小​​​(在​​​整​​​個​​​群​​​組​​​存​​​在​​​的​​​期​​​間​​​)。​​​每​​​當​​​此​​​控​​​制​​​群​​​組​​​的​​​佇​​​列​​​取​​​得​​​一​​​個​​​ timeslice 時​​​,佇​​​列​​​大​​​小​​​就​​​會​​​被​​​取​​​樣​​​。​​​請​​​注​​​意​​​,此​​​報​​​告​​​只​​​有​​​在​​​ CONFIG_DEBUG_BLK_CGROUP=y 設​​​置​​​於​​​系​​​統​​​上​​​的​​​情​​​況​​​下​​​,才​​​可​​​使​​​用​​​。​​​
blkio.group_wait_time
回​​​報​​​控​​​制​​​群​​​組​​​在​​​等​​​待​​​它​​​其​​​中​​​一​​​個​​​佇​​​列​​​時​​​,所​​​耗​​​費​​​的​​​時​​​間​​​總​​​長​​​(十​​​億​​​分​​​之​​​一​​​秒​​​ —​​​ ns)。​​​每​​​當​​​此​​​控​​​制​​​群​​​組​​​的​​​佇​​​列​​​取​​​得​​​了​​​一​​​個​​​ timeslice 時​​​,報​​​告​​​便​​​會​​​被​​​更​​​新​​​,因​​​此​​​若​​​您​​​在​​​控​​​制​​​群​​​組​​​等​​​待​​​ timeslice 時​​​讀​​​取​​​此​​​偽​​​檔​​​案​​​,報​​​告​​​將​​​不​​​會​​​包​​​含​​​等​​​待​​​目​​​前​​​排​​​程​​​的​​​作​​​業​​​所​​​耗​​​費​​​的​​​時​​​間​​​。​​​請​​​注​​​意​​​,此​​​報​​​告​​​只​​​有​​​在​​​ CONFIG_DEBUG_BLK_CGROUP=y 設​​​置​​​於​​​系​​​統​​​上​​​的​​​情​​​況​​​下​​​,才​​​可​​​使​​​用​​​。​​​
blkio.empty_time
回​​​報​​​控​​​制​​​群​​​組​​​在​​​無​​​任​​​何​​​等​​​待​​​處​​​理​​​的​​​請​​​求​​​的​​​情​​​況​​​下​​​,所​​​耗​​​費​​​的​​​時​​​間​​​總​​​長​​​(十​​​億​​​分​​​之​​​一​​​秒​​​ —​​​ ns)。​​​每​​​當​​​此​​​控​​​制​​​群​​​組​​​的​​​佇​​​列​​​含​​​有​​​等​​​待​​​處​​​理​​​的​​​請​​​求​​​時​​​,報​​​告​​​便​​​會​​​被​​​更​​​新​​​,因​​​此​​​若​​​您​​​在​​​控​​​制​​​群​​​組​​​沒​​​有​​​等​​​待​​​處​​​理​​​的​​​請​​​求​​​時​​​讀​​​取​​​此​​​偽​​​檔​​​案​​​,報​​​告​​​將​​​不​​​會​​​包​​​含​​​在​​​目​​​前​​​空​​​白​​​狀​​​態​​​下​​​所​​​耗​​​費​​​的​​​時​​​間​​​。​​​請​​​注​​​意​​​,此​​​報​​​告​​​只​​​有​​​在​​​ CONFIG_DEBUG_BLK_CGROUP=y 設​​​置​​​於​​​系​​​統​​​上​​​的​​​情​​​況​​​下​​​,才​​​可​​​使​​​用​​​。​​​
blkio.idle_time
回​​​報​​​控​​​制​​​群​​​組​​​的​​​排​​​程​​​器​​​,預​​​期​​​比​​​已​​​在​​​佇​​​列​​​中​​​或​​​來​​​自​​​於​​​其​​​它​​​群​​​組​​​更​​​佳​​​的​​​請​​​求​​​,所​​​耗​​​費​​​的​​​閒​​​置​​​時​​​間​​​總​​​長​​​(單​​​位​​​為​​​十​​​億​​​分​​​之​​​一​​​秒​​​ —​​​ ns)。​​​每​​​當​​​群​​​組​​​已​​​不​​​再​​​閒​​​置​​​時​​​,報​​​告​​​便​​​會​​​被​​​更​​​新​​​,因​​​此​​​若​​​您​​​在​​​控​​​制​​​群​​​組​​​閒​​​置​​​時​​​讀​​​取​​​此​​​偽​​​檔​​​案​​​,報​​​告​​​將​​​不​​​會​​​包​​​含​​​在​​​目​​​前​​​閒​​​置​​​狀​​​態​​​下​​​所​​​耗​​​費​​​的​​​時​​​間​​​。​​​請​​​注​​​意​​​,此​​​報​​​告​​​只​​​有​​​在​​​ CONFIG_DEBUG_BLK_CGROUP=y 設​​​置​​​於​​​系​​​統​​​上​​​的​​​情​​​況​​​下​​​,才​​​可​​​使​​​用​​​。​​​
blkio.dequeue
回​​​報​​​控​​​制​​​群​​​組​​​的​​​ I/O 作​​​業​​​請​​​求​​​,被​​​特​​​定​​​裝​​​置​​​清​​​除​​​佇​​​列​​​的​​​次​​​數​​​。​​​項​​​目​​​含​​​有​​​三​​​個​​​欄​​​位​​​:major、​​​minor,以​​​及​​​ number。​​​major 和​​​ minor 代​​​表​​​指​​​定​​​於​​​ Linux Allocated Devices 中​​​的​​​裝​​​置​​​類​​​型​​​與​​​節​​​點​​​編​​​號​​​,而​​​ number 則​​​代​​​表​​​群​​​組​​​請​​​求​​​被​​​清​​​除​​​佇​​​列​​​的​​​次​​​數​​​。​​​請​​​注​​​意​​​,此​​​報​​​告​​​只​​​有​​​在​​​ CONFIG_DEBUG_BLK_CGROUP=y 設​​​置​​​於​​​系​​​統​​​上​​​的​​​情​​​況​​​下​​​,才​​​可​​​使​​​用​​​。​​​
blkio.reset_stats
重​​​設​​​紀​​​錄​​​在​​​其​​​它​​​偽​​​檔​​​案​​​中​​​的​​​數​​​據​​​。​​​將​​​一​​​個​​​整​​​數​​​寫​​​入​​​此​​​檔​​​案​​​中​​​,以​​​重​​​設​​​此​​​ cgroup 的​​​數​​​據​​​。​​​

3.2. cpu

cpu 子​​​系​​​統​​​會​​​排​​​程​​​ CPU,以​​​存​​​取​​​控​​​制​​​群​​​組​​​。​​​存​​​取​​​ CPU 資​​​源​​​會​​​根​​​據​​​以​​​下​​​參​​​數​​​來​​​排​​​程​​​,每​​​個​​​參​​​數​​​都​​​位​​​於​​​控​​​制​​​群​​​組​​​虛​​​擬​​​檔​​​案​​​系​​​統​​​的​​​獨​​​立​​​ pseudofile(偽​​​檔​​​案​​​)裡​​​:
cpu.shares
這​​​整​​​數​​​值​​​表​​​示​​​控​​​制​​​群​​​組​​​裡​​​,任​​​務​​​可​​​以​​​使​​​用​​​的​​​相​​​對​​​ CPU 時​​​間​​​。​​​舉​​​例​​​來​​​說​​​,在​​​兩​​​個​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​之​​​ cpu.shares 都​​​設​​​為​​​ 1 的​​​話​​​,這​​​兩​​​個​​​任​​​務​​​會​​​收​​​到​​​均​​​等​​​的​​​ CPU 時​​​間​​​;但​​​其​​​中​​​一​​​個​​​任​​​務​​​的​​​ cpu.shares 設​​​為​​​ 2 的​​​話​​​,那​​​它​​​收​​​到​​​的​​​ CPU 時​​​間​​​會​​​是​​​ cpu.shares 設​​​為​​​ 1 的​​​兩​​​倍​​​。​​​
cpu.rt_runtime_us
這​​​表​​​示​​​一​​​段​​​時​​​間​​​,單​​​位​​​為​​​微​​​秒​​​(microsecond,簡​​​寫​​​為​​​ µs,在​​​此​​​以​​​「​​​us」​​​表​​​示​​​),這​​​是​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​存​​​取​​​ CPU 資​​​源​​​的​​​最​​​長​​​連​​​續​​​時​​​間​​​。​​​建​​​立​​​這​​​個​​​限​​​制​​​可​​​以​​​防​​​止​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​獨​​​占​​​ CPU 時​​​間​​​。​​​如​​​果​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​要​​​每​​​五​​​秒​​​存​​​取​​​ CPU 資​​​源​​​四​​​秒​​​,請​​​將​​​ cpu.rt_runtime_us 設​​​為​​​ 4000000,並​​​把​​​ cpu.rt_period_us 設​​​為​​​ 5000000。​​​
cpu.rt_period_us
這​​​表​​​示​​​一​​​段​​​時​​​間​​​,單​​​位​​​為​​​微​​​秒​​​(microsecond,簡​​​寫​​​為​​​ µs,在​​​此​​​以​​​「​​​us」​​​表​​​示​​​),這​​​是​​​控​​​制​​​群​​​組​​​存​​​取​​​ CPU 資​​​源​​​所​​​該​​​分​​​配​​​的​​​頻​​​率​​​。​​​如​​​果​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​要​​​每​​​五​​​秒​​​存​​​取​​​ CPU 資​​​源​​​四​​​秒​​​,請​​​將​​​ cpu.rt_runtime_us 設​​​為​​​ 4000000,並​​​把​​​ cpu.rt_period_us 設​​​為​​​ 5000000。​​​

3.3. cpuacct

CPU 計​​​算​​​(cpuacct)子​​​系​​​統​​​會​​​自​​​動​​​產​​​生​​​關​​​於​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​,CPU 資​​​源​​​使​​​用​​​上​​​的​​​報​​​表​​​。​​​報​​​表​​​類​​​型​​​有​​​三​​​種​​​:
cpuacct.stat
回​​​報​​​此​​​控​​​制​​​群​​​組​​​以​​​及​​​其​​​子​​​群​​​組​​​在​​​使​​​用​​​者​​​模​​​式​​​與​​​系​​​統​​​(kernel)模​​​式​​​中​​​的​​​工​​​作​​​,所​​​耗​​​費​​​的​​​ CPU 週​​​期​​​數​​​目​​​(單​​​位​​​為​​​系​​​統​​​上​​​的​​​ USER_HZ 所​​​定​​​義​​​)。​​​
cpuacct.usage
這​​​會​​​回​​​報​​​此​​​控​​​制​​​群​​​組​​​的​​​所​​​有​​​任​​​務​​​(包​​​括​​​階​​​層​​​較​​​低​​​的​​​任​​​務​​​)所​​​消​​​耗​​​的​​​總​​​ CPU 時​​​間​​​(單​​​位​​​為​​​毫​​​秒​​​)。​​​
cpuacct.usage_percpu
這​​​會​​​回​​​報​​​此​​​控​​​制​​​群​​​組​​​的​​​所​​​有​​​任​​​務​​​(包​​​括​​​階​​​層​​​較​​​低​​​的​​​任​​​務​​​)對​​​每​​​顆​​​ CPU 消​​​耗​​​的​​​ CPU 時​​​間​​​(單​​​位​​​為​​​毫​​​秒​​​)。​​​

3.4. cpuset

cpuset 子​​​系​​​統​​​會​​​指​​​派​​​每​​​個​​​ CPU 與​​​記​​​憶​​​體​​​節​​​點​​​至​​​控​​​制​​​群​​​組​​​。​​​每​​​個​​​ cpuset 都​​​可​​​以​​​根​​​據​​​以​​​下​​​參​​​數​​​來​​​指​​​定​​​,在​​​控​​​制​​​群​​​組​​​虛​​​擬​​​檔​​​案​​​系​​​統​​​裡​​​,每​​​個​​​參​​​數​​​都​​​有​​​獨​​​立​​​的​​​「​​​pseudofile」​​​(偽​​​檔​​​案​​​):

重要

在​​​您​​​將​​​任​​​務​​​移​​​到​​​使​​​用​​​了​​​任​​​何​​​子​​​系​​​統​​​的​​​ cgroup 之​​​前​​​,您​​​必​​​須​​​設​​​定​​​這​​​些​​​子​​​系​​​統​​​的​​​一​​​些​​​必​​​要​​​參​​​數​​​。​​​舉​​​例​​​來​​​說​​​,在​​​將​​​任​​​務​​​移​​​到​​​使​​​用​​​ cpuset 子​​​系​​​統​​​的​​​ cgroup 之​​​前​​​,cpuset.cpus 與​​​ cpuset.mems 參​​​數​​​必​​​須​​​為​​​此​​​ cgroup 定​​​義​​​。​​​
cpuset.cpus(必​​​要​​​)
這​​​會​​​指​​​定​​​此​​​控​​​制​​​群​​​組​​​的​​​任​​​務​​​所​​​允​​​許​​​存​​​取​​​的​​​ CPU。​​​這​​​是​​​ ASCII 格​​​式​​​、​​​以​​​逗​​​號​​​隔​​​開​​​的​​​清​​​單​​​,減​​​號​​​(-)用​​​來​​​區​​​分​​​範​​​圍​​​。​​​例​​​如​​​:
0-2,16
代​​​表​​​第​​​ 0、​​​1、​​​2、​​​與​​​ 16 個​​​ CPU
cpuset.mems(必​​​要​​​)
指​​​定​​​此​​​控​​​制​​​群​​​組​​​的​​​任​​​務​​​所​​​允​​​許​​​存​​​取​​​的​​​記​​​憶​​​體​​​節​​​點​​​。​​​這​​​是​​​ ASCII 格​​​式​​​、​​​以​​​逗​​​號​​​隔​​​開​​​的​​​清​​​單​​​,減​​​號​​​(-)用​​​來​​​區​​​分​​​範​​​圍​​​。​​​例​​​如​​​:
0-2,16
表​​​示​​​第​​​ 0、​​​1、​​​2 與​​​ 16 的​​​記​​​憶​​​體​​​節​​​點​​​。​​​
cpuset.memory_migrate
這​​​包​​​含​​​了​​​一​​​個​​​旗​​​標​​​值​​​(0 或​​​ 1),在​​​ cpuset.mems 改​​​變​​​時​​​,是​​​否​​​要​​​把​​​記​​​憶​​​體​​​中​​​的​​​分​​​頁​​​轉​​​移​​​到​​​新​​​的​​​節​​​點​​​上​​​。​​​預​​​設​​​上​​​,記​​​憶​​​體​​​轉​​​移​​​是​​​停​​​用​​​的​​​(0),分​​​頁​​​會​​​留​​​在​​​一​​​開​​​始​​​分​​​配​​​的​​​節​​​點​​​上​​​,即​​​使​​​這​​​個​​​節​​​點​​​已​​​經​​​不​​​再​​​是​​​ cpuset.mems 所​​​指​​​定​​​的​​​節​​​點​​​之​​​一​​​。​​​如​​​果​​​啟​​​用​​​的​​​話​​​(1),那​​​麼​​​系​​​統​​​就​​​會​​​把​​​分​​​頁​​​轉​​​移​​​至​​​ cpuset.mems 所​​​指​​​定​​​的​​​參​​​數​​​之​​​記​​​憶​​​體​​​分​​​頁​​​上​​​,如​​​果​​​可​​​能​​​的​​​話​​​,會​​​保​​​留​​​其​​​相​​​對​​​位​​​置​​​:舉​​​例​​​來​​​說​​​,清​​​單​​​上​​​第​​​二​​​個​​​節​​​點​​​的​​​分​​​頁​​​最​​​開​​​始​​​是​​​由​​​ cpuset.mems 所​​​指​​​定​​​,它​​​會​​​被​​​分​​​配​​​到​​​ cpuset.mems 所​​​指​​​定​​​的​​​清​​​單​​​之​​​第​​​二​​​個​​​節​​​點​​​上​​​(如​​​果​​​空​​​間​​​允​​​許​​​的​​​話​​​)。​​​
cpuset.cpu_exclusive
這​​​包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​其​​​它​​​ cpuset 與​​​其​​​父​​​子​​​是​​​否​​​能​​​分​​​享​​​指​​​定​​​給​​​此​​​ cpuset 的​​​處​​​理​​​器​​​。​​​就​​​預​​​設​​​值​​​(0),CPU 不​​​會​​​特​​​別​​​只​​​分​​​配​​​給​​​一​​​個​​​ cpuset。​​​
cpuset.mem_exclusive
這​​​包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​其​​​它​​​ cpuset 是​​​否​​​可​​​以​​​分​​​享​​​指​​​定​​​給​​​這​​​個​​​ cpuset 的​​​記​​​憶​​​體​​​節​​​點​​​。​​​預​​​設​​​上​​​(0)記​​​憶​​​體​​​節​​​點​​​是​​​不​​​會​​​專​​​門​​​分​​​配​​​給​​​一​​​個​​​ cpuset。​​​專​​​為​​​ cpuset 保​​​留​​​記​​​憶​​​體​​​節​​​點​​​(1)的​​​功​​​用​​​,與​​​使​​​用​​​ cpuset.mem_hardwall 啟​​​用​​​記​​​憶​​​體​​​ hardwall 是​​​一​​​樣​​​的​​​。​​​
cpuset.mem_hardwall
這​​​包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​ kernel 分​​​配​​​記​​​憶​​​體​​​分​​​頁​​​與​​​緩​​​衝​​​區​​​資​​​料​​​時​​​,是​​​否​​​要​​​限​​​制​​​在​​​指​​​定​​​給​​​此​​​ cpuset 的​​​記​​​憶​​​體​​​節​​​點​​​。​​​預​​​設​​​上​​​(0),分​​​頁​​​與​​​緩​​​衝​​​區​​​資​​​料​​​會​​​由​​​屬​​​於​​​多​​​個​​​使​​​用​​​者​​​的​​​程​​​序​​​所​​​共​​​享​​​。​​​啟​​​用​​​ hardwall 之​​​後​​​(1),每​​​個​​​任​​​務​​​的​​​使​​​用​​​者​​​分​​​配​​​都​​​會​​​被​​​區​​​分​​​開​​​來​​​。​​​
cpuset.memory_pressure
這​​​是​​​一​​​個​​​唯​​​讀​​​檔​​​案​​​,包​​​含​​​此​​​ cpuset 的​​​程​​​序​​​所​​​建​​​立​​​的​​​ memory pressure(記​​​憶​​​體​​​壓​​​力​​​)的​​​執​​​行​​​平​​​均​​​值​​​。​​​這​​​個​​​偽​​​檔​​​案​​​的​​​值​​​會​​​在​​​ cpuset.memory_pressure_enabled 啟​​​用​​​時​​​自​​​動​​​更​​​新​​​;若​​​沒​​​啟​​​用​​​的​​​話​​​,這​​​個​​​偽​​​檔​​​案​​​的​​​值​​​會​​​是​​​ 0。​​​
cpuset.memory_pressure_enabled
這​​​包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​系​​​統​​​是​​​否​​​要​​​運​​​算​​​這​​​個​​​控​​​制​​​群​​​組​​​的​​​程​​​序​​​所​​​建​​​立​​​的​​​ memory pressure(記​​​憶​​​體​​​壓​​​力​​​)。​​​計​​​算​​​後​​​的​​​值​​​會​​​寫​​​至​​​ cpuset.memory_pressure,並​​​且​​​呈​​​現​​​程​​​序​​​試​​​圖​​​釋​​​放​​​記​​​憶​​​體​​​的​​​速​​​率​​​,計​​​算​​​方​​​式​​​是​​​每​​​秒​​​試​​​圖​​​重​​​新​​​取​​​得​​​記​​​憶​​​體​​​的​​​數​​​目​​​,乘​​​以​​​ 1,000。​​​
cpuset.memory_spread_page
這​​​包​​​含​​​了​​​一​​​個​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​檔​​​案​​​系​​​統​​​緩​​​衝​​​區​​​是​​​不​​​是​​​要​​​散​​​佈​​​於​​​分​​​配​​​給​​​這​​​個​​​ cpuset 的​​​記​​​憶​​​體​​​節​​​點​​​。​​​預​​​設​​​值​​​(0)表​​​示​​​不​​​把​​​這​​​些​​​記​​​憶​​​體​​​分​​​頁​​​平​​​均​​​分​​​配​​​給​​​緩​​​衝​​​區​​​,同​​​時​​​緩​​​衝​​​區​​​都​​​會​​​放​​​在​​​建​​​立​​​緩​​​衝​​​區​​​的​​​程​​​序​​​所​​​處​​​的​​​同​​​一​​​個​​​節​​​點​​​上​​​。​​​
cpuset.memory_spread_slab
這​​​包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​ kernel slab 是​​​不​​​是​​​要​​​把​​​快​​​取​​​檔​​​案​​​ I/O 的​​​運​​​作​​​,平​​​均​​​分​​​配​​​到​​​ cupset 去​​​。​​​預​​​設​​​值​​​(0)表​​​示​​​不​​​平​​​均​​​分​​​配​​​ kernel slab 快​​​取​​​,而​​​且​​​ slab 快​​​取​​​會​​​放​​​在​​​建​​​立​​​快​​​取​​​的​​​程​​​序​​​所​​​在​​​的​​​同​​​樣​​​節​​​點​​​上​​​。​​​
cpuset.sched_load_balance
包​​​含​​​了​​​旗​​​標​​​值​​​(0 或​​​ 1),指​​​定​​​ kernel 是​​​不​​​是​​​要​​​對​​​此​​​ cpuset 中​​​的​​​ CPU 進​​​行​​​負​​​載​​​平​​​衡​​​。​​​預​​​設​​​值​​​(1)會​​​進​​​行​​​負​​​載​​​平​​​衡​​​,把​​​負​​​載​​​過​​​重​​​的​​​ CPU 的​​​程​​​序​​​移​​​到​​​負​​​載​​​較​​​輕​​​的​​​ CPU 上​​​。​​​
然​​​而​​​請​​​注​​​意​​​,若​​​在​​​任​​​何​​​父​​​控​​​制​​​群​​​組​​​中​​​啟​​​用​​​了​​​負​​​載​​​平​​​衡​​​,在​​​控​​​制​​​群​​​組​​​中​​​設​​​定​​​此​​​旗​​​標​​​將​​​不​​​會​​​造​​​成​​​影​​​響​​​,因​​​為​​​負​​​載​​​平​​​衡​​​已​​​在​​​更​​​高​​​的​​​層​​​級​​​中​​​進​​​行​​​了​​​。​​​因​​​此​​​,若​​​要​​​停​​​用​​​控​​​制​​​群​​​組​​​中​​​的​​​負​​​載​​​平​​​衡​​​,您​​​也​​​必​​​須​​​停​​​用​​​它​​​在​​​層​​​級​​​中​​​,其​​​所​​​有​​​ parent 的​​​負​​​載​​​平​​​衡​​​。​​​在​​​此​​​情​​​況​​​下​​​,您​​​亦​​​必​​​須​​​考​​​量​​​是​​​否​​​要​​​啟​​​用​​​該​​​控​​​制​​​群​​​組​​​同​​​層​​​級​​​的​​​負​​​載​​​平​​​衡​​​。​​​
cpuset.sched_relax_domain_level
這​​​包​​​含​​​了​​​介​​​於​​​ -1 到​​​一​​​個​​​小​​​的​​​正​​​整​​​數​​​之​​​間​​​,表​​​示​​​ kernel 進​​​行​​​負​​​載​​​平​​​衡​​​的​​​ CPU 範​​​圍​​​。​​​如​​​果​​​ cpuset.sched_load_balance 停​​​用​​​的​​​話​​​,這​​​個​​​值​​​就​​​沒​​​有​​​任​​​何​​​意​​​義​​​。​​​
這​​​個​​​值​​​的​​​精​​​確​​​意​​​義​​​與​​​系​​​統​​​架​​​構​​​有​​​關​​​;但​​​以​​​下​​​是​​​幾​​​個​​​典​​​型​​​的​​​值​​​:
cpuset.sched_relax_domain_level 的​​​值​​​
值​​​效​​​用​​​
-1系​​​統​​​預​​​設​​​值​​​,用​​​於​​​負​​​載​​​平​​​衡​​​
0不​​​要​​​立​​​即​​​進​​​行​​​負​​​載​​​平​​​衡​​​;只​​​有​​​在​​​定​​​期​​​的​​​時​​​候​​​進​​​行​​​
1立​​​即​​​對​​​同​​​樣​​​核​​​心​​​的​​​所​​​有​​​執​​​行​​​續​​​進​​​行​​​負​​​載​​​平​​​衡​​​
2立​​​即​​​對​​​同​​​樣​​​套​​​件​​​的​​​所​​​有​​​核​​​心​​​進​​​行​​​負​​​載​​​平​​​衡​​​
3立​​​即​​​對​​​同​​​樣​​​節​​​點​​​或​​​刀​​​鋒​​​伺​​​服​​​器​​​的​​​所​​​有​​​ CPU 進​​​行​​​負​​​載​​​平​​​衡​​​
4立​​​即​​​對​​​ NUMA 架​​​構​​​的​​​多​​​個​​​ CPU 進​​​行​​​負​​​載​​​平​​​衡​​​
5立​​​即​​​對​​​ NUMA 架​​​構​​​的​​​所​​​有​​​ CPU 進​​​行​​​負​​​載​​​平​​​衡​​​

3.5. devices

devices 子​​​系​​​統​​​能​​​允​​​許​​​或​​​拒​​​絕​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​存​​​取​​​裝​​​置​​​。​​​

重要

裝​​​置​​​的​​​白​​​名​​​單​​​(devices)子​​​系​​​統​​​被​​​視​​​為​​​ Red Hat Enterprise Linux 6 中​​​的​​​技​​​術​​​預​​​覽​​​。​​​
技​​​術​​​預​​​覽​​​功​​​能​​​目​​​前​​​在​​​ Red Hat Enterprise Linux 6 訂​​​閱​​​服​​​務​​​中​​​不​​​受​​​支​​​援​​​、​​​可​​​能​​​無​​​法​​​完​​​整​​​運​​​作​​​,並​​​且​​​一​​​般​​​並​​​不​​​適​​​合​​​使​​​用​​​於​​​生​​​產​​​環​​​境​​​。​​​然​​​而​​​,為​​​了​​​方​​​便​​​使​​​用​​​者​​​,Red Hat 在​​​作​​​業​​​系​​​統​​​中​​​包​​​含​​​了​​​這​​​些​​​功​​​能​​​,並​​​為​​​這​​​項​​​功​​​能​​​提​​​供​​​了​​​更​​​多​​​的​​​曝​​​光​​​率​​​。​​​您​​​也​​​許​​​會​​​在​​​非​​​生​​​產​​​的​​​環​​​境​​​下​​​發​​​現​​​這​​​些​​​功​​​能​​​非​​​常​​​有​​​幫​​​助​​​,您​​​亦​​​可​​​在​​​技​​​術​​​預​​​覽​​​功​​​能​​​受​​​到​​​完​​​整​​​支​​​援​​​之​​​前​​​,提​​​供​​​意​​​見​​​和​​​功​​​能​​​上​​​的​​​建​​​議​​​。​​​
devices.allow
這​​​指​​​定​​​了​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​可​​​以​​​存​​​取​​​哪​​​些​​​裝​​​置​​​?每​​​個​​​條​​​目​​​都​​​包​​​含​​​四​​​個​​​欄​​​位​​​: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 是​​​某​​​個​​​ SCS 硬​​​碟​​​的​​​主​​​要​​​編​​​號​​​,而​​​ 1 是​​​第​​​一​​​組​​​ SCSI 硬​​​碟​​​的​​​第​​​一​​​個​​​分​​​割​​​區​​​,那​​​麼​​​ 8:1 就​​​完​​​全​​​表​​​明​​​了​​​這​​​個​​​分​​​割​​​區​​​,對​​​應​​​到​​​ /dev/sda1 裡​​​的​​​一​​​個​​​檔​​​案​​​系​​​統​​​位​​​置​​​。​​​
* 表​​​示​​​所​​​有​​​的​​​主​​​要​​​與​​​次​​​要​​​裝​​​置​​​節​​​點​​​,舉​​​例​​​來​​​說​​​,9:*(所​​​有​​​ RAID 裝​​​置​​​)或​​​ *:*(所​​​有​​​裝​​​置​​​)。​​​
access
access(存​​​取​​​)是​​​以​​​下​​​一​​​或​​​多​​​的​​​字​​​母​​​:
  • r:允​​​許​​​任​​​務​​​讀​​​取​​​特​​​定​​​裝​​​置​​​
  • w:允​​​許​​​任​​​務​​​寫​​​入​​​特​​​定​​​裝​​​置​​​
  • m:允​​​許​​​任​​​務​​​建​​​立​​​不​​​存​​​在​​​的​​​裝​​​置​​​
舉​​​例​​​來​​​說​​​,access 指​​​定​​​為​​​ r 的​​​時​​​候​​​,任​​​務​​​就​​​只​​​能​​​讀​​​取​​​裝​​​置​​​;但​​​當​​​ access 指​​​定​​​為​​​ rw 時​​​,任​​​務​​​就​​​可​​​以​​​對​​​裝​​​置​​​進​​​行​​​讀​​​、​​​寫​​​。​​​
devices.deny
指​​​定​​​控​​​制​​​群​​​組​​​中​​​的​​​任​​​務​​​不​​​能​​​存​​​取​​​的​​​裝​​​置​​​。​​​這​​​裡​​​的​​​語​​​法​​​跟​​​ devices.allow 完​​​全​​​一​​​樣​​​。​​​
devices.list
回​​​報​​​在​​​此​​​控​​​制​​​群​​​組​​​中​​​,已​​​針​​​對​​​於​​​工​​​作​​​設​​​置​​​了​​​存​​​取​​​控​​​制​​​的​​​裝​​​置​​​。​​​

3.6. freezer

freezer 子​​​系​​​統​​​可​​​中​​​止​​​或​​​復​​​原​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​。​​​
freezer.state
freezer.state 能​​​擁​​​有​​​三​​​個​​​不​​​同​​​的​​​值​​​:
  • FROZEN —​​​ 控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​將​​​被​​​中​​​止​​​。​​​
  • FREEZING —​​​ 系​​​統​​​正​​​在​​​中​​​止​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​。​​​
  • THAWED —​​​ 控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​已​​​復​​​原​​​。​​​
要​​​暫​​​停​​​某​​​個​​​特​​​定​​​的​​​程​​​序​​​:
  1. 將​​​該​​​程​​​序​​​移​​​動​​​到​​​擁​​​有​​​ freezer 子​​​系​​​統​​​所​​​連​​​接​​​之​​​層​​​級​​​的​​​ cgroup 裡​​​。​​​
  2. 凍​​​結​​​該​​​特​​​定​​​的​​​ cgroup,以​​​暫​​​停​​​其​​​中​​​的​​​程​​​序​​​。​​​
把​​​程​​​序​​​移​​​動​​​到​​​以​​​暫​​​停​​​(凍​​​結​​​)的​​​ cgroup 是​​​不​​​可​​​能​​​的​​​。​​​
請​​​注​​​意​​​,FROZEN 和​​​ THAWED 這​​​兩​​​個​​​值​​​可​​​寫​​​入​​​ freezer.stateFREEZING 則​​​是​​​唯​​​讀​​​,無​​​法​​​寫​​​入​​​。​​​

3.7. memory

memory(記​​​憶​​​體​​​)子​​​系​​​統​​​會​​​根​​​據​​​使​​​用​​​於​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​的​​​記​​​憶​​​體​​​資​​​源​​​,自​​​動​​​產​​​生​​​記​​​憶​​​體​​​報​​​告​​​,然​​​後​​​設​​​定​​​這​​​些​​​工​​​作​​​所​​​能​​​使​​​用​​​的​​​記​​​憶​​​體​​​限​​​制​​​:
memory.stat
回​​​報​​​廣​​​泛​​​的​​​記​​​憶​​​體​​​數​​​據​​​,如​​​以​​​下​​​表​​​格​​​所​​​述​​​:

表格 3.1. memory.stat 所​​​回​​​報​​​的​​​值​​​

數​​​據​​​ 描​​​述​​​
cache 分​​​頁​​​快​​​取​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
rss 匿​​​名​​​與​​​ swap 快​​​取​​​,不​​​包​​​含​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
mapped_file 記​​​憶​​​體​​​映​​​射​​​的​​​已​​​映​​​射​​​檔​​​案​​​之​​​大​​​小​​​,包​​​括​​​ tmpfsshmem)單​​​位​​​為​​​位​​​元​​​組​​​
pgpgin 分​​​至​​​記​​​憶​​​體​​​中​​​的​​​分​​​頁​​​數​​​量​​​
pgpgout 由​​​記​​​憶​​​體​​​中​​​分​​​出​​​的​​​分​​​頁​​​數​​​量​​​
swap swap 使​​​用​​​量​​​,單​​​位​​​為​​​位​​​元​​​組​​​
active_anon 啟​​​用​​​中​​​、​​​最​​​近​​​最​​​少​​​使​​​用​​​的​​​(LRU)清​​​單​​​上​​​的​​​匿​​​名​​​,以​​​及​​​ swap 快​​​取​​​記​​​憶​​​體​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
inactive_anon 未​​​啟​​​用​​​的​​​ LRU 清​​​單​​​上​​​的​​​匿​​​名​​​與​​​ swap 快​​​取​​​,包​​​括​​​ tmpfsshmem),單​​​位​​​為​​​位​​​元​​​組​​​
active_file 啟​​​用​​​中​​​的​​​ LRU 清​​​單​​​上​​​的​​​檔​​​案​​​支​​​援​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
inactive_file 非​​​啟​​​用​​​中​​​ LRU 清​​​單​​​上​​​的​​​檔​​​案​​​支​​​援​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
unevictable 無​​​法​​​重​​​新​​​收​​​回​​​的​​​記​​​憶​​​體​​​,單​​​位​​​為​​​位​​​元​​​組​​​
hierarchical_memory_limit 包​​​含​​​了​​​ memory cgroup 的​​​階​​​層​​​記​​​憶​​​體​​​限​​​制​​​,單​​​位​​​為​​​位​​​元​​​組​​​
hierarchical_memsw_limit 記​​​憶​​​體​​​加​​​上​​​包​​​含​​​了​​​ memory cgroup 的​​​階​​​層​​​的​​​ swap 限​​​制​​​,單​​​位​​​為​​​位​​​元​​​組​​​
此​​​外​​​,除​​​了​​​ hierarchical_memory_limit 和​​​ hierarchical_memsw_limit 之​​​外​​​,這​​​些​​​檔​​​案​​​皆​​​有​​​對​​​應​​​的​​​前​​​綴​​​ total_,它​​​不​​​僅​​​會​​​回​​​報​​​控​​​制​​​群​​​組​​​,還​​​會​​​回​​​報​​​它​​​的​​​所​​​有​​​子​​​群​​​組​​​。​​​比​​​方​​​說​​​,swap 會​​​回​​​報​​​控​​​制​​​群​​​組​​​的​​​ swap 使​​​用​​​量​​​,而​​​ total_swap 則​​​會​​​回​​​報​​​控​​​制​​​群​​​組​​​和​​​其​​​所​​​有​​​子​​​群​​​組​​​的​​​ swap 使​​​用​​​量​​​。​​​
當​​​您​​​詮​​​釋​​​ memory.stat 所​​​回​​​報​​​的​​​值​​​時​​​,請​​​注​​​意​​​各​​​數​​​據​​​如​​​何​​​相​​​互​​​關​​​聯​​​;
  • active_anon + inactive_anon = anonymous memory + tmpfs 的​​​檔​​​案​​​快​​​取​​​ + swap 快​​​取​​​
    因​​​此​​​,active_anon + inactive_anon ≠​​​ rss,因​​​為​​​ rss 不​​​包​​​含​​​ tmpfs。​​​
  • active_file + inactive_file = cache - tmpfs 的​​​大​​​小​​​
memory.usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​目​​​前​​​所​​​使​​​用​​​的​​​記​​​憶​​​體​​​使​​​用​​​量​​​總​​​數​​​(位​​​元​​​組​​​)。​​​
memory.memsw.usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​目​​​前​​​所​​​使​​​用​​​的​​​記​​​憶​​​體​​​數​​​量​​​與​​​ swap 空​​​間​​​的​​​總​​​和​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.max_usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​所​​​使​​​用​​​的​​​最​​​大​​​記​​​憶​​​體​​​數​​​量​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.memsw.max_usage_in_bytes
回​​​報​​​控​​​制​​​群​​​組​​​中​​​,程​​​序​​​所​​​使​​​用​​​的​​​最​​​大​​​記​​​憶​​​體​​​數​​​量​​​與​​​ swap 空​​​間​​​(單​​​位​​​為​​​位​​​元​​​組​​​)。​​​
memory.limit_in_bytes
設​​​置​​​最​​​大​​​的​​​使​​​用​​​者​​​記​​​憶​​​體​​​數​​​量​​​(包​​​括​​​檔​​​案​​​快​​​取​​​)。​​​若​​​沒​​​有​​​指​​​定​​​單​​​位​​​的​​​話​​​,數​​​值​​​將​​​會​​​被​​​解​​​譯​​​為​​​位​​​元​​​組​​​。​​​然​​​而​​​,您​​​可​​​透​​​過​​​使​​​用​​​字​​​尾​​​來​​​指​​​定​​​較​​​大​​​的​​​單​​​位​​​ —​​​ k 或​​​ K 代​​​表​​​ KB,m 或​​​ M 代​​​表​​​ MB,以​​​及​​​ g 或​​​ G 則​​​代​​​表​​​ GB。​​​
您​​​無​​​法​​​使​​​用​​​ memory.limit_in_bytes 來​​​限​​​制​​​ root 控​​​制​​​群​​​組​​​;您​​​只​​​可​​​將​​​值​​​套​​​用​​​至​​​階​​​層​​​中​​​,處​​​於​​​較​​​低​​​階​​​層​​​的​​​群​​​組​​​中​​​。​​​
將​​​ -1 寫​​​入​​​ memory.limit_in_bytes,以​​​移​​​除​​​任​​​何​​​既​​​有​​​的​​​限​​​制​​​。​​​
memory.memsw.limit_in_bytes
設​​​置​​​最​​​大​​​的​​​記​​​憶​​​體​​​總​​​和​​​與​​​ swap 使​​​用​​​量​​​。​​​若​​​沒​​​有​​​指​​​定​​​單​​​位​​​的​​​話​​​,數​​​值​​​將​​​會​​​被​​​解​​​譯​​​為​​​位​​​元​​​組​​​。​​​然​​​而​​​,您​​​可​​​透​​​過​​​使​​​用​​​字​​​尾​​​來​​​指​​​定​​​較​​​大​​​的​​​單​​​位​​​ —​​​ k 或​​​ K 代​​​表​​​ KB,m 或​​​ M 代​​​表​​​ MB,以​​​及​​​ g 或​​​ G 則​​​代​​​表​​​ GB。​​​
您​​​無​​​法​​​使​​​用​​​ memory.memsw.limit_in_bytes 來​​​限​​​制​​​ root 控​​​制​​​群​​​組​​​;您​​​只​​​可​​​將​​​值​​​套​​​用​​​至​​​階​​​層​​​中​​​,處​​​於​​​較​​​低​​​階​​​層​​​的​​​群​​​組​​​中​​​。​​​
將​​​ -1 寫​​​入​​​ memory.memsw.limit_in_bytes,以​​​移​​​除​​​任​​​何​​​既​​​有​​​的​​​限​​​制​​​。​​​
memory.failcnt
回​​​報​​​記​​​憶​​​體​​​限​​​制​​​超​​​過​​​ memory.limit_in_bytes 中​​​所​​​設​​​置​​​的​​​值​​​的​​​次​​​數​​​。​​​
memory.memsw.failcnt
回​​​報​​​記​​​憶​​​體​​​加​​​上​​​ swap 空​​​間​​​限​​​制​​​超​​​過​​​ memory.memsw.limit_in_bytes 中​​​所​​​設​​​置​​​的​​​值​​​的​​​次​​​數​​​。​​​
memory.force_empty
當​​​設​​​為​​​ 0 時​​​,會​​​將​​​此​​​控​​​制​​​群​​​組​​​中​​​的​​​工​​​作​​​所​​​使​​​用​​​的​​​所​​​有​​​分​​​頁​​​記​​​憶​​​體​​​清​​​空​​​。​​​此​​​介​​​面​​​只​​​能​​​在​​​控​​​制​​​群​​​組​​​沒​​​有​​​工​​​作​​​時​​​才​​​可​​​使​​​用​​​。​​​若​​​記​​​憶​​​體​​​無​​​法​​​釋​​​放​​​的​​​話​​​,它​​​便​​​會​​​視​​​情​​​況​​​被​​​移​​​至​​​父​​​控​​​制​​​群​​​組​​​中​​​。​​​請​​​在​​​移​​​除​​​控​​​制​​​群​​​組​​​之​​​前​​​,使​​​用​​​ memory.force_empty 來​​​避​​​免​​​將​​​未​​​使​​​用​​​的​​​分​​​頁​​​快​​​取​​​移​​​至​​​其​​​父​​​控​​​制​​​群​​​組​​​中​​​。​​​
memory.swappiness
設​​​置​​​ kernel 的​​​傾​​​向​​​特​​​性​​​,以​​​將​​​使​​​用​​​於​​​此​​​控​​​制​​​群​​​組​​​中​​​的​​​程​​​序​​​的​​​記​​​憶​​​體​​​換​​​出​​​,而​​​不​​​是​​​由​​​分​​​頁​​​快​​​取​​​收​​​回​​​分​​​頁​​​。​​​這​​​和​​​為​​​系​​​統​​​設​​​置​​​於​​​ /proc/sys/vm/swappiness 中​​​的​​​特​​​性​​​相​​​同​​​,計​​​算​​​方​​​式​​​也​​​相​​​同​​​。​​​預​​​設​​​值​​​為​​​ 60。​​​若​​​使​​​用​​​的​​​值​​​比​​​ 60 還​​​要​​​低​​​的​​​話​​​,將​​​會​​​降​​​低​​​ kernel 換​​​出​​​程​​​序​​​記​​​憶​​​體​​​的​​​傾​​​向​​​,大​​​於​​​ 60 的​​​值​​​會​​​提​​​高​​​ kernel 換​​​出​​​程​​​序​​​記​​​憶​​​體​​​的​​​傾​​​向​​​,並​​​且​​​當​​​值​​​大​​​於​​​ 100 時​​​,kernel 將​​​會​​​開​​​始​​​換​​​出​​​此​​​控​​​制​​​群​​​組​​​中​​​,屬​​​於​​​程​​​序​​​的​​​位​​​址​​​空​​​間​​​一​​​部​​​分​​​的​​​分​​​頁​​​。​​​
請​​​注​​​意​​​,0 這​​​個​​​值​​​無​​​法​​​避​​​免​​​程​​​序​​​記​​​憶​​​體​​​被​​​切​​​換​​​出​​​;當​​​系​​​統​​​記​​​憶​​​體​​​不​​​足​​​時​​​,換​​​出​​​這​​​個​​​動​​​作​​​還​​​是​​​有​​​可​​​能​​​會​​​發​​​生​​​,因​​​為​​​全​​​域​​​虛​​​擬​​​記​​​憶​​​體​​​管​​​理​​​邏​​​輯​​​不​​​會​​​讀​​​取​​​ cgroup 的​​​值​​​。​​​若​​​要​​​完​​​全​​​地​​​封​​​鎖​​​分​​​頁​​​,請​​​使​​​用​​​ mlock() 來​​​代​​​替​​​ cgroup。​​​
您​​​不​​​可​​​更​​​改​​​下​​​列​​​群​​​組​​​的​​​ swappiness:
  • root 控​​​制​​​群​​​組​​​,使​​​用​​​了​​​設​​​置​​​於​​​ /proc/sys/vm/swappiness 中​​​的​​​ swappiness。​​​
  • 一​​​個​​​底​​​下​​​含​​​有​​​子​​​群​​​組​​​的​​​控​​​制​​​群​​​組​​​。​​​
memory.use_hierarchy
包​​​含​​​一​​​個​​​指​​​定​​​記​​​憶​​​體​​​使​​​用​​​量​​​是​​​否​​​應​​​被​​​記​​​入​​​控​​​制​​​群​​​組​​​階​​​層​​​中​​​的​​​旗​​​標​​​(0 或​​​ 1)。​​​若​​​啟​​​用​​​的​​​話​​​(1),記​​​憶​​​體​​​控​​​制​​​器​​​將​​​會​​​由​​​超​​​過​​​了​​​它​​​記​​​憶​​​體​​​限​​​制​​​的​​​程​​​序​​​和​​​子​​​程​​​序​​​收​​​回​​​記​​​憶​​​體​​​。​​​就​​​預​​​設​​​值​​​(0)來​​​說​​​,控​​​制​​​器​​​不​​​會​​​由​​​一​​​項​​​工​​​作​​​的​​​子​​​程​​​序​​​收​​​回​​​記​​​憶​​​體​​​。​​​

3.8. net_cls

net_cls 子​​​系​​​統​​​會​​​以​​​一​​​個​​​ class 標​​​識​​​符​​​號​​​(classid)來​​​標​​​記​​​網​​​路​​​封​​​包​​​,這​​​能​​​讓​​​ Linux 流​​​量​​​控​​​制​​​器​​​(tc)辨​​​識​​​源​​​自​​​於​​​特​​​定​​​控​​​制​​​群​​​組​​​的​​​封​​​包​​​。​​​流​​​量​​​控​​​制​​​器​​​能​​​被​​​配​​​置​​​來​​​指​​​定​​​不​​​同​​​的​​​優​​​先​​​順​​​序​​​給​​​來​​​自​​​於​​​不​​​同​​​控​​​制​​​群​​​組​​​的​​​封​​​包​​​。​​​
net_cls.classid
net_cls.classid 包​​​含​​​了​​​一​​​個​​​格​​​式​​​為​​​十​​​六​​​進​​​位​​​的​​​單​​​獨​​​數​​​值​​​,它​​​顯​​​示​​​了​​​流​​​量​​​控​​​制​​​控​​​點​​​(handle)。​​​比​​​方​​​說​​​,0x1001 代​​​表​​​了​​​照​​​慣​​​例​​​寫​​​成​​​ 10:1 的​​​控​​​點​​​。​​​
這​​​些​​​控​​​點​​​的​​​格​​​式​​​為​​​:0xAAAABBBBAAAA 為​​​十​​​六​​​進​​​位​​​的​​​ major 數​​​字​​​,而​​​ BBBB 則​​​為​​​十​​​六​​​進​​​位​​​的​​​ minor 數​​​字​​​。​​​您​​​可​​​忽​​​略​​​掉​​​前​​​綴​​​的​​​零​​​;0x10001 和​​​ 0x00010001 是​​​相​​​同​​​的​​​,並​​​且​​​代​​​表​​​ 1:1。​​​
欲​​​學​​​習​​​如​​​何​​​配​​​置​​​流​​​量​​​控​​​制​​​器​​​,以​​​使​​​用​​​ net_cls 附​​​加​​​至​​​網​​​路​​​封​​​包​​​的​​​ handle,請​​​參​​​閱​​​ tc 的​​​ man page。​​​

3.9. ns

ns 子​​​系​​​統​​​提​​​供​​​了​​​將​​​程​​​序​​​分​​​組​​​為​​​個​​​別​​​命​​​名​​​空​​​間​​​(namespace)。​​​在​​​特​​​定​​​命​​​名​​​空​​​間​​​中​​​,程​​​序​​​可​​​互​​​相​​​進​​​行​​​互​​​動​​​,不​​​過​​​卻​​​會​​​與​​​在​​​其​​​它​​​命​​​名​​​空​​​間​​​中​​​執​​​行​​​的​​​程​​​序​​​隔​​​離​​​。​​​當​​​使​​​用​​​於​​​作​​​業​​​系​​​統​​​層​​​級​​​的​​​虛​​​擬​​​化​​​時​​​,這​​​些​​​個​​​別​​​的​​​命​​​名​​​空​​​間​​​有​​​時​​​亦​​​稱​​​為​​​容​​​器​​​(container)。​​​

3.10. 額​​​外​​​資​​​源​​​

系​​​統​​​特​​​屬​​​的​​​ kernel 文​​​件​​​

下​​​列​​​所​​​有​​​檔​​​案​​​皆​​​位​​​於​​​ /usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/ 目​​​錄​​​中​​​。​​​
  • blkio 子​​​系​​​統​​​ —​​​ blkio-controller.txt
  • cpuacct 子​​​系​​​統​​​ —​​​ cpuacct.txt
  • cpuset 子​​​系​​​統​​​ —​​​ cpusets.txt
  • devices 子​​​系​​​統​​​ —​​​ devices.txt
  • freezer 子​​​系​​​統​​​ —​​​ freezer-subsystem.txt
  • memory 子​​​系​​​統​​​ —​​​ memory.txt

附錄 A. 修​​​訂​​​紀​​​錄​​​

修訂記錄
修訂 1-5.4002013-10-31Rüdiger Landmann
Rebuild with publican 4.0.0
修訂 1-52012-07-18Anthony Towns
Rebuild for Publican 3.0
修訂 1.0-5Thu May 19 2011Martin Prpič
《​​​資​​​源​​​管​​​理​​​指​​​南​​​》​​​的​​​ Red Hat Enterprise Linux 6.1 GA 版​​​。​​​
修訂 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
修​​​正​​​了​​​ remount 的​​​範​​​例​​​ —​​​ BZ#612805
修訂 1.0-2Thu Nov 11 2010Rüdiger Landmann
移​​​除​​​預​​​發​​​行​​​意​​​見​​​的​​​指​​​示​​​
修訂 1.0-1Wed Nov 10 2010Rüdiger Landmann
來​​​自​​​於​​​ QE 的​​​修​​​正​​​ —​​​ BZ#581702 and BZ#612805
修訂 1.0-0Tue Nov 9 2010Rüdiger Landmann
GA 的​​​完​​​整​​​功​​​能​​​版​​​本​​​

法律聲明

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.