[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๊ฐ ํ๋ ๊ฒ๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ ๊ฒ ํ์ผ ์กฐ์ํ๊ณ ํ๋ ๊ฒ์ด๋ค.