Share
Embed
cgroup v1 の内部構造 / 13th CTStudy
「第13回コンテナ技術の情報交換会@オンライン」の発表資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。
tenforward
December 05, 2020
Transcript
40 slides
-
ࣗݾհʢ1ʣ Ճ౻ହจ Twitter @ten_forward github https://github.com/tenforward ٕज़ϒϩά https://tenforward.hatenablog.com/ ॴଐ גࣜձࣾ
IDC や゜アふくぎ / lxc-jp Project / Plamo Linux ゐアふべそ゚がゆ 2/37 -
ࣗݾհʢ2ʣ झຯ〜ぢアふべ〹〘〛〳『ɻぢアふべ〣ओ〠じがぼ゚पล〣࣮〠ڵຯ⿴〿〳『ɻ 2007 ぢアふべぇ〘〔つがもと։ൃʢVirtuozzoʣ 2009 OpenVZ/LXC ৮〿〕『 2013
ୈ 1 ճぢアふべܕԾԽ〣ใަձ։࠵ LXC ຊޠ man pages ༁&ろがで ʢݱࡏ〤 LXD ؔ࿈〣༁ɺlinuxcontainers.org ༁〷〹〘〛〳『ʣ 2014 gihyo.jp 〜 ʮLXC 〜ֶ〫ぢアふべೖ ʵܰྔԾԽڥぇ࣮ݱ『ٕज़ʯ ࿈ࡌ։࢝ ݱࡏ CloudNative 〣〠〿ぁ 3/37 -
ຊ〣༰ cgroup 〣ߏମؒ〣ؔぇத৺〠「〳『ɻ • cgroup v1 〣ぢがへぇཧղ『্〜〘〛⿶〝ྑ《〒⿸〟 cgroup 〣෦ߏ〠〙⿶ 〛આ໌「〳『
• cgroup v1 〜のとぜ cgroup ؒぇҠಈ『ࡍ〣ॲཧ〠ؔ『ߏମぇઆ໌「〳『 આ໌〣લఏ〝「〛: • جຊత〠〤 cgroup v1 〠〙⿶〛「〳『ɺߏࣗମ〤 v2 〜〷มい〿〳【え〣〜 v2 ぇཧղ『ࡍ〠〷ཱ〙〤』〜『 • આ໌〣よがと〤 4.19 kernel 〜『 جຊత〟 cgroup v1 〣આ໌〠〙⿶〛〤ɺࢲ〣࿈ࡌぇ〉ཡ。〕《⿶ʢୈ 3ʙ5 ճʣ ɻ • LXC 〜ֶ〫ぢアふべೖ ʵܰྔԾԽڥぇ࣮ݱ『ٕज़ ʢgihyo.jpʣ 4/37 -
cgroup 《〾⿶ cgroup • cgroup ༻〣ٙࣅやきぐ゚てとふわぇろげアぷ「〛⿸ • び゙がߏぇ〝〿ɺぶく゛ぜぷ゙ cgroup ぇද『ʢkernfs
〣ػೳぇ༻ʣ • ぶく゛ぜぷ゙த〠ग़ݱ『やきぐ゚〜ぢアぷ゜が゚ぇߦ〘〔〿ઃఆぇऔಘ「〔〿『 • ぢアぷ゜が゚「〔⿶゙ぬがと〉〝〠ʮぢアぷ゜ががʢつゅてとふわʣ ʯ४උ《ぁ cgroup v1 • ෳ֊ʢび゙がʣߏ • び゙が〉〝〠ぢアぷ゜ががぇ〧〷〚々 • ҙ〣 cgroup 〠のとぜʢゆ゜なとɺと゛ひへʣॴଐ〜 • ෳ〣び゙が⿴߹ɺてとふわ্〣のとぜ〤ඞ』֤び゙が〜〧〝〙〣 cgroup 〠ॴଐ 『 5/37 -
cgroup 〝のとぜ〠ؔ『ॲཧ〣લఏ cgroup 〠ؔいॲཧɿ 1. のとぜぇ cgroup 〠ׂ〿〛ɻのとぜ cgroup ؒぇҠಈ『
2. cgroup 〠ॴଐ『のとぜぇऔಘ『ɻのとぜ〠ର『 cgroup ぇऔಘ『ɻのとぜぢ アぷ゜がが〣ঢ়ଶ〠ぎぜなと『 ̍ʹൺΔͱ̎ͷස͕ߴ͍ɻͳͷͰ͕̎ศརͳߏΛऔ͍ͬͯΔʢ々〞ɺ〒ぁ〜〤ෆศ〟〣〜 てゖがぷじひぷߏମ〠ؚ〳ぁ〛⿶〔〿『ˠ༨ܭ〹〹〈「⿶ʣ 7/37 -
cgroup_subsys ߏମ ぢアぷ゜がが〒〣〷〣ɻぢアぷ゜ががぇ࣮『ࡍ〤ɺ〈〣ߏମぇఆٛ「〛ඞཁ〟ぢが゚ みひぜؔ〟〞ぇඞཁ〠Ԡ」〛࣮「〛⿶。ɻ • ぢアぷ゜がが〣ใぇఆٛ『 • cgroup 〠ؔい༷ʑ〟ॲཧぇߦ⿸໘〜⿸ぢが゚みひぜؔぇఆٛ『 •
てとふわ〜⿺ぢアぷ゜がが〤ɺじがぼ゚〣 config ࣌〠ܾఆ《ぁ Table 1: cgroup_subsys ߏମʢൈਮʣ ม໊ ઃఆ『ؔ〣ॲཧ name ぢアぷ゜がが໊ css_alloc cgroup_subsys_state ߏମ〣ゐゑ゙がぇ֬อ『ؔ css_online ぢアぷ゜がが〣ઃఆぇྃ《【ؔ can_attach ʢぢアぷ゜がが〝「〛ʣcgroup 〠のとぜҠಈ〜 ぇ֬ೝ『ؔ attach cgroup 〠のとぜҠಈ「〔⿴〝〣ॲཧぇߦ⿸ؔ legacy_cftypes cgroup v1 〣 cgroup 〜ग़ݱ『やきぐ゚ใ〠ؔ『 cftype ߏମ〣ྻ 9/37 -
cgroup ߏମ 〳』〤 cgroup ߏମぇݟ〛〴〳「〼⿸ɻ Table 2: cgroup ߏମʢൈਮʣ ܕ
ม໊ આ໌ cgroup_subsys_state self ࣗ〣ૢ࡞〠⿸〔〶〣 cgroup_subsys_state ߏମ unsigned long flags ࣗ〣ڍಈぇઃఆ『やそ int id ֊〣 cgroup 〣 ID int nr_populated_csets ࣗ〠〧〷〚⿶〛⿶ۭ〜〟⿶ css_set 〣 kernfs_node kn ࣗ〣ぶく゛ぜぷ゙ぇද『 kernfs 〣ぽがへ cgroup_subsys_state* subsys ࣗ〠〧〷〚。 cgroup_subsys_state ߏମ〣ྻ cgroup_root root ࣗॴଐ『֊〣 root cgroup list_head cset_links ࣗ〠ॴଐ『のとぜ〠ؔ『 css_set ぇࢦ『 cgrp_cset_links ߏ ମ list_head pidlists tasksɺcgroup.procs やきぐ゚〠ॻぁ PID/TID 〣゙とぷ〜⿴ cgroup_pidlist ߏମ〣゙とぷ work_struct release_agent_work cgroup 〣のとぜ〟。〟〘〔〝 〠༻『ぢが゚みひぜؔぇొ 『ゞがぜずゔが) 12/37 -
cgroup ߏମ • のとぜぇද『 task_struct ߏମ〠ؔ࿈『ゐアみ〤⿶〟⿶ • ぢアぷ゜がが〠ؔ࿈『ゐアみ〤ଘࡏ『ˠ cgroup_subsys_state ߏମ〣ྻ
subsysʢޙड़ʣ • やきぐ゚てとふわ〝「〛〣֊ߏ〤 kernfs_node ߏମ〣 kn 〜ཧ《ぁ • やきぐ゚てとふわ〝「〛〕々〜〟。ɺ゙ぬがとཧ〣؍〾֊ߏʢઌ〹ࢠଙʣぇ〔 〞ඞཁੑ⿴ • subsys 〝〤ผ〠〷⿸〧〝〙 cgroup_subsys_state ߏମ self ଘࡏ『ˡॏཁ 13/37 -
cgroup_subsys_state ߏମ • ໊લ௨〿ɺಛఆ〣ʮcgroupʯ〣ಛఆ〣ʮίϯτϩʔϥʔʢαϒγεςϜʣʯ ʢsubsysʣ〣 ʮঢ়ଶʯ ʢstateʣぇཧ『 • 〙〳〿 •
〧〝〙〣 cgroup 〠ର『 • ʢ〒〣 cgroup 〜ཧ《ぁʣ〧〝〙〣ぢアぷ゜がが〉〝 〠〧〝〙 cgroup_subsys_state ߏମଘࡏ『 15/37 -
cgroup_subsys_state ߏମ Table 3: cgroup_subsys_state ߏମʢൈਮʣ ܕ ม໊ આ໌ cgroup
cgroup ࣗ〧〷〚。 cgroup ߏମ cgroup_subsys ss ࣗ〠〧〷〚。 cgroup_subsys ߏମʢ=ぢアぷ゜ががʣ percpu_ref refcnt ࢀরじげアのが cgroup_subsys_state parent ֊〣 cgroup_subsys_stateʢҎ߱ cssʣ list_head sibling ࣗ〣 css 〣ࢠ css 〣࿈゙݁とぷɻ〙〳〿ܑఋ〣゙とぷ list_head children ࣗ〣ࢠ cgroup 〣 css 〣࿈゙݁とぷ unsigned int flags ࣗ〣ঢ়ଶʢonline ? ࢀর⿴? ऴྃ「々? 〟〞ʣ work_struct destroy_work css ぇআ『ࡍ〠༷『ぢが゚みひぜؔぇొ『ゞがぜずゔが • ࣮ࡍ〣ぢアぷ゜がが〭〣ࢀরぇ࣋〙 • cgroup 〣֊ߏ〠ؔ『ゐアみぇ࣋〙ʢparent, sibling, childrenʣ • cgroup ߏମ〠〤 self 〝⿶⿸໊લ〣 cgroup_subsys_state ߏମ⿶〔ɻ〈〣 self 〤ぢ アぷ゜がが〭〣ࢀর〟⿶ʢNULLʣঢ়ଶ〜ɺ֊ߏぇ〔〞〘〔〿『ࡍ〠いぁ ʢcgroup_subsys_state ߏମ〣。【〠ぢアぷ゜がが〠ؔ『ॲཧぇ「〟⿶⿶ճ「త〟 いぁํ〜〹〹〈「⿶ʂʣ 17/37 -
css_set ߏମ • cgroup v1 〜〤ෳ〣 cgroupfs ぇろげアぷ〜 ɻ֤び゙がʢろげアぷʣ〠ಛఆ〣ぢア ぷ゜ががぇ〧〷〚々〾ぁ •
⿴のとぜ〠ؔ『゙ぬがとফඅ〣ঢ়ଶぇݟ〔⿶߹ɺෳび゙が〠ࢄ「〛⿶ cgroup_subsys_state ߏମぇ〳〝〶〔ߏମ⿴〝ศར ˠɹ〈〣త〣ߏମ css_set ߏମ • ಉҰ〣のとぜ〠ؔ࿈『 cgroup_subsys_state ߏମ〣ʢಉҰ〣 cgroup 〠〧〷〚。 ぢアぷ゜ががใ〣ʣ〉〝〠 css_set ߏମ࡞〾ぁ • のとぜ〾〤〈〣 css_set ぇࢀর『ɻෳび゙が〠〳〔〘〔ぢアぷ゜がが〣ใぇ ࢀর『〣؆୯ 18/37 -
css_set ߏମ〣ੜ のとぜҠಈ『〝のとぜࢀর『 css_set ߏମมい • のとぜ cgroup ؒʢroot ˠ
root Ҏ֎〣 cgroupɺroot Ҏ֎〣 cgroup ಉ࢜ʣぇҠಈ『 ࡍ〠〤ɺのとぜࢀর『 cgroup_subsys_state ߏମ〣มԽ『 ˠ৽〔〟 css_set ߏମඞཁ のとぜ〣〕々 css_set ߏମඞཁʁ てとふわ্〠େྔ〣 css_set ߏମੜ《ぁʁ • ಉ」 cgroup_subsys_state ߏମ〣ぇࢀর『のとぜ『〜〠⿴〷「ぁ〟⿶ ˠ৽〔〠 css_set ぇ࡞ඞཁ〟⿶ʢಉ」ぇࢀর「〛߹〤⿶ճ「ʣ • ⿶ճ【 css_set ߏମてとふわ্〠ଘࡏ『ぇݕࡧ『〔〶〠ɺてとふわ্〠ଘ ࡏ『『〮〛〣 css_set ߏମ〤まひてゔふがゅ゚〠゙アぜ《ぁ〛⿶ 20/37 -
࣮ࡍ〣てとふわ্〣 css_set ߏମ び゙が〉〝〠のとぜॴଐ『 cgroup ぇҙ〠બ〮ˠてとふわ্〠 css_set ߏମେྔ 〠ੜ《ぁՄೳੑ 〔〕ɺ࣮ࡍ〣てとふわ〜〤ɺ
• ෳび゙がଘࡏ「〛〷ɺ『〮〛〣び゙がಉ」び゙がߏぇ「〛⿶ • ぢアふべろぼがでをが〤ぢアふべ༻〣 cgroup ֊ߏぇશび゙が〜ಉ」〽⿸〠࡞『 ʢsystemd 〷ʣ • ろ゚ばと゛ひへ〣のとぜɺಉ」ゆ゜そわ〣ࢠゆ゜なと〤〰〝え〞〣߹ಉ」 cgroup ʢ〣ʣ〠ॴଐ『 • ぢアふべろぼがでをがぢアふべ〣શゆ゜なとぇಉ」 cgroupʢ〣ʣ〠ॴଐ《【 ͭ·Γ͋ΔఔͷλεΫͷ͔ͨ·Γʢʣ͕ಉ͡ css_set ߏମΛࢀর͍ͯ͠Δ͜ͱ͕΄ͱΜͲ ˠてとふわ css_set ߏମ〜⿴〪ぁ〽⿸〟〈〝〤〳⿴〟⿶ 22/37 -
task_struct ߏମ〝 cgroup Linux ্〜のとぜぇද『 task_struct ߏମ〠〤 cgroup ؔ〣ゐアみ⿶。〙ଘࡏ『ɻ 〒〣⿸〖
cgroup 〝のとぜ〣ؔੑぇࣔ『〣〠ॏཁ〟〣ɿ struct task_struct { :ʢུʣ #ifdef CONFIG_CGROUPS /* Control Group info protected by css_set_lock: */ struct css_set __rcu *cgroups; /* cg_list protected by css_set_lock and tsk->alloc_lock: */ struct list_head cg_list; #endif :ʢུʣ } • css_set ߏମぇද『ม໊ cgroupsʢ࣮࣭ɺ゙ぬがとؔ࿈〣ใ〤 css_set ߏମ〣 ઌ〠⿴〣〜のとぜ〾ݟ〔 cgroup 〤 css_set 〕〝⿶⿸〈〝ʣ • cg_list 〝⿶⿸゙とぷぇ࣋〘〛⿶ʢޙड़ʣ 23/37 -
のとぜ〝 css_set 〣ؔ • task_struct ߏମ〾 css_set ߏମ〭〣ࢀর⿴ • ಉ」
css_set ߏମぇࢀর「〛⿶ task_struct ߏମぇ〙〟〃゙アぜଘࡏ『 ʢcg_listʣ 24/37 -
cgroup 〝 css_set 〣゙アぜ • css_set 〤ɺෳଘࡏ『 cgroup び゙が〜〒ぁ〓ぁ〣び゙が〣 cgroup
〧〝〙』〙 〝ؔ࿈〚⿶〛⿶ɻ〙〳〿ෳ〣 cgroup 〝ؔ࿈〚⿶〛⿶ • cgroup 〠〤ෳ〣のとぜॴଐ『ɻのとぜ〤〒ぁ〓ぁ css_set 〝ؔ࿈〚⿶〛⿶〣〜ɺ cgroup 〠ؔ࿈『 css_set 〤ෳଘࡏ『 〙〳〿ෳ〣 css_set 〝ෳ〣 cgroup ゙アぜ「⿴〘〛⿶〽⿸〟ߏ〜ɺ୯Ұ〣゙アぜ〜 〤ؔੑ〤ද【〟⿶ • css_set ߏମ〝 cgroup ߏମ〣ཱ〖ぇ『〣 cgrp_cset_link ߏମ 25/37 -
cgrp_cset_link ߏମ Table 4: cgrp_cset_link ߏମ ܕ ม໊ આ໌ cgroup
cgrp ࣗ〝〧〷〚⿶〛⿶ cgroup ߏମ css_set cset ࣗ〝〧〷〚⿶〛⿶ css_set ߏମ list_head cset_link cgroup->cset_links ぇ〙〟〆゙アぜ list_head cgrp_link css_set->cgrp_links ぇ〙〟〆゙アぜ 26/37 -
cgrp_cset_link ߏମ cgrp_cset_link ߏମ〤ɺ • のとぜ〝 cgroup ぇޮత〠゙アぜ • ⿴のとぜ〠ର『
cgroup ぇ『〮〛ݟ〙々ɺ〷「。〤⿴ cgroup 〠ର『『〮〛〣 のとぜぇݟ〙々〣〠ඇৗ〠ྑ⿶ߏ 「「 • ⿴のとぜ〠ର『ぢアぷ゜ががؔ『 cgroup ぇݟ〙々ʜ〠〤⿶〛⿶〟⿶ 〈〣〔〶〠 • css_set ߏମ〤 cgroup_subsys_state ߏମ〣ྻぇ࣋〙 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT]; 28/37 -
のとぜ〣 cgroup ؒҠಈ のとぜ〣Ҡಈॲཧ〤େ 。 4 ஈ֊〠ぁ〛⿶: 1. Ҡಈݩ४උॲཧ 2. Ҡಈઌ४උॲཧ
3. Ҡಈॲཧ 4. Ҡಈྃॲཧ ४උॲཧ〜࣮ࡍ〠ࣦഊ『Մೳੑ〣⿴ॲཧぇߦ⿸ɻҠಈ४උ〠ޭ「〔߹〠ɺ࣮ࡍ〣Ҡಈॲ ཧぇߦ⿸ɻ 31/37 -
のとぜҠಈॲཧ༻ߏମ ෳࡶ〠゙アぜ「〔ߏମ〣ใ〹゙アぜぇมߋ『〔〶〠ɺ • cgroup 〠〤Ҡಈઐ༻ͷߏମ४උ《ぁ〛⿶ • css_set ߏମ〠〤Ҡಈ࣌〠༻『ઐ༻〣ゐアみม४උ《ぁ〛⿶ 〳〔ɺҠಈ४උॲཧぇߦ⿸〔〶 •
Ҡಈ४උॲཧ〜⿸ม • Ҡಈॲཧ〜⿸ม 〒ぁ〓ぁ४උ《ぁ〛⿶〔〿『ɻ 32/37 -
cgroup_mgctx ߏମ Table 5: cgroup_mgctx ߏମ ܕ ม໊ આ໌ list_head
preloaded_src_csets Ҡಈ४උ〜औಘ「〔Ҡಈର〝〟Ҡಈݩ css_set ߏମぇ〙〟〃゙とぷ list_head preloaded_dst_csets Ҡಈ४උ〜औಘ「〔Ҡಈର〝〟Ҡಈઌ css_set ߏମぇ〙〟〃゙とぷ cgroup_taskset tset Ҡಈத〣 css_set 〝のとぜぇ『〔〶〣 cgroup_taskset ߏମ u16 ss_mask Ҡಈ〜Өڹ『ぢアぷ゜ががぇࣔ『ろとぜ 4.11 〜Ճ《ぁ〔ߏମɻ〒ぁ〳〜〤 src,dst ߹い【〔 preloaded_csets 〝⿶⿸゙とぷ〝 cgroup_taskset ߏମ⿴〘〔ɻ4.11 〜〒ぁぇ〳〝〶〔ײ」ɻ 33/37 -
cgroup_taskset ߏମ Table 6: cgroup_taskset ߏମʢൈਮʣ ܕ ม໊ આ໌ list_head
src_csets Ҡಈର〣Ҡಈݩ css_set ぇ〙〟〃゙とぷ list_head dst_csets Ҡಈର〣Ҡಈઌ css_set ぇ〙〟〃゙とぷ int nr_tasks ݱࡏ cgroup_taskset 〠ొ《ぁ〛⿶のとぜ int ssid ॲཧத〣ぢアぷ゜がが • Ҡಈ४උஈ֊〜〙〟⿶〕゙とぷ〝〤ผ〠࣮ࡍ〣Ҡಈॲཧ〜〷゙とぷぇ࡞『 34/37 -
css_set ߏମ Table 7: css_set ߏମʢൈਮʣ ܕ ม໊ આ໌ cgroup_subsys_state[]
subsys cgroup_subsys_state ߏମ〣ྻ refcount_t refcount ࣗʢcss_set ߏମʣ〭〣ࢀর cgroup dfl_cgrp 〈〣ߏମ〠〧〷〚。 cgroupʢv2ʣߏମ list_head tasks task_struct ߏମ〣 cg_list ぇ〙〟〆゙とぷ list_head mg_tasks cgroup 〣Ҡಈぇߦ⿸のとぜぇొ『࿈゙݁とぷ list_head cgrp_links ࣗぇࢀর『 cgroup ぇࢦ『 cgrp_cset_links ߏମ〣゙とぷ list_head mg_preload_node cgroup 〣Ҡಈ࣌〠 css_set ߏମぇొ『〔〶〣࿈゙݁とぷ〠〙〟〃 list_head ߏମ list_head mg_node cgroup 〣Ҡಈ࣌〠 css_set ߏମぇొ『〔〶〣࿈゙݁とぷ〠〙〟〃 list_head ߏମ cgroup* mg_src_cgrp のとぜҠಈ࣌〣Ҡಈݩ cgroup 〣 cgroup ߏମ cgroup* mg_dst_cgrp のとぜҠಈ࣌〣Ҡಈઌ cgroup 〣 cgroup ߏମ css_set* mg_dst_cset のとぜҠಈ࣌〣Ҡಈઌ cgroup 〣 css_set ߏମ • mg_〜〤」〳ゐアみม⿶。〙⿴ˠ mg=migration • Ҡಈॲཧ〣్த〜 mg_ 〜〤」〳ม〠ؔ『 css_set 〟〞ぇొ「〟〾ॲཧਐ〵 35/37 -
〳〝〶 cgroup 〣෦ߏ〣ೖ〿ޱ〠গ「〕々౿〴ࠐえ〕ぇ「〳「〔ʢ〙〷〿ʣ ɻ v1 〠〙⿶〛「〳「〔ɺߏମ〤 v1/v2 ڞ௨〟〣〜ߏମಉ࢜〣ؔ〟え〤ڞ௨〜⿺ ぇ「〔〙〷〿〜『ɻ •
cgroup 〣ෳ֊ߏ〠߹〘〔ߏぇऔ〘〛⿶ • css_set ߏମ • のとぜʢtasksetʣˡˠ css_set ߏମˡˠ cgrp_cset_links ߏମˡˠ cgroup ߏମ • ゙アぜぇ〔〞〝ぢとぷߴ⿶ใ〠〙⿶〛〤てゖがぷじひぷ४උ《ぁ〛⿶〔〿『 • ࠓճ〣ぇ 〘々〠 cgroup 〣෦Ԟਂ。〭ೖ〘〛⿶。ํ૿⿺〔〾⿸ぁ「⿶〜『 w 36/37