第 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 重​​​新​​​设​​​定​​​统​​​计​​​数​​​据​​​。​​​