章 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 的​​​數​​​據​​​。​​​