๐Ÿง Linux

cgroup ๋ฉ”๋ชจ๋ฆฌ

๊ฐœ์š”

cgroup ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Linux ์ปค๋„์—์„œ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •ํ•˜๊ณ  ์ œํ•œํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ, VM, ๋ถ„๋ฆฌ๋œ ์›Œํฌ๋กœ๋“œ ๊ฐ„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ํ• ๋‹นํ•˜์—ฌ, ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์Šคํ…œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

cgroup v2์—์„œ๋Š” ๋‹จ์ผ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ํ†ตํ•ฉ๋˜์–ด memory.min, memory.low, memory.high, memory.max ๊ฐ™์€ ์ œ์–ด ํŒŒ์ผ์„ ํ†ตํ•ด ๋ณดํ˜ธ(protection)์™€ ์ œํ•œ(limit)๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ฌธ์„œ์—์„œ๋Š” cgroup ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์„ค๊ณ„ ์›๋ฆฌ, ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค, ํ†ต๊ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง, ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ์˜ ์šด์˜ ๊ด€์ ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

cgroup ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜

๊ทธ๋ฆผ 1. cgroup ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋ฆฌ์†Œ์Šค ๋ฐฐ๋ถ„ ๋ชจ๋ธ

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ ์„ค๊ณ„

cgroup ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ต์‹ฌ์€ page_counter๋ผ๋Š” ์นด์šดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ฐ cgroup์€ mem_cgroup ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ํ•ด๋‹น cgroup์— ์š”๊ธˆ์ด ๋ถ€๊ณผ๋ฉ๋‹ˆ๋‹ค.

  • charge/uncharge: ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ•ด๋‹น cgroup์— charge๋˜๊ณ , ํ•ด์ œ๋˜๋ฉด uncharge๋ฉ๋‹ˆ๋‹ค.
  • LRU ๊ด€๋ฆฌ: ๊ฐ cgroup์€ ์ž์ฒด LRU ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ• ์‹œ ํ•ด๋‹น cgroup ๋‚ด์—์„œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์ธต์  ํšŒ๊ณ„: ๋ถ€๋ชจ cgroup์˜ ์‚ฌ์šฉ๋Ÿ‰์€ ๋ชจ๋“  ์ž์‹ cgroup์˜ ์‚ฌ์šฉ๋Ÿ‰์ด ํ•ฉ์‚ฐ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์œ  ํŽ˜์ด์ง€: ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ตœ์ดˆ ์ ‘๊ทผํ•œ cgroup์— ๋ถ€๊ณผ๋ฉ๋‹ˆ๋‹ค.

v1๊ณผ v2์˜ ์ฐจ์ด

cgroup v1๊ณผ v2๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ cgroup v1 cgroup v2
๊ณ„์ธต ๊ตฌ์กฐ ๋ณต์ˆ˜ ๊ณ„์ธต ๊ฐ€๋Šฅ ๋‹จ์ผ ํ†ตํ•ฉ ๊ณ„์ธต
์ œ์–ด ํŒŒ์ผ memory.limit_in_bytes memory.max
๋ณดํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์—†์Œ memory.min, memory.low
๋ฉ”๋ชจ๋ฆฌ+์Šค์™‘ memory.memsw.limit_in_bytes memory.swap.max
OOM ์ œ์–ด memory.oom_control memory.oom.group
ํ†ต๊ณ„ memory.stat memory.stat (ํ™•์žฅ)
์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ memory.kmem.limit_in_bytes ๊ธฐ๋ณธ ํฌํ•จ

์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค

cgroup v2 ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์–ด ํŒŒ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • memory.min: ์ ˆ๋Œ€ ๋ณดํ˜ธ๋Ÿ‰. ์ด ๊ฐ’ ์ดํ•˜๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšŒ์ˆ˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • memory.low: ์ตœ์„  ๋…ธ๋ ฅ ๋ณดํ˜ธ๋Ÿ‰. ๋‹ค๋ฅธ cgroup์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค.
  • memory.high: ๋ถ€๋“œ๋Ÿฌ์šด ์ œํ•œ. ์ด ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • memory.max: ํ•˜๋“œ ์ œํ•œ. ์ด ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด OOM์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • memory.swap.high: ์Šค์™‘ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณผ๋„ํ•˜๊ฒŒ ๋Š˜์–ด๋‚  ๋•Œ ์“ฐ๋กœํ‹€์„ ๊ฑฐ๋Š” ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค.
  • memory.swap.max: ์Šค์™‘ ์‚ฌ์šฉ๋Ÿ‰ ํ•˜๋“œ ์ œํ•œ์ž…๋‹ˆ๋‹ค.
  • memory.oom.group: OOM ๋ฐœ์ƒ ์‹œ ๊ทธ๋ฃน ์ „์ฒด๋ฅผ ์ข…๋ฃŒํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์ธต ํ™œ์„ฑํ™”์™€ ์œ„์ž„

