[Linux] cgroup

cgroup์€ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋‹ค. control group์˜ ์ถ•์•ฝ์ด๋‹ค.
ํŠน์ • ๊ณ„์ • ๋‹จ์œ„๋กœ CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋””์Šคํฌ i/o ์‚ฌ์šฉ๋Ÿ‰, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์‚ฌ์šฉ๋Ÿ‰, ํ”„๋กœ์„ธ์Šค ์ˆ˜ ๋“ฑ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์˜ ํ•ต์‹ฌ์„ ์ด๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„-์ธํ”„๋ผ์™€ ๊ด€๊ณ„๋œ ์ž‘์—…์„ ํ•œ๋‹ค๋ฉด ๊ฑฐ์˜ ๊ธฐ๋ณธ ์†Œ์–‘์— ๊ฐ€๊นŒ์šด ๋…€์„์ด๊ธฐ๋„ ํ•˜๋‹ค.
Docker/k8s ๋“ฑ์—์„œ ์ง€์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฆฌ์†Œ์Šค ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์€ ์ „๋ถ€ cgroup ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ๊ฐ–๋‹ค ์“ด ๊ฑฐ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์‚ฌ์‹ค ์–˜๋“ค์ด ์ง์ ‘ ๊นŽ์€๊ฑด ๋ณ„๋กœ ์—†๋‹ค. ์žˆ๋Š”๊ฑธ ์ž˜ ์กฐํ•ฉํ–ˆ์„ ๋ฟ์ด๋‹ค.




๋ฒ„์ „ v1, v2

cgroup์€ ํ˜„์žฌ 2๊ฐœ์˜ ๋ฒ„์ „์œผ๋กœ ํŒŒํŽธํ™”๋˜์–ด์žˆ๋‹ค.
๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์ด ์–ด๋–ค cgroup์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

mount | grep cgroup

์ด๋Ÿฌ๋ฉด cgroup v2๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.

v1์ด๋ผ๊ณ  ํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ํ•œ๊ฑด ์•„๋‹ˆ๋‹ค. ๋ณต์žกํ•œ๊ฑฐ ์ข€ ์ •๋ฆฌํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ค€์˜ ์•ˆ์ •ํ™”๋ฅผ ์™„๋ฃŒํ•œ ๊ฒƒ์ด cgroup v2๋‹ค.

์ปค๋„ ๋ฒ„์ „ 4.5๋ถ€ํ„ฐ๋Š” v2๋ฅผ ์ง€์›ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ v1๋„ ์•„์ง ๋ ˆ๊ฑฐ์‹œ์—์„œ ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๊ณ , ํฐ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ์˜คํžˆ๋ ค 2008๋…„๋ถ€ํ„ฐ ์˜ค๋žซ๋™์•ˆ ์จ์™”๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ธก๋ฉด์—์„œ๋Š” ๋” ์•ˆ์ •์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.




cgroup ์‚ฌ์šฉํ•ด๋ณด๊ธฐ - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ œํ•œ (v2)

ํ•œ๋ฒˆ ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์ง์ ‘ ๋Œ๋ ค๋ณด๋ฉด์„œ ํ™•์ธํ•ด๋ณด์ž.

๊ฐ€์žฅ ๋จผ์ € /sys/fs/cgroup์ด๋ผ๋Š” ๊ฒฝ๋กœ์— ์ƒˆ๋กœ์šด cgroup ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

sudo mkdir -p /sys/fs/cgroup/test_demo

์ด๊ฑด ๋งค์šฐ ํŠน์ˆ˜ํ•œ ๊ฒฝ๋กœ๋ผ์„œ, ๋นˆ ํด๋”๋งŒ ๋งŒ๋“ค์–ด๋„


๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ ์ž๋™์œผ๋กœ ๋ญ˜ ์ฑ„์›Œ์ค€๋‹ค.
์ด ๊ฐ๊ฐ์˜ ํŒŒ์ผ์ด cgroup ์ œ์–ด์šฉ ์„ค์ • ํŒŒ์ผ์ด๋‹ค.