cgroup v2์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด๋Š” memory.* ํŒŒ์ผ๋งŒ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์œ„ cgroup์—์„œ cgroup.subtree_control์— +memory๋ฅผ ์ผœ์•ผ ํ•˜์œ„ cgroup์— ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ, ๋ถ€๋ชจ๊ฐ€ ํ—ˆ์šฉํ•œ ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์ž์‹์ด ๋‹ค์‹œ ์ž์›์„ ๋ถ„๋ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ non-root cgroup์€ ๋‚ด๋ถ€์— ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‘” ์ƒํƒœ์—์„œ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž์‹์—๊ฒŒ ๋ฐฐ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” no internal process ์ œ์•ฝ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” system.slice, kubepods.slice, ์ปจํ…Œ์ด๋„ˆ leaf cgroup์ฒ˜๋Ÿผ ๋ฆฌํ”„์— ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ชจ์•„ ๋‘๊ณ , ์ค‘๊ฐ„ ๋…ธ๋“œ๋Š” ๋ฐฐ๋ถ„ ์ „์šฉ ๊ณ„์ธต์œผ๋กœ ๋‘๋Š” ๊ตฌ์„ฑ์ด ํ”ํ•ฉ๋‹ˆ๋‹ค.

ํ†ต๊ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง

memory.stat ํŒŒ์ผ์€ cgroup์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ํ†ต๊ณ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • anon: ์ต๋ช… ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
  • file: ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์บ์‹œ ์‚ฌ์šฉ๋Ÿ‰
  • slab: ์ปค๋„ slab ํ• ๋‹น๋Ÿ‰
  • sock: ์†Œ์ผ“ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
  • pgfault/pgmajfault: ํŽ˜์ด์ง€ ํดํŠธ ํšŸ์ˆ˜
  • workingset_refault: ์ž‘์—… ์„ธํŠธ ์žฌ์ ‘๊ทผ ํšŸ์ˆ˜

์šด์˜ ์‹œ์—๋Š” memory.stat๋งŒ ๋ณด์ง€ ์•Š๊ณ  ๋‹ค์Œ ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋ณด๋Š” ํŽธ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • memory.current / memory.peak: ํ˜„์žฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์ตœ๊ณ  ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • memory.events / memory.events.local: high, max, oom, oom_kill ์นด์šดํ„ฐ๋กœ ์ œํ•œ ์ดˆ๊ณผ๊ฐ€ ์–ด๋А ๋‹จ๊ณ„๊นŒ์ง€ ์ง„ํ–‰๋๋Š”์ง€ ๋ด…๋‹ˆ๋‹ค.
  • memory.pressure: PSI(Pressure Stall Information)๋กœ ํšŒ์ˆ˜ ์••๋ฐ•์ด ์‹ค์ œ ์ง€์—ฐ ์‹œ๊ฐ„์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • memory.swap.events: ์Šค์™‘ high/max ์ดˆ๊ณผ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š”์ง€ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต/๋ถ„์„

๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด ๋ชจ๋ธ ๋น„๊ต

๋ชจ๋ธ ๋™์ž‘ ๋ฐฉ์‹ ์ง€์—ฐ ์‹œ๊ฐ„ ์˜ํ–ฅ ์ ํ•ฉํ•œ ์›Œํฌ๋กœ๋“œ
hard limit (memory.max) ์ดˆ๊ณผ ์‹œ ์ฆ‰์‹œ ํšŒ์ˆ˜ ๋˜๋Š” OOM ๋†’์Œ ์™„์ „ํ•œ ๊ฒฉ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
soft limit (memory.high) ์ดˆ๊ณผ ์‹œ ์ ๊ทน์  ํšŒ์ˆ˜ ์ค‘๊ฐ„ ์ผ๋ฐ˜์ ์ธ ์›Œํฌ๋กœ๋“œ ๊ฒฉ๋ฆฌ
protection (memory.min/low) ๋ณดํ˜ธ ์˜์—ญ ์„ค์ • ์—†์Œ ์ค‘์š” ์„œ๋น„์Šค ๋ณดํ˜ธ
swap limit (memory.swap.max) ์Šค์™‘ ์‚ฌ์šฉ๋Ÿ‰ ์ œํ•œ ์ค‘๊ฐ„ ์Šค์™‘ ์˜์กด๋„ ์ œ์–ด

OOM ๋™์ž‘ ๋น„๊ต

์„ค์ • v1 ๋™์ž‘ v2 ๋™์ž‘
OOM ํ‚ฌ๋Ÿฌ ๊ธฐ๋ณธ ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
๊ทธ๋ฃน ์ข…๋ฃŒ memory.oom_control์—์„œ ๋น„ํ™œ์„ฑํ™” ๋ถˆ๊ฐ€ memory.oom.group=1๋กœ ๊ทธ๋ฃน ์ „์ฒด ์ข…๋ฃŒ
์•Œ๋ฆผ eventfd๋กœ ์•Œ๋ฆผ eventfd๋กœ ์•Œ๋ฆผ
๋ฃจํŠธ cgroup OOM ์•Œ๋ฆผ ์—†์Œ OOM ์•Œ๋ฆผ ์—†์Œ

์šด์˜ ์„ค์ • ๊ด€์  ๋น„๊ต

์šด์˜ ๋ชฉํ‘œ ์šฐ์„  ์„ค์ • ํ•จ๊ป˜ ๋ณผ ์ง€ํ‘œ ์ฃผ์˜ํ•  ์ 
์ค‘์š” ์„œ๋น„์Šค ๋ณดํ˜ธ memory.min, memory.low memory.events:low, memory.pressure ๋ณดํ˜ธ๋Ÿ‰์„ ๊ณผ๋„ํ•˜๊ฒŒ ์žก์œผ๋ฉด ๋‹ค๋ฅธ cgroup์ด ๊ณ„์† ์••๋ฐ•์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณผ์†Œ๋น„ ์™„ํ™” memory.high memory.events:high, PSI memory.high๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์“ฐ๋กœํ‹€๊ณผ ์ง์ ‘ ํšŒ์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
๊ฐ•ํ•œ ๊ฒฉ๋ฆฌ memory.max, memory.oom.group memory.events:max, oom_kill ํ•˜๋“œ ์ œํ•œ์ด ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ์งง์€ ๋ฒ„์ŠคํŠธ์—๋„ OOM์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์Šค์™‘ ์ œ์–ด memory.swap.high, memory.swap.max memory.swap.events, ์ง€์—ฐ ์‹œ๊ฐ„ swap.high๋Š” ์ •์ƒ ์šด์˜ ํ•œ๋„๊ฐ€ ์•„๋‹ˆ๋ผ ๋น„์ •์ƒ ๊ธ‰์ฆ ๊ฒฝ๊ณ„์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ํ๋ฆ„

  1. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ•ด๋‹น cgroup์˜ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. memory.high๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ปค๋„์€ ํ•ด๋‹น cgroup์˜ ํƒœ์Šคํฌ๋ฅผ ์“ฐ๋กœํ‹€ํ•˜๊ณ  ์ง์ ‘ ํšŒ์ˆ˜(direct reclaim)๋ฅผ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
  3. ํšŒ์ˆ˜๋Š” per-cgroup LRU์—์„œ Least Recently Used ํŽ˜์ด์ง€๋ฅผ ์šฐ์„  ์„ ํƒํ•˜๋ฉฐ, ํŒŒ์ผ ์บ์‹œ์™€ ์ต๋ช… ๋ฉ”๋ชจ๋ฆฌ์˜ ๋น„์ค‘์— ๋”ฐ๋ผ reclaim ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  4. ํšŒ์ˆ˜ ๊ณผ์ •์—์„œ memory.events์˜ high์™€ max ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•ด ์šด์˜์ž๊ฐ€ ์••๋ฐ• ์ˆ˜์ค€์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. memory.max๋ฅผ ๋„˜๋Š” ์ƒํƒœ๊ฐ€ ํ•ด์†Œ๋˜์ง€ ์•Š์œผ๋ฉด memcg OOM์ด ๋ฐœ์ƒํ•˜๊ณ , memory.oom.group=1์ด๋ฉด ํ•ด๋‹น ์›Œํฌ๋กœ๋“œ๋ฅผ ๊ทธ๋ฃน ๋‹จ์œ„๋กœ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šด์˜์ž๊ฐ€ ํšŒ์ˆ˜๋ฅผ ์„ ์ œ์ ์œผ๋กœ ์œ ๋„ํ•ด์•ผ ํ•  ๋•Œ๋Š” memory.reclaim์— ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์จ์„œ ํŠน์ • cgroup๋งŒ ๋Œ€์ƒ์œผ๋กœ proactive reclaim์„ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ์ผ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•๊ณผ ๋™์ผํ•œ ์‹ ํ˜ธ๋Š” ์•„๋‹ˆ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์†Œ์ผ“ ๋ฐธ๋Ÿฐ์‹ฑ๊นŒ์ง€ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์œ ๋„๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