์‹ค์ œ๋กœ ๋ณด๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค์ •๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ํ‹ฐ๊ฐ€ ์ž˜ ๋‚˜๊ณ  ํ™•์ธํ•˜๊ธฐ ์‰ฌ์šด "๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ"์„ ๊ฑธ์–ด๋ณด๊ฒ ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด OOM์œผ๋กœ ์ฃฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๋ช…๋ น์€ cgroup์˜ ๋ฉ”๋ชจ๋ฆฌ ์ตœ๋Œ€์น˜๋ฅผ 100MB๋กœ ์„ค์ •ํ•œ๋‹ค.

echo "100M" | sudo tee /sys/fs/cgroup/test_demo/memory.max

๋ฉ”๋ชจ๋ฆฌ ์Šค์™‘ ์„ค์ •๋„ ๊บผ์•ผ ํ•œ๋‹ค. ์•ˆ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ณผํ•ด๋„ ๋ฉ”๋ชจ๋ฆฌ ์Šค์™‘์„ ์‚ฌ์šฉํ•˜๊ณ  OOM์„ ๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ ‡๊ฒŒ max๋กœ ์„ค์ •๋˜์–ด์žˆ์œผ๋ฉด ์Šค์™‘์„ ๋ฌด์ œํ•œ์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ €๊ฑฐ ๋‹ค ์“ธ๋•Œ๊นŒ์ง€ OOM KILL์„ ๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.


echo "0" | sudo tee /sys/fs/cgroup/test_demo/memory.swap.max

์Šค์™‘์„ ๋„๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋„๋ฉด ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ์— ํ•  ๊ฒƒ์€, cgroup์— ํ”„๋กœ์„ธ์Šค๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฉ๋ฒ•์€ ๊ฝค ์‰ฝ๋‹ค.

cat /sys/fs/cgroup/test_demo/cgroup.procs

cgroup.procs๋ผ๋Š” ํŒŒ์ผ์— ํ”„๋กœ์„ธ์Šค์˜ PID๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•ด์„œ PID๋ฅผ ๋ฐ›์•„์˜จ ๋‹ค์Œ์— ๋„ฃ์–ด์ค˜์•ผ๋งŒ ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” cgroup์— ํ• ๋‹นํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

ํŒŒ์ด์ฌ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒœ์ฒœํžˆ ์ ์œ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ์„œ ์‹คํ–‰ํ•ด๋ดค๋‹ค.

# ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 10M์”ฉ ์ฒœ์ฒœํžˆ ๊ณ„์† ๋Š˜๋ ค๊ฐ€๋ฉฐ ์ ์œ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

import time
import os

memory = []

print("Process ID :", os.getpid())

# ์—”ํ„ฐ ๋Œ€๊ธฐ...
input("Press Enter to start allocating memory...")

while True:
    # bytearray๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๊ธฐ
    chunk = bytearray(10 * 1024 * 1024)
    # ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œ (0xFF๋กœ ์ฑ„์šฐ๊ธฐ)
    for i in range(0, len(chunk), 4096):  # ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์“ฐ๊ธฐ
        chunk[i] = 0xFF
    memory.append(chunk)
    time.sleep(3)  # 3์ดˆ ๋Œ€๊ธฐ
    print(f"Allocated memory: {len(memory) * 10} MB")

์‹คํ–‰ํ•˜๋ฉด PID๋ฅผ ์ถœ๋ ฅํ•œ ์ฑ„๋กœ ๋ฉˆ์ถ”๊ฒŒ ํ–ˆ๋‹ค.

์ €๊ฑธ ์ด๋ ‡๊ฒŒ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

echo [PID] | sudo tee /sys/fs/cgroup/test_demo/cgroup.procs

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ƒํƒœ์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๋ฉด

100MB์„ ๋จน์€ ์ƒํƒœ์—์„œ ํ„ฐ์งˆ ๊ฒƒ์ด๋‹ค.
์ด๊ฒŒ cgroup์ด ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Docker๊ฐ€ ํ•˜๋Š” ๊ฒƒ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ํŒŒ์ผ ์กฐ์ž‘ํ•˜๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/6/html/resource_management_guide/ch01