cgroup ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ํ๋ฆ„

๊ทธ๋ฆผ 2. memory.high ์ดˆ๊ณผ๋ถ€ํ„ฐ OOM๊นŒ์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ๋™์ž‘ ํ๋ฆ„

์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜

cgroup v2์—์„œ๋Š” ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํšŒ์ˆ˜๋ฉ๋‹ˆ๋‹ค:

  • slab ๋ฉ”๋ชจ๋ฆฌ: SLAB/SLUB ํ• ๋‹น๊ธฐ์—์„œ ํ• ๋‹น๋œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ
  • ์Šคํƒ ํŽ˜์ด์ง€: ํ”„๋กœ์„ธ์Šค๋‹น ์ปค๋„ ์Šคํƒ
  • ์†Œ์ผ“ ๋ฉ”๋ชจ๋ฆฌ: ๋„คํŠธ์›Œํฌ ์†Œ์ผ“ ๋ฒ„ํผ

์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋Š” ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋…๋ฆฝ ์ œํ•œ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šค์™‘ ํ†ตํ•ฉ

memory.swap.max์™€ memory.swap.high๋ฅผ ํ†ตํ•ด ์Šค์™‘ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์Šค์™‘์ด ์ œํ•œ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์Šค์™‘ ์•„์›ƒ์ด ์ค„์–ด๋“ค์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ์Šค์™‘ ์ œํ•œ์€ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ๋™์ž‘์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ+์Šค์™‘ ํ•ฉ๊ณ„ ์ œํ•œ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ๊ณผ ์Šค์™‘ ์ œํ•œ์„ ํ•จ๊ป˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ 

  • ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์™€ VM ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณดํ˜ธ(protection)์™€ ์ œํ•œ(limit)๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•˜์—ฌ ์œ ์—ฐํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ๋ณต์žกํ•œ ๋ฆฌ์†Œ์Šค ๋ฐฐ๋ถ„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OOM ํ‚ฌ๋Ÿฌ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ค‘์š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋…๋ฆฝ ์ œํ•œ์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.
  • ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋Š” ๋ณต์žกํ•˜๋ฉฐ ์ •ํ™•ํ•œ ํšŒ๊ณ„๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž‘์€ cgroup์„ ๋„ˆ๋ฌด ๋งŽ์ด ์ƒ์„ฑํ•˜๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ธฐ์ˆ 

ํ•ต์‹ฌ ์ •๋ฆฌ

cgroup ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๋Š” Linux์—์„œ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ์™€ ์ œํ•œ์„ ์œ„ํ•œ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ์ปจํ…Œ์ด๋„ˆ์™€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. cgroup v2์—์„œ๋Š” ๋‹จ์ผ ๊ณ„์ธต ๊ตฌ์กฐ์™€ memory.min/low/high/max ์ œ์–ด ํŒŒ์ผ์„ ํ†ตํ•ด ๋ณดํ˜ธ์™€ ์ œํ•œ์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜๋Š” per-cgroup LRU๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, OOM ํ‚ฌ๋Ÿฌ๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ high๋ฅผ ํ†ตํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์ œํ•œ๊ณผ min/low๋ฅผ ํ†ตํ•œ ์ค‘์š” ์„œ๋น„์Šค ๋ณดํ˜ธ๋ฅผ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.