์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊ฐ์๊ธฐ ํ๋ก๊ทธ๋จ์ด ๋๋ ค์ง๊ฑฐ๋ ์ข ๋ฃ๋๋ ๋ต๋ตํ ๊ฒฝํ์ ํ ์ ์์ผ์ ๊ฐ์?
์ด๋ฐ ๋ฌธ์ ๋ค์ ๋๋ถ๋ถ '๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ' ๋๋ฌธ์ ๋๋ค.
ํน์ ์ปดํจํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋์ง ๊ถ๊ธํ๋ ์ ์๋์? ์ฌ์ค ์ฐ๋ฆฌ ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋งค์ฐ ๊ผผ๊ผผํ๊ณ ์๋ฆฌํ๊ฒ ๊ด๋ฆฌํ๊ณ ์๋ต๋๋ค. ํนํ ๋ฆฌ๋ ์ค๋ผ๋ ์ด์์ฒด์ ๋ "๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ค!" ๋ผ๋ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์ด์. ์ค๋์ ์ด ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ณผ์ ์ ์น์ ํ๊ณ ์ฌ๋ฏธ์๊ฒ ํ์ด ๋๋ฆด๊ฒ์~
๋ค, ๋ง์ต๋๋ค! ๋ฆฌ๋
์ค๋ ์์คํ
์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํผ์์ ๊น๋ํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ ๋ง์
์ปค๋(๋ฆฌ๋ ์ค์ ํต์ฌ!)
์ด ํ๋ก์ธ์ค์ ์์ ์ด ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ๊น์ง ๋ชจ๋ ๊ด๋ฆฌํ๋ค๋ ๋ป์ด์์.
์ปค๋์ ๋ง์น ์๋ง์ฒ๋ผ ์ง์์ ๋ชจ๋ ๋ฐฉ์ ๊ผผ๊ผผํ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋๋ฐ์. ํ๋ก์ธ์ค๋ค์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ ๋๋ง๋ค ์ด๋ฅผ ์ ์ ํ ํ ๋นํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ธ์ค๋ค์ ํ์ํ ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ป์ ์ ์๊ณ , ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋น ๋ฅด๊ฒ ๋ฐํ๋ฉ
๋๋ค. ๊นจ๋ํ ๋ฐฉ์ ์ ์งํ๋ ค๋ฉด ์๋ง๊ฐ ์ง์ ์ฒญ์ํด์ผ ํ๋ฏ์ด, ๋ฆฌ๋
์ค๋ ์ปค๋์ด ๋์์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ๋ฅผ ํ๋ ๊ฑฐ์ฃ ~
์๋ฅผ ๋ค์ด, ์ง์ ์ฌ๋ฌ ๊ฐ์ ๋ฐฉ์ด ์๋ค๋ฉด ์ปค๋์ ๊ฐ๊ฐ์ ๋ฐฉ์ ๋๊ฐ ๋ค์ด๊ฐ ์๊ณ , ์ด๋๊ฐ ๋น์ด ์๋์ง ํญ์ ์ฒดํฌํ๋ ๋๋ํ ์ง์ฃผ์ธ์ด์์.
$ free
์ด ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๊ฐํธํ๊ฒ ํ์ธํ ์ ์๋ต๋๋ค.
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ(total), ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ(used), ๋จ์ ์๋ ๋ฉ๋ชจ๋ฆฌ(free), ์บ์๋ก ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ(buff/cache), ์ค์ ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ(available)๊น์ง ๋ณด์ฌ์ค๋๋ค. (์น์ ํ์ฃ ?)
buffer
: ๋์คํฌ ๋ธ๋ก์ ์์๋ก ์ ์ฅํด๋๋ ๊ณต๊ฐ cache
: ํ์ผ ๋ด์ฉ์ ์ ์ฅํด๋๋ ๊ณต๊ฐ โ ์์ฝ
ํญ๋ชฉ | ์๋ฏธ ์์ฝ |
---|---|
total | ์์คํ ์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ ์ด๋ |
free | ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ (์์) |
available | ์ค์ ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ. free ํ๋๊ฐ๊ณผ ๋น์ด ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ด ๋ค์์ ๋ ํด์ ๊ฐ๋ฅํ ์ปค๋ ๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ ์์ญ(์๋ฅผ ๋ค์ด ํ์ด์ง ์บ์) ํฌ๊ธฐ๋ฅผ ๋ํ ๊ฐ (ํฐ ๊ฐ) |
buff/cache | ์ปค๋์ด ์บ์๋ก ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ด์, ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ ์ํด ์ ์ฅํ ์์ ๊ณต๊ฐ |
used | ํ๋ก์ธ์ค + ์ปค๋์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ |
์ด ๊ทธ๋ฆผ์ ์ดํดํ๋ฉด free
๋ช
๋ น์ด ๊ฒฐ๊ณผ๋ฅผ ํด์ํ ๋ ์ซ์์ ๋๋ฌด ์ฝ๋งค์ด์ง ์๊ณ , ์ปค๋์ด ์ผ๋ง๋ ์ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋์ง ๊ฐ์ ์ก์ ์ ์์ต๋๋ค!
๊ฐ๋จํ๊ฒ ์ด์ผ๊ธฐํ๋ฉด used
๋ ํ๋ก์ธ์ค๊ฐ ์ฐ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ปค๋ ์์ ์ด ์ฐ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจํ ๊ฐ์ด์์.
'used' ๋ฉ๋ชจ๋ฆฌ๋ ์ค์ ๋ก ํ๋ก์ธ์ค๊ฐ ์ ์ ํ๊ณ ์๋ ๊ณต๊ฐ๊ณผ, ์ปค๋์ด ์ค์ค๋ก ์ฌ์ฉํ๋ ๊ณต๊ฐ์ ๋ชจ๋ ํฌํจํ ๊ฐ์ด๋ผ๋ ๊ฑฐ์ฃ . ํ๋ก๊ทธ๋จ์ด ์๋ํ ๋๋ง๋ค ์ ์ ์ฌ๋ผ๊ฐ๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ฉด ๋ค์ ๋ด๋ ค๊ฐ๋๋ค. ๋ง์น ๋์๊ด์์ ์ฑ ์ ๋น๋ ธ๋ค๊ฐ ๋ฐ๋ฉํ๋ฉด ๋น์๋ฆฌ๊ฐ ๋ค์ ์๊ธฐ๋ ๊ฒ๊ณผ ๊ฐ์ ์๋ฆฌ์ฃ .
๋ง์ฝ ์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด, ์ปค๋์ด ์์์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊นจ๋ํ๊ฒ ๋น์์ฃผ๋ ๊ฑฐ์ฃ .
์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐ๋ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ค ์ข ๋ฃํ๋ฉด, used ๊ฐ์ด ๋ค์ ์๋๋๋ก ๋์๊ฐ๋ ๊ฑธ ๋์ผ๋ก ํ์ธํ ์ ์์ด์. (์ ๊ธฐํ์ฃ ?)
#!/usr/bin/python3
import subprocess
# ์ฌ์ฉํ ๋ฆฌ์คํธ ํฌ๊ธฐ ์ค์ (๋ฐ์ดํฐ ์: 1์ฒ๋ง ๊ฐ)
# ๋๋ฌด ํฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์คํ ์คํจํ ์ ์์
size = 10000000
# ํ์ฌ ์์คํ
๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ์ถ๋ ฅ (์คํ ์ ์ํ)
print("๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ ์ ์ ์ฒด ์์คํ
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค.")
subprocess.run(["free"])
# ๋ฆฌ์คํธ์ 0์ 1์ฒ๋ง ๊ฐ ์์ฑ (๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ ๋ก ํ ๋นํจ)
array = [0] * size
# ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํ์ ์์คํ
์ํ ์ถ๋ ฅ
print("๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํ์ ์ ์ฒด ์์คํ
๋ฉ๋ชจ๋ฆฌ ๋จ์ ์ฉ๋์ ํ์ํฉ๋๋ค.")
subprocess.run(["free"])
free
์ถ๋ ฅarray = [0] * 10000000
)free
์ถ๋ ฅfree
์ฌ์คํMem: 16257384 513144 15338352 3572 405888 15474572
๐ ์ํ:
โ ์ ์ฒด ์์คํ
๋ฉ๋ชจ๋ฆฌ ์ค ๋๋ถ๋ถ์ด ์์ง ์ฌ์ฉ๋์ง ์์ (์ ์์ ์ธ idle ์ํ)
Mem: 16257384 593596 15257900 3572 405888 15394120
593596 - 513144 = 80452 KiB โ 78.5MiB
๐ ํด์:
โ Python ๋ฆฌ์คํธ ์์ฑ์ผ๋ก ์ฝ 80MiB ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋จ
โ available
๊ฐ๋ ํจ๊ป ๊ฐ์ํจ
Mem: 16257384 523968 15546368 3576 187048 15474436
๐ ํด์:
used
์์น๊ฐ ๋ค์ ์ค๊ณ , available
๋ ํ๋ณต๊ตฌ๋ถ | used (KiB) | available (KiB) | ์ค๋ช |
---|---|---|---|
์คํ ์ | 513,144 | 15,474,572 | ๋๋ถ๋ถ ์ฌ์ ์ํ |
array ์์ฑ ํ | 593,596 | 15,394,120 | ์ฝ 80MiB ์ฌ์ฉ ์ฆ๊ฐ |
์ข ๋ฃ ํ | 523,968 | 15,474,436 | ์ฌ์ฉ๋ ๊ฑฐ์ ๋ณต๊ท๋จ |
memuse.py
์คํ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์ ์ด used
์์น์ ์ฆ๊ฐ๋ก ๋ณด์๊ณ , free()
ํ์ง ์์๋ ๋๋ ์ด์ ์์.free
๋ top
, sar
๋ช
๋ น์ด์ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ ๋ณํ ํจํด์ ํ์
ํด๋ณด๋ ๊ฒ๋ ์ข์์."ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ฉด ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ ์ด์์ฒด์ (๋ฆฌ๋ ์ค ์ปค๋)์ ์ํด ํ์๋๋ค"
๋ ์ฌ์ค์ ์ฆ๋ช ํ๋ ๊ทผ๊ฑฐ์ ๋๋ค.
buff/cache๋ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋์ ๋ค์ ๋ฒ ์ ๊ทผํ ๋ ์๋๋ฅผ ๋์ด๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ
์
๋๋ค. ๋น๋ฒํ ์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ํ๋๋์คํฌ์์ ์ฝ์ผ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋๊น, ์์ฃผ ์ฐ๋ ์ฑ
์ ์ฑ
์ ์์ ์ฌ๋ ค๋๋ ๊ฒ๊ณผ ๊ฐ์์.
#!/bin/bash
# 1. ํ์ผ ์์ฑ ์ ์์คํ
๋ฉ๋ชจ๋ฆฌ ์ํ ์ถ๋ ฅ
echo "ํ์ผ ์์ฑ ์ ์ ์์คํ
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค."
free
# 2. 1GiB ํฌ๊ธฐ์ ํ์ผ์ ์์ฑํ์ฌ ํ์ด์ง ์บ์ ์ฌ์ฉ ์ ๋
echo "1GB ํ์ผ์ ์๋ก ์์ฑํฉ๋๋ค. ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ์ 1GB ํ์ด์ง ์บ์ ์์ญ์ ์ฌ์ฉํฉ๋๋ค."
dd if=/dev/zero of=testfile bs=1M count=1024
# 3. ํ์ผ ์์ฑ ํ ๋ฉ๋ชจ๋ฆฌ ์ํ ์ถ๋ ฅ โ ํ์ด์ง ์บ์ ์ฆ๊ฐ ํ์ธ
echo "ํ์ด์ง ์บ์ ์ฌ์ฉ ํ์ ์์คํ
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค."
free
# 4. ํ์ผ ์ญ์ โ ํ์ด์ง ์บ์ ์ ๊ฑฐ
echo "ํ์ผ ์ญ์ ํ, ์ฆ ํ์ด์ง ์บ์ ์ญ์ ํ์ ์์คํ
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค."
rm testfile
# 5. ํ์ผ ์ญ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ํ ์ถ๋ ฅ โ buff/cache ๊ฐ์ ํ์ธ
free
๋จ๊ณ | used (KiB) | buff/cache (KiB) | free (KiB) | available (KiB) |
---|---|---|---|---|
ํ์ผ ์์ฑ ์ | 523004 | 192476 | 15541864 | 15472644 |
ํ์ผ ์์ฑ ํ | 522072 | 1269160 | 14466152 | 15451568 |
ํ์ผ ์ญ์ ํ | 521748 | 194128 | 15541508 | 15473096 |
ํ์ผ ์์ฑ ์ (baseline)
buff/cache
: ์ฝ 192MiBํ์ผ ์์ฑ ํ
buff/cache
: ์ฝ 1.2GiB๋ก ๊ธ์ฆdd
๋ช
๋ น์ผ๋ก 1GiB ํ์ผ์ ์์ฑํ๋ฉด์, ์ปค๋์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ์บ์๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์
๋๋ค.ํ์ผ ์ญ์ ํ
buff/cache
: ๋ค์ ์ฝ 194MiB๋ก ๊ฐ์ buff/cache (KiB)
1.4M |
|
1.2M | โ ํ์ผ ์์ฑ ํ
|
200K | โ ํ์ผ ์์ฑ ์ โ ํ์ผ ์ญ์ ํ
|
+----------------------------โ ์๊ฐ ํ๋ฆ
์์ฑ ์ ์์ฑ ํ ์ญ์ ํ
dd
๋ช
๋ น์ผ๋ก ์์ฑํ 1GiB ํ์ผ์ ๋ด์ฉ์ ๋์คํฌ์๋ง ์ ์ฅ๋์ง ์๊ณ , ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ํ์ด์ง ์บ์์ ์ฌ๋ผ๊ฐ๋๋ค.rm
๋ช
๋ น์ด๋ก ์ญ์ ํ๋ฉด ์ปค๋์ ์ด ๋ฐ์ดํฐ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์์ ์ธ์งํ๊ณ ํ์ด์ง ์บ์๋ฅผ ํด์ ํฉ๋๋ค.๊ฐ๋ | ์ค๋ช |
---|---|
ํ์ด์ง ์บ์ | ๋์คํฌ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์ ์ฅํ๋ ์์ญ |
buff/cache | ํ์ด์ง ์บ์ + ๋ฒํผ ์บ์ ์์ญ์ ๋ํ๋ |
์๋ ํด์ | ์์คํ ์ด ํ์ํ๋ฉด ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๋ฐํ (์ปค๋์ด ๋๋ํจ!) |
free
๋ช ๋ น์ด๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณผ ๋used
๋free
๋ง ๋ณด๊ณ โ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋คโ๊ณ ์คํดํ์ง ๋ง์ธ์!
์ง์ง ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋available
์ด๊ณ ,buff/cache
๋ ํ์ ์ ์ปค๋์ด ๋ฐ๋ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค.
free
์ available
์ ๋ชจ๋ "์ธ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ"์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์์ ํ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
ํญ๋ชฉ | ์๋ฏธ | ์ ํท๊ฐ๋ฆด๊น? | ์ง์ง๋ก ์ธ ์ ์๋? |
---|---|---|---|
free | ์ง๊ธ ์๋ฌด๋ ์ฌ์ฉํ๊ณ ์์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ | ์ซ์๊ฐ ์์ผ๋ฉด โ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑํ์์?!โ๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฌ์ | ์ธ ์ ์์ง๋ง, ์์คํ ์ ์ผ๋ถ๋ฅผ ์บ์๋ก ํ์ฉ ์ค |
available | ํ์ํ ๊ฒฝ์ฐ ์ปค๋์ด ์ฆ์ ํ์ํด์ ์ฌ์ฉํ ์ ์๋ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ | ์บ์ ํฌํจ์ด๋ผ free ๋ณด๋ค ํจ์ฌ ํผ | ์ง์ง๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ! ๊ฐ์ฅ ์ ๋ขฐํด์ผ ํ ๊ฐ |
$ free
total used free shared buff/cache available
Mem: 16257384 523004 15541864 3576 192476 15472644
free
: 15,541,864 KiB โ ์ง์ง๋ก ์๋ฌด๋ ์ ์ฐ๋ ๊ณต๊ฐ available
: 15,472,644 KiB โ ์บ์๊น์ง ํฌํจํ ์ค์ ๋ก ์ธ ์ ์๋ ๊ณต๊ฐ๊ทธ๋ฐ๋ฐ ์
available
์ดfree
๋ณด๋ค ๋ ์์ ์๋ ์๊ณ , ๋ ํด ์๋ ์๋๋ฉดโฆ
๐ ์ available
์ด free
๋ณด๋ค ํด ์๋ ์์๊น?
๋ฐ๋ก buff/cache
์์ญ์ด ํฌํจ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฆฌ๋
์ค๋ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๊ฐ๋ฅํ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์บ์(์์ ์ ์ฅ)๋ก ์ฌ์ฉํฉ๋๋ค.
ํ์ง๋ง ์ด ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ปค๋์ด ํ์ํ๋ฉด ์ธ์ ๋ ํ์ํด์ ๋ค๋ฅธ ๋ฐ ์ธ ์ ์์ด์.
๊ทธ๋์ available
์๋ ๋ค์์ด ํฌํจ๋ผ์:
free
: ์๋ฌด๋ ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌbuff/cache
: ์บ์๋ก ์ฐ์ด์ง๋ง ๊ณง ํ์ ๊ฐ๋ฅ๐ ์ฆ, available = free + reclaim ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ
์์๋ก ๋ณด๋ฉด ๋ ๋ช ํํด์
total used free shared buff/cache available
Mem: 16257384 523004 15541864 3572 192476 15472644
free
: 15,541,864 KiB (15GB) โ ์ง๊ธ ์ ์ฐ๊ณ ์๋ ๊ณต๊ฐavailable
: 15,472,644 KiB โ ์ง๊ธ ์ธ ์ ์๋ ์ ์ฒด ๊ณต๊ฐ๐ง ๊ทธ๋ฐ๋ฐ ์
available
์ดfree
๋ณด๋ค ์์ ๋๋ ์์๊น?
๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์์:
buff/cache
์์ญ๋ ๋ง์ด ์ฌ์ฉ ์ค์ธ๋ฐ ๋น์ฅ ํ์ํ ์ ์๋ ์ํavailable
์ free
๋ณด๋ค ์์ ์๋ ์์ด์.์ํฉ | available vs free | ์ด์ |
---|---|---|
์ผ๋ฐ์ ์ธ ์ํฉ | available > free | ์บ์ ๋ฉ๋ชจ๋ฆฌ ํฌํจ |
๋ฉ๋ชจ๋ฆฌ ๋นก๋นกํ ์ํฉ | available < free | ํ์ ๊ฐ๋ฅํ ์บ์๊ฐ ๊ฑฐ์ ์์ |
ํ์ผ ์บ์, ๋ฒํผ ๋ง์ ๋ | available > free | ํ์ ์ ํ์ ๊ฐ๋ฅํ๋ฏ๋ก ๋ ํผ |
๐ฌ ํ ์ค ์์ฝ
free
๋ ์ง๊ธ ์์ ํ ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ,
available
์ ๋น์ฅ ํ์ํด์ ์ธ ์ ์๋ "์ ์ฌ์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ"์์.
๊ตฌ๋ถ | free | available |
---|---|---|
์๋ฏธ | ์๋ฌด๋ ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ | ์ง๊ธ ๋น์ฅ์ ์ฐ์ด๊ณ ์์ง๋ง, ์์คํ ์ด ํ์ํ๋ฉด ํ์ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ํฌํจ |
ํฌํจ ๋ด์ฉ | ์ง์ง๋ก ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ง | free + ์ผ๋ถ ์บ์ + ๋ฒํผ ์บ์ |
์์คํ ์ ๋ขฐ๋ | ๋ฎ์ (ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์) | ๋์ (ํ์ค ๋ฐ์๋ ๊ฐ) |
๋ณด๊ธฐ ์ข์ ํญ๋ชฉ | โ | โ ์ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ผ๋ก ํ๋จํด์ผ ํ ์งํ |
free
: ์ฑ
์์ ์๋ฌด๊ฒ๋ ์ ์ฌ๋ ค๋ ๊ณต๊ฐavailable
: ์ฑ
์ ์์ ์ฑ
์ด ์์ง๋ง, ๋น์ฅ ์ฐ์ง ์์ผ๋ฉด ์์ผ๋ก ๋ฐ์ด๋ฒ๋ฆด ์ ์๋ ๊ณต๊ฐ๊น์ง ํฌํจ์ฆ, ๋น์ฅ ๋น์ด ์๋๊ฐ? vs. ํ์ํ๋ฉด ๋น์ธ ์ ์๋๊ฐ?์ ์ฐจ์ด์์.
free
๋ ํ์ฌ ์ฌ์ฉ๋์ง ์๋ ๊ณต๊ฐavailable
์ ์ฌ์ฉ ์ค์ด์ง๋ง, ์ธ์ ๋ ํ์ ๊ฐ๋ฅํ ๊ณต๊ฐ๊น์ง ํฌํจavailable
์ ๊ธฐ์ค์ผ๋ก ํ๋จํด์ผ ํฉ๋๋ค!sar -r ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ฒ์งธ ์ธ์๋ก ์ง์ ํ ๊ฐ๊ฒฉ(์์ ๋ 1์ด)์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ํต๊ณ ์
๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์๋๋ค๊ฐ๋ ์์คํ ์ด ๋๋ฌด ๋ฐ์๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ๊ฒ ์ฐ๋ฉด ๊ฐ์๊ธฐ ๋ถ์กฑํด์ง ์ ์์ด์. ์ด๊ฑธ 'Out Of Memory'(OOM) ์ํ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด๋ฐ ์ํฉ์์๋ ๋ฆฌ๋ ์ค๊ฐ ๊ณผ๊ฐํ๊ฒ ํ๋์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃ์์ผ์! ๋ค, ์กฐ๊ธ ๋ฌด์ญ์ง๋ง... ์์กด์ ์ํ ์ด์ฉ ์ ์๋ ์ ํ์ด์ฃ . ์ด๊ฑธ OOM Killer๋ผ๊ณ ๋ถ๋ฌ์.
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ๋๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ์๊ธฐ ์ฌ๋ผ์ก๋ค๋ฉด, OOM Killer ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
available
๊ณผ free
๋ฆฌ๋
์ค์์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๋ํ๋ผ ๋๋ free
, used
, available
, buff/cache
๋ฑ์ ๊ฐ์ด ๋์ค์ฃ .
buff/cache
์์ญ๋ ํฌํจ๋จfree
๋ณด๋ค ํญ์ ํฌ๊ฑฐ๋ ์์ ์ ์์!์ผ๋ฐ์ ์ผ๋ก๋ buff/cache
์์ญ์ ์ค์ด๊ฑฐ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ด์.
์์คํ
๋ถํ๊ฐ ๋์์ง๋ฉด free ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ด๋ญ๋๋ค.
์ด๋ด๋, ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ
์ ์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํด์ ํด free ๊ฐ
์ ๋๋ฆฝ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์๋ ๋์คํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์์ง ๋ณ๊ฒฝ๋์ง ์์ ํ์ด์ง
์บ์๊ฐ ์์ต๋๋ค. ์ด๋ฐ ํ์ด์ง ์บ์๋ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์กด์ฌํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด
๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ง์ฝ ํ์ํ ์ ์๋ ์ฌํ์ฉ ๋ฉ๋ชจ๋ฆฌ(
available
)๋ ๋ชจ๋ ์จ๋ฒ๋ฆฌ๊ณ
๋๋ ์ค์ผ ์ ์๋๋ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ด ์จ๋ค๋ฉด?
์์คํ
์ ์ด์ ์ ํ์ ํด์ผ ํด์. ์ด๋ ๋์ํ๋ ๋ฌด์์ด ์น๊ตฌ๊ฐ ๋ฑ์ฅํฉ๋๋ค:
๋ง์น ์ด๊ณผ ํ์นํ ๋นํ๊ธฐ์์ ์น๊ฐ ๋ช ๋ช
์ ์ด์ฉ ์ ์์ด ๋ด๋ ค์ผ ํ๋ ์ํฉ๊ณผ ๊ฐ์ฃ .
OOM์ Out Of Memory์ ์ค์๋ง์ด๊ณ ,
OOM Killer๋ ๋ฆฌ๋
์ค ์ปค๋์ด ๊ฐ์ ๋ก ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃ์์ผ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ค๋ ์๋ ๋ฐฉ์ด ์์คํ
์ด์์.
available
๋ฉ๋ชจ๋ฆฌ์กฐ์ฐจ ๋ถ์กฑํด์ ๋ ์ด์ ์ธ ์ ์์์ํ | ์ค๋ช |
---|---|
total | ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ |
free | ์ง๊ธ ๋น์ฅ ์๋ฌด๋ ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ |
buff/cache | ํ์ด์ง ์บ์๋ ๋ฒํผ ์บ์๋ก ์ฐ์ด๋ ๋ฉ๋ชจ๋ฆฌ |
used | total - free - buff/cache |
available | ์ค์ ๋ก ํ์ํ๋ฉด ํ์ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ (buff/cache ํฌํจ) |
โ ๊ทธ๋ฐ๋ฐ used ์์ญ์ด ๋๋ฌด ์ปค์ ๋ ์ด์ available๋ ํ๋ณด ๋ชป ํ๋ฉด OOM ๋ฐ์!
$ dmesg | grep -i oom
[XXX] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),...
$ ps aux
โ ์ด ์ค RSS
ํ๋๋ฅผ ๋ณด๋ฉด ๊ฐ ํ๋ก์ธ์ค์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ ์ ์์ด์.
RSS
๊ฐ ๊ณ์ ์ฆ๊ฐํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์์ผ ๊ฐ๋ฅ์ฑOOM Killer๊ฐ ๋์ํ๋ ์์คํ ์ด๋ผ๋ฉด
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋์ ์คํ ์ค์ธ ํ๋ก์ธ์ค ๊ฐ์๋ฅผ ์ค์ฌ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
๋์ ์ค์ด๊ฑฐ๋ ๋๋ ์ถ๊ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์นํ๋๊ฒ ์ข์ต๋๋ค.
๊ฐ๋ | ์ค๋ช |
---|---|
available | ์ปค๋์ด ์ฌํ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ (free๋ณด๋ค ์ ํํ ์งํ) |
OOM ์ํ | ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ค ์ฌํ์ฉ ๊ฐ๋ฅํ ๋ถ๋ถ๋ ๋ค ์จ๋ฒ๋ฆฐ ์ํฉ |
OOM Killer | ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์, ๋ถํ์ํ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํด์ ์์คํ ์ ์ด๋ฆฌ๋ ๊ธฐ๋ฅ |
ํ์ธ ๋ช ๋ น์ด | dmesg , ps aux , top , free ๋ฑ์ผ๋ก ์ํ ํ์ธ ๊ฐ๋ฅ |
์๋ฐฉ ๋ฐฉ๋ฒ | ์์ํ ํ๋ก์ธ์ค ๊ฐ์, ํ์์ ์ฌ์์ ์๋ํ, ๋ฉ๋ชจ๋ฆฌ ์ฆ์ค ๋ฑ |
โ์ด๋ ๋ ๊ฐ์๊ธฐ ํ๋ก๊ทธ๋จ์ด ํ๊ฒผ๋ค?โ โ
OOM Killer
์ ์ํ์ผ ์ ์์ด์.
dmesg ๋ก๊ทธ ํ์ธ์ ํ์์ ๋๋ค!
๋ฆฌ๋ ์ค ์ปค๋์ด OOM(Out Of Memory) ์ํฉ์์ ์ด๋ค ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ผ์ง ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ ์ฌ์ค ๊ฝค ๋๋ํ๊ณ ๊ณ์ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ๋ฐ๋ก "OOM Score (OOM ์ ์)"๋ผ๋ ๊ธฐ์ค์ด ์์ด์.
์ปค๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํด "๋๊ตด ์ฃฝ์ด๋ ๊ฒ ๊ฐ์ฅ ์ด๋์ผ๊น?"๋ฅผ ๊ณ์ฐํฉ๋๋ค:
oom_score
๊ฐ์ด ๋์ ํ๋ก์ธ์คoom_score
๋ผ๋ ์ ์๋ฅผ ๊ด๋ฆฌํด์./proc/[PID]/oom_score
ํ์ผ๋ก ํ์ธํ ์ ์์ด์.$ cat /proc/1234/oom_score
oom_score_adj
)-1000
์์ +1000
๊น์ง ์ค์ ๊ฐ๋ฅ:-1000
: ์ ๋ ์ฃฝ์ด๋ฉด ์ ๋๋ ํ๋ก์ธ์ค (์: ์์คํ
๋ฐ๋ชฌ, SSH ๋ฑ)0
: ๊ธฐ๋ณธ๊ฐ+1000
: ์์ฃผ ์ฃฝ์ด๊ธฐ ์ฌ์ด ํ๋ก์ธ์ค$ echo -1000 > /proc/1234/oom_score_adj
โ ์ด๊ฑธ๋ก OOM Killer๊ฐ ์ด๋ค ํ๋ก์ธ์ค๋ฅผ ํผํ๊ฑฐ๋ ์ฐ์ ์ ์ผ๋ก ์ข ๋ฃํ๋๋ก ์ ์ฑ ์ ์กฐ์ ํ ์ ์์ด์.
PID | ํ๋ก์ธ์ค | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | oom_score_adj | ์ต์ข ์ข ๋ฃ ๊ฐ๋ฅ์ฑ |
---|---|---|---|---|
100 | SSH ๋ฐ๋ชฌ | ์ ์ | -1000 | ๋งค์ฐ ๋ฎ์ โ |
200 | Python ์๋ฒ | ๋ง์ | 0 | ๋์ ๐ฅ |
300 | DB ๋ฐฑ์ ํด | ์ค๊ฐ | +500 | ๊ฝค ๋์ ๐ฅ |
400 | ํฌ๋กฌ ๋ธ๋ผ์ฐ์ | ๋ง์ | 0 | ์ฌ์ฉ์ ํฌ์ปค์ค๋ฉด ๋ฎ์ |
๊ธฐ์ค ํญ๋ชฉ | ์ค๋ช |
---|---|
oom_score | ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํฉ์์ ๊ฐ ํ๋ก์ธ์ค์ "์ฃฝ์ ํ๋ฅ " ์ ์ |
oom_score_adj | ์ฌ์ฉ์๊ฐ ์ง์ ์กฐ์ ํ ์ ์๋ ๊ฐ์ค์น (์ค์๋ ์ค์ ) |
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | ๋ง์ด ์ฐ๋ ๋์ด ์ฃฝ์ผ๋ฉด ํจ์จ์ ! |
ํ๋ก์ธ์ค UID | ๋ฃจํธ๋ณด๋ค ์ผ๋ฐ ์ฌ์ฉ์ ํ๋ก์ธ์ค๊ฐ ๋ ์ฃฝ๊ธฐ ์ฌ์ |
์ค์ ๋ฐ๋ชฌ ์ฌ๋ถ | SSH, ์์คํ ํ์ ํ๋ก์ธ์ค๋ ๋ณดํธ๋จ |
# ํน์ PID์ oom_score ํ์ธ
cat /proc/1234/oom_score
# oom_score_adj ์กฐ์
echo -1000 > /proc/1234/oom_score_adj
์์ฝ: "๊ฐ์ฅ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ฉด์๋, ๋ ์ค์ํ ํ๋ก์ธ์ค"๊ฐ OOM Killer์ 1์์์ ๋๋ค.
์๋ฒ ์ด์ ์ค์ด๋ผ๋ฉด, ์ค์ํ ํ๋ก์ธ์ค๋oom_score_adj = -1000
์ผ๋ก ๊ผญ ๋ณดํธํด ์ฃผ์ธ์!
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ ๊ณต๊ฐ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์น ๋ชจ๋ ํ๋ก์ธ์ค์ ๋ ๋ฆฝ๋ ๋ฐฉ์ ์ ๊ณตํ๋ ํธํ ๊ณผ ๊ฐ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํต์ฌ ์ค ํ๋๊ฐ ๋ฐ๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ(๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ)๋ฅผ ๊ฐ์์ ์ผ๋ก ๊ด๋ฆฌํด์ ํ๋ก์ธ์ค๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฃจ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ํ ๋นํ๊ณ ๋ฐ๋ฉํ๋ค ๋ณด๋ฉด, ๋น์ด ์๋ ๊ณต๊ฐ์ด ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ํฉ์ด์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ฐ ์ํ์์ ์ฐ์๋ ํฐ ๊ณต๊ฐ์ด ํ์ํ๋ฉด, ์ ์ฒด ๋น ๊ณต๊ฐ์ ์ถฉ๋ถํด๋ ํ ๋น์ ์คํจํ ์ ์์ด์.
"์กฐ๊ฐ์กฐ๊ฐ ๋น ๋ฐฉ์ ๋ง์ง๋ง, ์ปค๋ค๋ ์ง ํ๋๋ฅผ ๋ ์ฐ์๋ ๊ณต๊ฐ์ ์๋ ์ ์ด์ฃ ."
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค๋ฉด, ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ง์ถฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ฐ์ ํ๋ก๊ทธ๋จ์ ๋ ๋ฒ ์คํํ๋ฉด ์ฃผ์๊ฐ ๊ฒน์ณ์ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
"๋ชจ๋ ์๋์๊ฒ 301ํธ๋ง ์ฃผ๋ ํธํ ์ด๋ฉด ๋์์ ๋์ ๋ชป ๋ค์ด๊ฐ์."
ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด ์ค์ ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋๋ค.
์ฆ, ๋ฐ์ดํฐ ์์์ด๋ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด์!
"์๋ฐฉ ๋ฌธ์ด ์ด๋ ค ์๋ค๋ฉด, ๊ทธ ๋ฐฉ ์ง๋ ํจ๋ถ๋ก ๋ง์ง ์ ์๋ค๋ ๊ฑฐ์ฃ ."
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ฆฌ๋ ์๊ฐ๋ณด๋ค ๊ฐ๋จํฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ 4Gb์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋ ํ์ง๋ง CPU๊ฐ ํ๋ฒ์ 4Gb์ ์ฝ๋๋ฅผ ์ฝ์ ์๋ ์์ต๋๋ค. ํ๋ฒ์ ์ฝ์ ์ ์๋ ์ฝ๋, ๋ค์ ๋งํด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ ์ ํ์ ์ด๋ผ๋ ๋ง์ ๋๋ค.
์ด๋ CPU๊ฐ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๋ชจ๋ ์ฝ๋์ ๋ํ ์ฃผ์๊ฐ ํ์ํ์ง ์๊ณ ํ์ฌ ์คํ ์ค์ธ ์ฝ๋์ ๋ํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ง ์๊ณ ์์ผ๋ฉด ๋๋ค๋ ๋ง์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ค๋ฉด ์ด๋ฏธ ์ฝ์๋ ์ฝ๋์ ๋ํ ์ ๋ณด๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์๋ฒ๋ฆฌ๊ณ ๋ค์ ์ฝ์ด์ผ ํ๋ ์ฝ๋ ์ฃผ์์ ๋ํ ์ ๋ณด๋ง ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ ์คํํ๋ฉด ๋๋๊ฒ๋๋ค.
์์ ๊ฐ์ ์๋ฆฌ๋ก ๋์์ ํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. 0 ~ 4Gb์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ๋ก์ธ์ค๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ ์ฃผ์(Vitual address)
์ ์ด๋ฌํ ๊ฐ์ ์ฃผ์ ์ค์์ ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ผ ํ๋ ์ฃผ์์ธ ๋ฌผ๋ฆฌ ์ฃผ์(Physical address)
๊ฐ ํ์ํฉ๋๋ค.
CPU๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด์ ๋จผ์ ๊ฐ์ ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ๊ฐ์ ์ฃผ์๊ฐ ์ค์ ๋ก ์ด๋ค ๋ฌผ๋ฆฌ ์ฃผ์์ ์์นํด ์๋์ง ์์์ผํฉ๋๋ค. : mmu๋ก
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ "๊ฐ์ ์ฃผ์(Virtual Address)"๋ฅผ ์ฌ์ฉํด์, ๋ฌผ๋ฆฌ ์ฃผ์(Physical Address)๋ก ๊ฐ์ ์ ๊ทผํ๊ฒ ๋ง๋๋ ๊ธฐ์ ์ ๋๋ค.
๊ฐ์ ์ฃผ์์ ๋๋น๋๋ ์์คํ
์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์
๋ผ๊ณ ํ๋ฉฐ, ์ด๋ฐ ์ฃผ์๋ฅผ ์ฌ์ฉํด์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฒ์๋ฅผ ์ฃผ์ ๊ณต๊ฐ
์ด๋ผ๊ณ ํฉ๋๋คใ
ํ๋ก์ธ์ค ํ๋๋ ์ต๋ 4GiB์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ํ ๋น๋ฐ์์.
์ค์ ๋ฉ๋ชจ๋ฆฌ(RAM)๋ ์ ํ๋์ด ์์ง๋ง, ๋ชจ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์คํํ๋ ๊ฑด ์๋๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ถ๋ถ๋ง ์ฌ๋ ค์ ์คํํด์.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ๋์จ์ด๊ฐ MMU(Memory Management Unit)์ ๋๋ค.
MMU๋ CPU์์ ์ฝ๋๋ฅผ ์คํํ ์์ ๊ฐ์ ์ฃผ์๋ฅผ ์ค์ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํด์ฃผ๋ ํ๋์จ์ด ์นฉ์ ๋๋ค.
CPU๊ฐ ๊ฐ์ ์ฃผ์๋ก ์์ฒญํ๋ฉด MMU๊ฐ ํ์ด์ง ํ
์ด๋ธ์ ์ฐธ์กฐํด ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํฉ๋๋ค.
CR3 ๋ ์ง์คํฐ: ํ์ฌ ํ๋ก์ธ์ค์ ํ์ด์ง ํ
์ด๋ธ ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ CPU ๋ ์ง์คํฐ์
๋๋ค.
์ ๋ฆฌํ์๋ฉด CPU๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ๊ณ ์ค์ ๋ก ํด๋น ์ฃผ์๋ก ์ ๊ทผํ ์์ MMU๋ผ๋ ํ๋์จ์ด๊ฐ ์ค์ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํด์ CPU์๊ฒ ์ ๋ฌํด ์ค๋๋ค.
์ด๋ ๊ฒ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋๋ณด๋ค ๋ ๋ง์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ธฐ ์ํด์ ํ๋ก์ธ์ค๋ฅผ ์ผ์ ๋ถ๋ถ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ ์คํํ๋๊ฒ๊ณผ ๊ทธ๊ฒ์ ๋์์ฃผ๋ ํ๋์จ์ด์ ๋ํด์ ์๊ฒ๋์์ต๋๋ค.
์ด๋ค ๊ท์น์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๋๋๋๋ ๊ฒ?์ด๋๊ฐ ์๋์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ํ์ด์ง(Page) ๋จ์(๋ณดํต 4KiB)๋ก ๋๋์ด ๊ด๋ฆฌ๋ผ์.
ํ์ด์ง ํ ์ด๋ธ = ๊ฐ์์ ๋ฃธ ๋๋ฒ โ ์ค์ ๋ฐฉ ์์น ์๋ด๋
โก TLB (Translation Lookaside Buffer)
MMU๊ฐ ๋งค๋ฒ ํ์ด์ง ํ ์ด๋ธ์ ์ ๊ทผํ๋ฉด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฐ๋ ์ฃผ์๋ TLB๋ผ๋ ๊ณ ์ ์บ์์ ์ ์ฅํด ์๋๋ฅผ ๋์ ๋๋ค..
"๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ฐ๊ฟ์ฃผ๋ ๋น์!"
๐ ๋น์ : ์ฃผ์ ๋ณํ์ด ํ์ํ ๋ฐฐ๋ฌ์
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด, ์ด์์ฒด์ ๋ ๊ฐ ํ๋ก๊ทธ๋จ(ํ๋ก์ธ์ค)๋ง๋ค ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์ค์.
ํ์ง๋ง ์ปดํจํฐ๋ ์ง์ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ(RAM) ์ฃผ์๋ฅผ ์์์ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ์ฃ ?
๊ทธ๋์ ํ์ํ ๊ฒ ๋ฐ๋กโฆ
๐ฌ "์ฃผ์ ๋ณํํ" ์ญํ ์ ํ๋ ํ์ด์ง ํ ์ด๋ธ (Page Table)์ ๋๋ค!
๐งญ ํ์ด์ง ํ ์ด๋ธ์ ์ญํ ์?
๊ธฐ๋ฅ | ์ค๋ช |
---|---|
์ฃผ์ ๋ณํ | CPU๊ฐ ์ฌ์ฉํ๋ ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํด์ค์. |
์ ๊ทผ ๋ณดํธ | ์ด ์ฃผ์๊ฐ ์ ํจํ์ง? ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ์ง? ์คํ ๊ฐ๋ฅํ์ง? ๋ฑ ์ ๊ทผ ๊ถํ ํ์ธ๋ ํด์ค์. |
๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ฌ๋ถ | ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ง ์ ํ ๋น๋์ผ๋ฉด ํ์ด์ง ํดํธ๋ฅผ ๋ฐ์์์ผ์. |
๐งฉ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋ผ ์์๊น?
์ด์์ฒด์ ๋ ๊ฐ์ ์ฃผ์๋ฅผ "ํ์ด์ง ๋จ์(๋ณดํต 4KiB)"๋ก ๋๋ ์ ๊ด๋ฆฌํ๊ณ ์์ด์.
์: 4KB ๋จ์๋ก ์ชผ๊ฐ์ ๊ฐ์ ์ฃผ์ 0๋ฒ ํ์ด์ง, 1๋ฒ ํ์ด์ง, 2๋ฒ ํ์ด์งโฆ ์์ผ๋ก์.
๐ ํ์ด์ง ํ ์ด๋ธ์ ์ด ๊ฐ๊ฐ์ ๊ฐ์ ํ์ด์ง ๋ฒํธ๊ฐ ์ด๋ ๋ฌผ๋ฆฌ ์ฃผ์์ ์๋์ง๋ฅผ ์ ์ฅํด๋๋ ํ์์.
๊ฐ์ ํ์ด์ง ๋ฒํธ โ ๋ฌผ๋ฆฌ ํ์ด์ง ๋ฒํธ
0 โ 3
1 โ 7
2 โ ์์ (ํ์ด์ง ํดํธ!)
๐ฆ ํ์ด์ง ํ ์ด๋ธ์ ์ด๋์ ์์๊น?
CR3
๋ ์ง์คํฐ๋ฅผ ํตํด ํ์ฌ ์ฌ์ฉ ์ค์ธ ํ์ด์ง ํ
์ด๋ธ์ ์ฐธ์กฐํด์.๐ ๊ณ์ธตํ ํ์ด์ง ํ ์ด๋ธ์ด ํ์ํ ์ด์
x86_64 ์์คํ
์์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ด 128TB๋ ๋๋๊น,
๋ชจ๋ ์ฃผ์๋ฅผ ๋ค ํ๋ฉด(1์ฐจ์ ๋ฐฐ์ด)์ผ๋ก ์ ์ฅํ๋ฉด ๋๋ฌด ์ปค์! (256GB ๋๊ฒ ๋จน์ ๐ฑ)
๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๊ธฐ ์ํด ํธ๋ฆฌ ๊ตฌ์กฐ์ฒ๋ผ ๊ณ์ธต์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๐ ์ฑ ์ ๋ชฉ์ฐจ โ ์ฑํฐ โ ํ์ด์ง ์์ผ๋ก ์ฐพ๋ฏ,
ํ์ด์ง ํ ์ด๋ธ๋ 4๋จ๊ณ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ญ์ญ ๋ฐ๋ผ ๋ด๋ ค๊ฐ์.
๐ก ์์ฝ ์ ๋ฆฌ
ํญ๋ชฉ | ์ค๋ช |
---|---|
๐ ์ ์ | ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ฐ๊ฟ์ฃผ๋ ์ฃผ์ ๋ณํํ |
๐ง ์กด์ฌ ์ด์ | ์ฃผ์ ๋ณดํธ, ์ ๊ทผ ๊ถํ, ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๊ด๋ฆฌ |
๐งฑ ๊ตฌ์กฐ | ํ์ด์ง ๋จ์ ๋งคํ (4KB ๊ธฐ์ค), ๊ณ์ธตํ ํ ์ด๋ธ ๊ตฌ์กฐ |
๐ฅ ํดํธ | ๋งคํ์ด ์์ผ๋ฉด ํ์ด์ง ํดํธ ๋ฐ์ โ OSไป์ |
๐ข ๊ฐ์ ๋ณด์ | ๋ชจ๋ ํ๋ก์ธ์ค๋ ๊ฐ์ ์๊ธฐ๋ง์ ํ์ด์ง ํ ์ด๋ธ์ ๊ฐ์ง |
โํ์ด์ง ํ ์ด๋ธ์ ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฑ ์์ง๋ ๋ ๋ ํ ์๋ด๋๋ค!โ
ํ์ด์ง ํ ์ด๋ธ = ๊ฐ์์ ๋ฃธ ๋๋ฒ โ ์ค์ ๋ฐฉ ์์น ์๋ด๋
์ฌ์ค์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ํฌ๊ธฐ๋ ๊ณ ์ ๋ ๊ฐ์ด๊ณ , ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ์ ํ์ด์ง์ ๋์ํ๋ ๋ฌผ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก "๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ฐ๊ฟ์ฃผ๋ ์ค์ง์ ์ธ ํ๋์จ์ด"๋ MMU (Memory Management Unit)์ ๋๋ค.
๐ง ์ ๋ฆฌํด๋ณด๋ฉด ์ด๋ ๊ฒ ๋๋ ์ ์์ด์:
์ญํ | ์ฃผ์ฒด | ์ค๋ช |
---|---|---|
๐ ๋ณํ ์ ๋ณด ์ ์ฅ | ํ์ด์ง ํ ์ด๋ธ (Page Table) | ๊ฐ์ ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ด๋์ ์๋์ง ์ ์ฅ๋ ํ |
โ๏ธ ์ฃผ์ ๋ณํ ์คํ | MMU (๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋) | CPU ์์ ์๋ ํ๋์จ์ด. ํ์ด์ง ํ ์ด๋ธ์ ์ฐธ๊ณ ํด ์ฃผ์๋ฅผ ๋ณํํจ |
๐ก ์์ฌ ๊ฒฐ์ ์ฃผ์ฒด | ์ด์์ฒด์ (์ปค๋) | ํ์ด์ง ํ ์ด๋ธ ์์ฑ/๊ด๋ฆฌ, ํ์ด์ง ํดํธ ์ฒ๋ฆฌ, ๊ถํ ๋ถ์ฌ ๋ฑ |
์ฆ, MMU๋ ๋ณํ์ โ์คํโํ๋ ์ฌ๋,
ํ์ด์ง ํ ์ด๋ธ์ ๊ทธ โ์ง๋โ,
์ด์์ฒด์ ๋ ๊ทธ๊ฑธ โ์์ฑํ๊ณ ๊ฐ๋ โํ๋ ๊ด๋ฆฌ์์ ๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์น ํธํ ์ฒ๋ผ ์๊ฒผ์ต๋๋ค.
์ด๊ฒ ๋ฐ๋ก ํ์ด์ง ํดํธ(Page Fault)์ ๋๋ค.
์ด๋ฐ ํ์ด์ง ํดํธ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด CPU์์ ์คํ ์ค์ธ ๋ช
๋ น์ด ์ค๋จ๋๊ณ , ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋ ํ์ด์งํดํธ ํธ๋ค๋ฌ page fault handler
์ฒ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
๐ "์ฃผ์์ ๋์๋๋ ๋ฌผ๋ฆฌ ํ์ด์ง๋ ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ์ ์์ด์. ๊ทผ๋ฐ ํ์ด์ง ํ ์ด๋ธ์๋ง ์์ง ์์๋ค์!"
์ด๋ด ๋๋ ๋์คํฌ ์ ๊ทผ ์์ด, ํ์ด์ง ํ ์ด๋ธ๋ง ์ ๋ฐ์ดํธํ๋ฉด ๋!
โ ๋น ๋ฅด๊ณ ๋ถ๋ด ์์
๐ง ๋น์ ํ์๋ฉด?
์ด๋ฏธ ์ฑ
์ ์ฑ
์ฅ์ ๊ฝํ ์๋๋ฐ, ๋์ ๋ชฉ๋ก(ํ์ด์ง ํ
์ด๋ธ)์๋ง ๋๋ฝ๋ ์ํ์์.
"์! ๋ชฉ๋ก์๋ง ์ถ๊ฐํ๋ฉด ๋๋๊ตฌ๋~" ๐
๐ง ๋ฉ๋ชจ๋ฆฌ๋ ์๋๋ฐ, ์ฃผ์ํ(ํ์ด์ง ํ ์ด๋ธ)๊ฐ ๋น ์ ธ ์์ด์ ์๊ธด ์ผ
๐ "์ด๊ฑด ํฐ์ผ์ด์์! ๊ทธ ์ฃผ์์ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์๊ณ ๋์คํฌ์ ์์ด์!"
๋์คํฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ RAM์ผ๋ก ๋ก๋ฉํด์ผ๋ง ํ ๊ฒฝ์ฐ
๋ณดํต์ swap ์์ญ์ด๋ mmap๋ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์์ ์ฝ์ด์์ผ ํด์
๋์คํฌ I/O๋ ์์ฒญ ๋๋ ค์ โก CPU๊ฐ ํ์ฐธ ๊ธฐ๋ค๋ ค์ผ ํจ
์ฆ, ๋์คํฌ I/O๊ฐ ๋ฐ์ํจ
๋ฉ์ด์ ํดํธ๊ฐ ์์ฃผ ์ผ์ด๋๋ฉด ์ฑ๋ฅ์ด ๋ ๋จ์ด์ง๋๋ค
์๋๋ ํจ์ฌ ๋๋ฆผ (ํ๋๋์คํฌ โ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ)
๐ง ๋น์ ํ์๋ฉด?
์ฑ
์ฅ์๋ ์ฑ
์ด ์๊ณ , ์ฐฝ๊ณ (๋์คํฌ)๊น์ง ๊ฐ์ ์ฐพ์์์ผ ํด์.
"์์ด๊ณ ์ด๊ฑธ ์ง๊ธ ๊ฐ์ง๋ฌ ๊ฐ์ผ ํด?" ๐งณ
๐ง ๋ฐฉ์ด ์์ ์์ด์, ์๋ก ์ํธ๋ฅผ ๊น๊ณ TV๋ฅผ ๋๊ณ ๋ฐฉ์ ๊พธ๋ฏธ๋ ์์ ์ด ํ์ํ ์ํฉ
๐งช ์ค์ ์์ ์ด๊ฑธ ์ด๋ป๊ฒ ํ์ธํด?
ps -o min_flt,maj_flt -p <PID>
demand-paging.py์์๋ ํ์ด์ง์ ์ ๊ทผํ๋ฉด ๋ ์ค ํ๋๊ฐ ์ฌ๋ผ๊ฐ์!
fork()๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ ๋์.
์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ถ ๋ณต์ฌํด์ผ ํ๋ค๋ฉด? ๐ฅ ๋นํจ์จ์ ์ด์ฃ .
๋ ์ค ๋๊ฐ ์ฐ๊ธฐ ์๋๋ฅผ ํ๋ฉด?
-ํ์ด์ง ํดํธ ๋ฐ์!
๐ง ๋ง์น ๋ฌธ์๋ฅผ ๋ณต์ฌํด๋ฌ๋ผ๊ณ ํด์ ๊ฐ์ด ๋ณด๊ณ ์๋ค๊ฐ, ํ ๋ช ์ด ๋์๋ฅผ ํ๋ ค๊ณ ํ๋ฉด ๊ทธ๋์์ผ ๋ณต์ฌํด์ฃผ๋ ๋๋์ด์์
๐ ๊ทธ๋์ ์ป๋ ์ด์ ์?
๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
โํ์ด์ง ํดํธ๊ฐ ๋ค ๊ฐ์ ๊ฒ ์๋๋ค.
๋ฌธ์ ๋ ๋ฉ์ด์ ํดํธ!
๋๋ํ๊ฒ ์๋ผ๋ ๊ธฐ์ ์ COW!โ
์๋๋ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๊ณ ์ฒ๋ฆฌ๋๋ ์ ์ฒด ํ๋ฆ์ ๋๋ค:
1. ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ฃผ์์ ์ ๊ทผํจ
2. TLB์์ ํ์ธ โ ์คํจ!
3. ํ์ด์ง ํ
์ด๋ธ์์ ํ์ธ โ ์คํจ!
4. ํ์ด์ง ํดํธ ์์ธ ๋ฐ์ (์ธํฐ๋ฝํธ)
5. ์ด์์ฒด์ ๊ฐ ๋์คํฌ์์ ํด๋น ํ์ด์ง๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋
6. ํ์ด์ง ํ
์ด๋ธ ์
๋ฐ์ดํธ
7. ํ๋ก์ธ์ค ์ฌ์คํ
// segv.go
package main
import "fmt"
func main() {
var p *int = nil
fmt.Println("๋น์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ")
*p = 8 // ๐ฃ ํฐ์ง๋ค!
fmt.Println("๋น์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ")
}
panic: runtime error: invalid memory address or nil pointer dereference
SIGSEGV: segmentation violation
๐ก ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์๋ ์กด์ฌํ์ง ์๋ ์ฃผ์์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ด์์!
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด panic: invalid memory address ๋ฉ์์ง์ ํจ๊ป ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ๊ธฐ๋ฅ์ด ์ ๋๋ก ์๋ํ๋ค๋ ์ฆ๊ฑฐ์
๋๋ค.
์คํํ๋ฉด SIGSEGV(์ธ๊ทธ๋ฉํ ์ด์ ํดํธ)๊ฐ ๋ฐ์ํ๋ฉฐ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.
์์ ์ฌ์ฉํ demand-paging.py
์์์ฒ๋ผโฆ
mmap()
์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ๋ณดํ ๋ค์๋๐ก ์ด๊ฒ ๋ฐ๋ก Demand Paging์ด์์! ์ค์ ํ์ํ ๋๋ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ๋ชจ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋๋ ์ ํ ํ์ด์ง๊ณผ ๋ฌ๋ฆฌ, ํ์ํ ์๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ ๋๋ค.
- ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ ค๋ ํ์ด์ง๊ฐ ์์ผ๋ฉด ํ์ด์ง ํดํธ โ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ โ ํ ์ด๋ธ ๊ฐฑ์ โ ์ฌ์์ ํ๋ฆ์ด ๋ฐ์ํฉ๋๋ค.
๋ฆฌ๋ ์ค๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ด์ง ํดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค:
๋จ๊ณ | ์ค๋ช |
---|---|
1 | ํ์ด์ง ํดํธ ์์ธ ๋ฐ์ |
2 | ์ปค๋์ page_fault_handler() ๋์ |
3 | ํด๋น ์ฃผ์๊ฐ ์ ํจํ ๋ฒ์์ธ์ง ๊ฒ์ฌ |
4 | ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ฉด ํ์ด์ง ํ ์ด๋ธ์ ์ ๋ฐ์ดํธ |
5 | ๊ฐ๋ฅํ์ง ์์ผ๋ฉด SIGSEGV ์๊ทธ๋ ์ ์ก |
ps -o min_flt,maj_flt -p <PID>
vmstat
๊ทธ๋ ์ต๋๋ค!
๐ ์๋ฅผ ๋ค์ด, Major Page Fault๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด ๋์คํฌ I/O๊ฐ ๋น๋ฒํด์ง๊ณ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ต๋๋ค.
ํ์ด์ง ํดํธ๊ฐ ์์ฃผ ์ผ์ด๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์ฌ
โ ์ฒ๋ฆฌ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.ย
ํ์ด์ง ํดํธ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
โ ์์ผ๋ก ์คํ๋ ์ฝ๋๋ ์์ฒญ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฝ๋๋ค.
โ ์๋ฒฝํ ๋ฏธ๋์์ธก = ์ ์ ์์ญย
์ถ์ฒ: https://devraphy.tistory.com/246 [๊ฐ๋ฐ์๋ฅผ ํฅํ์ฌ:ํฐ์คํ ๋ฆฌ]
ํญ๋ชฉ | ์ค๋ช |
---|---|
Minor Page Fault | ๋ฉ๋ชจ๋ฆฌ๋ ์์, ์ฃผ์ ์ ๋ณด๋ง ์์ |
Major Page Fault | ๋์คํฌ์์ ์ฝ์ด์ผ ํจ |
๋ฐ์ ์ ์ฒ๋ฆฌ | ์ปค๋์ page fault handler๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ ํ์ด์ง ํ ์ด๋ธ ๊ฐฑ์ |
SIGSEGV | ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์์ ์์ผ๋ฉด ๋ฐ์ํ๋ ์๊ทธ๋ |
์ด์์ฒด์ ๋ ์ด๋ฌํ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ํ์ด์ง๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ฃผ๊ณ ์ฌ์คํ์ ํ๊ฒํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
TLB์ ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์๋ ํ์ด์ง ํ ์ด๋ธ์ ๊ฐ์ง ์๊ณ ๋ฐ๋ก ๋ฌผ๋ฆฌ ์ฃผ์์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธ ํ์ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
์์ ๊ฒฝ์ฐ
์๋ CR3 ๋ ์ง์คํฐ ๊ฐ์ ํตํด์ ํ์ด์ง ํ
์ด๋ธ์ ์ ๊ทผํ๋ฉฐ ์ด๋ ํ์ด์ง ํ
์ด๋ธ์ ์ ๋ณด(valid - invalid bit๊ฐ)์ ํ์ธํด์ ๋ฌผ๋ฆฌ ์ฃผ์์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
ํ์ด์ง ํ ์ด๋ธ์๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ํ์ด์ง ํดํธ ์ธํฐ๋ฝํธ๋ฅผ ํตํด์ ์ด์์ฒด์ ์๊ฒ ์๋ ค์ค๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด์์ฒด์ ๋ ํด๋น ์ธํฐ๋ฝํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํ๋ก์ธ์ค์ ๊ณต๊ฐ์์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ฃผ๊ฒ ๋๊ณ ํ์ด์ง ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ CPU์๊ฒ ๊ฐ์ ์ฃผ์ ์์ฒญ์ ํ๋๋ก ํฉ๋๋ค.
๋ฌผ๋ก ์ด๋ฌํ ํ์ด์ง ํด๋๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฉด ์คํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
์๊ณ ๋ฆฌ์ฆ | ์ค๋ช |
---|---|
FIFO | ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ํ์ด์ง ์ ๊ฑฐ |
OPT | ์์ผ๋ก ๊ฐ์ฅ ์ค๋ ์ ์ธ ํ์ด์ง ์ ๊ฑฐ (์ด๋ก ์ ์ต์ ์ด์ง๋ง ๊ตฌํ ์ด๋ ค์) |
LRU | ๊ฐ์ฅ ์ค๋์ ์ ์ฌ์ฉํ ํ์ด์ง ์ ๊ฑฐ |
LFU | ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋ ํ์ด์ง ์ ๊ฑฐ |
NUR | ์ต๊ทผ ์ฌ์ฉ๋์ง ์์ ํ์ด์ง ์ฐ์ ์ ๊ฑฐ (R/M ๋นํธ ์ฌ์ฉ) |
๋ณดํต ํ์ด์ง๊ณผ ํผํฉํด์ ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฆฌ๋ ์ค ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ ๋ง๋ฒ ๊ฐ์ ๊ธฐ๋ฅ์ ๋๋ค.
๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ ๋ฆฝ๋ ์ธ๊ณ์ ์ด๊ฒ ํ์ฌ, ์ถฉ๋๊ณผ ์นจ๋ฒ์ ๋ง๊ณ ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค์!
CPU๋ TLB(Translation Lookaside Buffer)๋ฅผ ๋จผ์ ํ์ธํฉ๋๋ค.
โ TLB์ ๋งคํ์ด ์์ผ๋ฉด ์ฆ์ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ์ ๊ทผ ๊ฐ๋ฅ! โ
TLB์ ์๋ค๋ฉด? โ ํ์ด์ง ํ ์ด๋ธ์ ์กฐํํฉ๋๋ค. ์ด๋ CR3 ๋ ์ง์คํฐ(x86์์๋ ํ์ด์ง ํ ์ด๋ธ์ ๋ฃจํธ ์ฃผ์๋ฅผ ๋ด๊ณ ์์)๋ฅผ ํตํด ์์ํฉ๋๋ค.
ํ์ด์ง ํ
์ด๋ธ์์ ํด๋น ์ํธ๋ฆฌ๋ฅผ ์ฐพ์ต๋๋ค.
โ Valid bit(์ ํจ ์ฌ๋ถ)๋ฅผ ํ์ธํ์ฌ, ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์ ํจํ์ง ํ๋จํฉ๋๋ค.
๋ง์ฝ ํด๋น ๊ฐ์ ์ฃผ์์ ์ ํจํ ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์๋ค๋ฉด?
โ ํ์ด์ง ํดํธ ์์ธ(Page Fault Exception)๊ฐ ๋ฐ์ํฉ๋๋ค. ๐จ
์ปค๋์ ํ์ด์ง ํดํธ ํธ๋ค๋ฌ๊ฐ ๋์ํ์ฌ ๋์คํฌ(์ค์ or ํ์ผ)์์ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ , ํ์ด์ง ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์๊ฐํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์์ ์ด๋์:
ํ์ง๋ง ๋ฆฌ๋ ์ค๋ ์ด๋ ๊ฒ ๋จ์ํ๊ฒ ๋์ํ์ง ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ
๋ ํ๋ณดํ ์๊ฐ ๋น์ฅ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ์กฐ๊ธ ์๊ฐ์ด ์ง๋ ํ์ ์ฌ์ฉํ๋ ์ผ์ด ๋ง์์ ๋ฆฌ๋
์ค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ์ ์ฐจ๋ฅผ ๋ ๋จ๊ณ๋ก ๋๋๋๋ค.
1. ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ ๋น: ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์๋กญ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋งคํํฉ๋๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
๋ฆฌ๋
์ค๋ ๋์ , โ์ผ๋จ ์ฑ
์ฅ์ ๋ง๋ค์ด ์ค๊ฒ. ์ง์ง ์ฑ
์ ๋์ค์ ๋ฃ์!โ๋ผ๋ ์ฒ ํ์ ๊ฐ์ง๋๋ค.
์ด๊ฑธ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋กโฆ
์ถ์ฒ : https://bannavi.tistory.com/80
mmap()
์ ํ๋ก์ธ์ค๊ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ ์์คํ
์ฝ์
๋๋ค.
์ถ๊ฐ๋ก ์ค๋ช
ํ์๋ฉด mmap() ์์คํ
์ฝ๊ณผ Go ์ธ์ด์ map() ํจ์ ์ธ์๋ ์กฐ๊ธ ๋ค๋ฆ
๋๋ค. ์๋ฅผ ๋ค์ด ์์คํ
์ฝ
์ ์์ฒญํ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ง์ ํ์ง๋ง, Go ์ธ์ด ํจ์
๋ ์ธ๋ฒ์งธ ์ธ์๋ก ์ง์ ํฉ๋๋ค.
์ด ํจ์๋ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ํ ๋นํด์ฃผ์ง ์๊ณ , ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ โ๋น์ด ์๋ ์์ญโ์ ๋งคํํด์ฃผ๋ ์ญํ ์ ํด์.
๐ ์ฆ, ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ์์ง๋ง, โ์ฌ๊ธฐ๋ถํฐ ์ฌ๊ธฐ๊น์ง๋ ๋ค ๊ฑฐ์ผ!โ ํ๊ณ ํ์๋ง ํด๋๋ ๊ฒ๋๋ค.
์ด๋ ๊ฒ ํ๋ณด๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ /proc/<pid>/maps
ํ์ผ์ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
์์ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ 0๋ฐ์ดํธ๋ ํ ๋น๋์ง ์์์ง๋ง, mmap()
ํธ์ถ ์ดํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฆ๊ฐํ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์์ชฝ ๋ชจ๋ ์๋ง์ ์ธ์๊ฐ ์์ง๋ง ์ฌ๊ธฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ์ธ์์๋ง ์ฃผ์ํ๋ฉด ๋ฉ๋๋ค.
์ถ์ฒ : https://keepat-it.tistory.com/39
mmap()
์ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์ ๋งตํํ๋ ํจ์์
๋๋ค.
ํ์ง๋ง ๋จ์ํ ํ์ผ ์
์ถ๋ ฅ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ๋จ์๋ก ์๋ํ๋ฏ๋ก, "์ ๊ทผ ๊ถํ"๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์์ผ๋ก ์ค์ ํฉ๋๋ค.
๊ถํ ์ฝ์ด | ์๋ฏธ | ์ค๋ช |
---|---|---|
PROT_READ | ์ฝ๊ธฐ | ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฝ์ ์ ์์ |
PROT_WRITE | ์ฐ๊ธฐ | ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ธ ์ ์์ |
PROT_EXEC | ์คํ | ์ฝ๋์ฒ๋ผ ์คํ ๊ฐ๋ฅ (์ฝ๋ ์์ญ ๋งคํ์ ์ฌ์ฉ) |
PROT_NONE | ์ ๊ทผ ๊ธ์ง | ๋ณดํธ ๋ชฉ์ , ์๋ฌด ์์ ๋ ๋ชปํจ |
ํ์ผ์
rwx
์ฒ๋ผ ๋ณด์ด์ง๋ง, mmap์์๋PROT_*
์ผ๋ก ์ค์ ํ๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค!
๋ฆฌ๋ ์ค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์, mmap์ผ๋ก ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋์คํฌ(์ค์ ๊ณต๊ฐ)์ผ๋ก ์ด๋๋ ์ ์์ด์.
์ฉ์ด | ์ค๋ช |
---|---|
Page Out / Swap Out | ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์, ์ฌ์ฉ ์ค์ธ ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋ด๋ณด๋ด๊ธฐ |
Page In / Swap In | ๋ค์ ํ์ํด์ง ํ์ด์ง๋ฅผ ๋์คํฌ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ค๊ธฐ |
์ด๊ฒ ์ค์ํ ์ด์ ๋:
์ฆ, mmap๋ ์ค์์ ๋์์ด ๋ ์ ์๋ค๋ ๊ฒ, ๋จ, ๊ณต์ mmap์ ์์ธ์ผ ์ ์์!
mmap()
์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ๋ฐฉ์์ ๊ณต์ (shared) ๋๋ ์ฌ์ค(private) ์ค์์ ์ ํํ ์ ์์ต๋๋ค.
MAP_SHARED
์ต์
mmap(..., MAP_SHARED)
ํ๋ก์ธ์ค A์์ ์์ ํ ๋ด์ฉ์ด ํ๋ก์ธ์ค B์๋ ๊ทธ๋๋ก ๋ฐ์๋จ
(๋จ, ํ์ผ๊ณผ์ ์ฑํฌ์๋ ์ฝ๊ฐ์ ์๊ฐ์ฐจ๊ฐ ์์ ์ ์์)
MAP_PRIVATE
์ต์
mmap(..., MAP_PRIVATE)
์ฝ๊ธฐ ์ ์ฉ ์ฐธ๊ณ ์ฉ์ผ๋ก๋ ์ข์ง๋ง, ์ฐ๊ธฐ ์ฑ๋ฅ์ด๋ ์ค์ ๊ด๋ฆฌ์๋ ์ฃผ์ ํ์
mlock(addr, length)
ํน์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณ ์ ์์ผ ํ์ด์ง ์์(์ค์ ์์)์ ๋ฐฉ์งํ ์ ์์
ํญ๋ชฉ | Shared mmap | Private mmap |
---|---|---|
๋๊ธฐํ ์ฌ๋ถ | O (ํ์ผ๊ณผ ๊ณต์ ) | X (ํ ๋ฒ๋ง ๋ณต์ฌ) |
๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ณต์ | O | X |
ํ์ผ ์์ ๋ฐ์ | O | X |
์ค์ ์์ ๋์ | โ (๋์คํฌ์ ์์) | โ (RAM์ ์์ด์ผ ํจ) |
์ฐ๊ธฐ ์ ๋์ | ๋ฐ๋ก ๋ฐ์ | COW (๋ณต์ฌ ํ ์์ ) |
๊ตฌ๋ถ | ์ค๋ช |
---|---|
Protection | PROT_READ , PROT_WRITE , PROT_EXEC ๋ฑ์ผ๋ก ์ ๊ทผ ๊ถํ ์ค์ |
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๊ณ | ํ์ ์ ์ค์ ์์/์ธ ๋ฐ์, ํนํ Private mmap์ ์ค์ ๋์์ด ๋จ |
๊ณต์ ๋ฐฉ์ | MAP_SHARED ๋ ํ์ผ๊ณผ ๊ณต์ , MAP_PRIVATE ๋ ๋ณต์ฌ ํ ๋
๋ฆฝ ์ฌ์ฉ |
mmap()
์์คํ
์ฝ์ ํธ์ถํ ์งํ๋ผ๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋์ํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ์กด์ฌํ์ง ์์ต๋๋ค.
๋ฆฌ๋ ์ค๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ง๊ธฐ ์ํด ์ง์ง ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ โํ์ํ ๋๋งโ ํฉ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ด ๋ฐ๋ก Demand Paging์ ๋๋ค.
ํ์ด์ง ์ ๊ทผ ํ ๋ฉ๋ชจ๋ฆฌ ํ๋ณด ์ ์ฐจ
ํ๋ก์ธ์ค๊ฐ mmap()
์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ฒญํ๋ฉด
โ ๊ฐ์ ์ฃผ์๋ง ํ๋ณด๋จ (๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์)
์ด ์ฃผ์์ ์ค์ ๋ก ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด
โ ํ์ด์ง ํดํธ ์์ธ(Page Fault Exception) ๋ฐ์
์ปค๋์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ
โ ํ์ด์ง ํ
์ด๋ธ์ ๊ฐฑ์
๐ ๋น์ ํ์๋ฉด?
โ๋น ์ฑ ์ฅ์ ๋ง๋ค์ด๋๊ณ , ๋ ์๊ฐ ์ค์ ๋ก ์ฑ ์ ๊บผ๋ด๋ ค ํ ๋ ๊ทธ ์ฑ ์ ๊ฝ๋ ๊ฒโ
ํ์ด์ง ํดํธ ํธ๋ค๋ฌ๋ ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ ์, ํ๋ก์ธ์ค์
SIGSEGV
์๊ทธ๋์ ๋ณด๋ด์ง๋ง, ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๋ ์กด์ฌํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ์๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ์ฒ๋ฆฌ๋ก ๋ถ๊ธฐํฉ๋๋ค.
๋ฆฌ๋
์ค์์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ์ ๋, ์ปค๋์ ํ์ด์ง ํดํธ ํธ๋ค๋ฌ(page_fault_handler
)๋ ๋ค์๊ณผ ๊ฐ์ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค:
1) ํ์ด์ง ํ ์ด๋ธ์ ์ํธ๋ฆฌ๊ฐ ์์ผ๋ฉด?
SIGSEGV
(Segmentation Fault) ์๊ทธ๋์ ํด๋น ํ๋ก์ธ์ค์ ๋ณด๋
๋๋ค.์:
nil
ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ, ์คํ/ํ ์์ญ์ ๋์ ์ ๊ทผ ๋ฑ
2) ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๋ ์์ผ๋, ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ?
mmap()
๋ฑ์ผ๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํด๋์์ง๋ง, ์์ง ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋์๋ ํ์ด์ง๊ฐ ์๋ ์ํ์
๋๋ค.โ ์ด๊ฑด ์ค๋ฅ๊ฐ ์๋๋ผ ์ ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ ํ๋ฆ์ ์ผ๋ถ์ ๋๋ค!
โ ์์ฝ ์ ๋ฆฌ
์ํฉ | ์ฒ๋ฆฌ ๋ฐฉ์ | ๊ฒฐ๊ณผ |
---|---|---|
ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ ์์ | SIGSEGV ์๊ทธ๋ ์ ์ก | ํ๋ก์ธ์ค ๊ฐ์ ์ข ๋ฃ |
ํ์ด์ง ํ ์ด๋ธ์ ์์ง๋ง ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์์ | Demand Paging ์ํ | ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ ์ฌ์คํ |
๐ ๊ด๋ จ ํค์๋ ์ ๋ฆฌ
์ฉ์ด | ์ค๋ช |
---|---|
SIGSEGV | ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ์ด์์ฒด์ ๊ฐ ํ๋ก์ธ์ค์ ๋ณด๋ด๋ ์๊ทธ๋ |
Demand Paging | ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์์ ์ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ๋ ๊ธฐ๋ฒ |
ํ์ด์ง ํ ์ด๋ธ | ๊ฐ์ ์ฃผ์์ ๋ฌผ๋ฆฌ ์ฃผ์์ ๋งคํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ตฌ์กฐ |
ํ์ด์ง ํดํธ ํธ๋ค๋ฌ | ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ์ ๋ ์ปค๋์์ ์คํ๋๋ ์ฒ๋ฆฌ ๋ฃจํด |
์ฝ๋ ํ๋ก์ธ์ค
1. ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ์ ๋ณด(/proc/<pid>/maps
์ถ๋ ฅ)๋ฅผ ํ์ํฉ๋๋ค.
2. mmap() ์์คํ
์ฝ๋ก 1GiB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํฉ๋๋ค.
3. ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ์ ๋ณด๋ฅผ ํ์ํฉ๋๋ค.
๊ฒฐ๊ณผ
1. mmap()
ํธ์ถ โ 0x7fd00aa94000 - 0x7fcfcaa94000 = 1GiB ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ๋ณด
2. /proc/<pid>/maps
๋ก ํ์ธํ๋ฉด, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋์์ง๋ง
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ํ ๋น๋์ง ์์!
์ฃผ์๋ฅผ ๋บ ๊ฐ์ด 1GiB๋ผ๋ ์ ์ด ์ค์ํฉ๋๋ค.
mmap()
์ผ๋ก 100MiB ํ๋ณด ps
, sar -r
, sar -B
๋ฑ์ผ๋ก์์ | ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ | ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ | ํ์ด์ง ํดํธ |
---|---|---|---|
mmap() ์งํ | ์ฆ๊ฐํจ | ๊ทธ๋๋ก | ์์ |
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ค | ๊ทธ๋๋ก | ์ ์ ์ฆ๊ฐ | ์ด๋น ์์ฒ ํ |
์ ๊ทผ ์๋ฃ ํ | ๊ทธ๋๋ก | 100MiB ์ฆ๊ฐ | ๊ณ ์ ๋จ |
ํ๋ก์ธ์ค ์ข ๋ฃ | ์ฌ๋ผ์ง | ํ์๋จ | 0 |
โ ์ฆ, ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ง ํ ๋น๋๊ณ ,
ํ์ด์ง ํดํธ๋ฅผ ํตํด ์ปค๋์ด ์ฆ์์์ ์ฒ๋ฆฌํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
ํ์ด์ฌ, Go, C ๊ฐ์ ์ธ์ด๋ค๋ ๋ด๋ถ์ ์ผ๋ก ๋น์ทํ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
mmap()
์ ํธ์ถํ์ง ์๊ณ ,๐ ์ด๊ฑด malloc(), new, ๋ฆฌ์คํธ ์์ฑ ๋ฑ์์๋ ํ์ธํ ์ ์์ด์.
๊ฐ๋ | ์ค๋ช |
---|---|
mmap() | ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ๋ง ํ๋ณดํ๋ ์์คํ ์ฝ |
Demand Paging | ๋ฉ๋ชจ๋ฆฌ์ ์ค์ ์ ๊ทผํ ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น |
ํ์ด์ง ํดํธ | ์ ๊ทผ ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ผ๋ฉด ๋ฐ์ํ๋ ์์ธ |
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ | ํ์ด์ง ํดํธ ๋ฐ์ ํ |
์ด์ | ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ๋ฐฉ์ง, ์ฑ๋ฅ ์ต์ ํ |
์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์์๋ณด๊ณ ์ถ์ ๊ฑด ํ ๊ฐ์ง์์.
โ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฒ์์ ๊ทธ๋ฅ ์ฃผ์๋ง ํ ๋นํด์ฃผ๊ณ , ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์ธ์ ์ฃผ๋ ๊ฑธ๊น?โ
๋ต์ ๋ฐ๋ก ์ ๊ทผํ ๋! ์
๋๋ค. ์ด๊ฑธ "Demand Paging"์ด๋ผ๊ณ ํ์ฃ .
์ด๋ฒ ์คํ์ ๋ฐ๋ก ๊ทธ Demand Paging์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ๋ชธ์ ํ์ธํ๋ ์คํ์ด์์.
์คํ์ Python ์ฝ๋(demand-paging.py
)๋ก ์งํ๋ฉ๋๋ค.
memregion = mmap.mmap(-1, ALLOC_SIZE, flags=mmap.MAP_PRIVATE)
mmap()
์์คํ
์ฝ๋ก 100MiB์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํฉ๋๋ค.๐ฆ ์์ง ์ฑ ์ฅ์ ์กฐ๋ฆฝํด๋๊ธฐ๋ง ํ๊ณ , ์ฑ ์ ํ ๊ถ๋ ์ ๊ฝํ ์๋ ์ํ์ฃ .
for i in range(0, ALLOC_SIZE, PAGE_SIZE):
memregion[i] = 8 # ๊ฐ ํ์ด์ง์ ์ฒซ ๋ฐ์ดํธ ์ ๊ทผ
์ด์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ ํ์ด์ง์ 1๋ฐ์ดํธ์ฉ ์ ๊ทผํฉ๋๋ค.
์ด ์๊ฐ! Demand Paging์ด ์์๋ผ์.
โจ โํ์ํ ๋๋ง ์ฑ ์ ๊บผ๋ด ๊ฝ๋ ๋ฐฉ์โ โ ์ด๊ฒ ๋ฐ๋ก Demand Paging์ ๋๋ค!
์คํ ์ค sar -r 1
, sar -B 1
๋ช
๋ น์ด๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๋ฉด ๋ค์์ ํ์ธํ ์ ์์ด์:
sar -r 1
)sar -B 1
)fault/s
(์ด๋น ํ์ด์ง ํดํธ ์) ์์ฒ ๋จ์๋ก ๊ธ์ฆ์ด๊ฑด ๋ฐ๋ก ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ์๊ฐ์๋ง ํ ๋น๋๊ธฐ ๋๋ฌธ์ด์์!
์ด์ ํน์ ํ๋ก์ธ์ค(demand-paging.py)์ ์ํ๋ฅผ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ์ดํด๋ณด๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด๋ณผ ์ ์์ด์:
./capture.sh
์ถ๋ ฅ๋๋ ์ฃผ์ ์งํ๋ ๋ค์๊ณผ ๊ฐ์์:
ํญ๋ชฉ | ์๋ฏธ |
---|---|
VSZ | ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ |
RSS | ์ค์ ๋ก ํ ๋น๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ |
maj_flt | ๋ฉ์ด์ ํ์ด์ง ํดํธ ํ์ |
min_flt | ๋ง์ด๋ ํ์ด์ง ํดํธ ํ์ |
๋ง์น, ์ฑ ์ฅ์ ๋งค๋ฒ ์ฑ ํ ๊ถ์ฉ ๊ฝ์ ๋๋ง๋ค ์๋์ด ์ธ๋ฆฌ๋ ๊ฑฐ์์. "์ฑ ์๋ค!" ๐ฆ
๋จ๊ณ | ์ค๋ช | ๋ฉ๋ชจ๋ฆฌ ๋ณํ |
---|---|---|
mmap() ํธ์ถ | ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ๋ง ํ๋ณด (๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์์) | VSZ ์ฆ๊ฐ, RSS ๋ณํ ์์ |
๊ฐ ํ์ด์ง ์ ๊ทผ ์์ | ํ์ด์ง ํดํธ ๋ฐ์ โ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ ๋น | RSS ์ฆ๊ฐ, fault/s ์ฆ๊ฐ |
์ ๊ทผ ์๋ฃ | ๋ชจ๋ ํ์ด์ง์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์๋ฃ | RSS = VSZ |
ํ๋ก๊ทธ๋จ ์ข ๋ฃ | ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํด์ | VSZ, RSS ๋ชจ๋ ๊ฐ์ |
โDemand Paging์ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ์ง ์์ง๋ง, ํ์ํ ์๊ฐ์ ์ ํํ ํ์ํ ๋งํผ๋ง, ์ค๋งํธํ๊ฒ ์ค๋ค!โ
๐ ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ ์ ๋ต์ด๋ ์ด๋ฐ ๊ฒ์ด๋ค!
๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ด ์ด๋ง์ด๋งํ๊ฒ ๋์๋ฐ, ๊ทธ๊ฑธ ์ ๋ถ ๊ด๋ฆฌํ๋ ค๋ฉด ํ์ด์ง ํ ์ด๋ธ๋ ์์ฒญ ์ปค์ผ ํ์ง ์์๊น?
"์ปดํจํฐ์ ์ฃผ์๋ก"์ด์์!
์ฐ๋ฆฌ ์ง ์ฃผ์๋ โ์์ธ์ 00๊ตฌ 123-45๋ฒ์งโ ๊ฐ์ ๊ฐ์ ์ฃผ์์์์? ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก ๋ฌผ๊ฑด์ ์ฐฝ๊ณ ์ ์นธ์นธ๋ง๋ค ๋ค์ด ์์ด์.
์ด๋ "๊ฐ์ ์ฃผ์ โ ์ค์ ์ฃผ์(์ฐฝ๊ณ ์นธ)"์ ์๋ ค์ฃผ๋ ๊ฒ ๋ฐ๋ก ํ์ด์ง ํ
์ด๋ธ์ด์์!
โ ์ฆ, ํ์ด์ง ํ ์ด๋ธ = ์ฃผ์ ๋ณํ ํ
๐ ๊ทธ๋ฐ๋ฐ ํ์ด์ง ํ ์ด๋ธ์ด ์ ์ด๋ ๊ฒ ํฌ๋ค๊ณ ํ๋ ๊ฑธ๊น์?
๐ ๊ฐ์ : x86_64 ์ํคํ ์ฒ
๊ทธ๋ผ ์ผ๋ง๋ ๋ง์ ํ์ด์ง๊ฐ ํ์ํ๋๋ฉด...
128TB รท 4KB = ์ฝ 34,359,738,368๊ฐ! (์ฝ 340์ต ๊ฐ ํ์ด์ง)
๊ฑฐ๊ธฐ๋ค ๊ฐ ํ์ด์ง๋ง๋ค 8๋ฐ์ดํธ ์ ๋ณด๊ฐ ํ์ํ๋...
340์ต ๊ฐ ร 8๋ฐ์ดํธ = 256GB
๐ฑ ํ์ด์ง ํ
์ด๋ธ๋ง 256GB๋ ํ์ํ๋ค๋ ๋ง์ด ๋๋ ๊ฑฐ์์!
๊ทผ๋ฐ... ๋ด ์ปดํจํฐ RAM์ 16GB๋ฐ์ ์ ๋๋๋ฐ?!?
๐ค โํ, ๊ทธ๋ผ ์ฐ๋ฆฌ ์ปดํจํฐ๋ ๋ฉ์ฉกํ ๋์๊ฐ๋ ๊ฑฐ ๋ง์?โ
๋ง์์. ์๋ํ๋ฉด...
์ฌ๊ธฐ์ ๋น๋ฐ ๋ฌด๊ธฐ ๋ฑ์ฅ! ๋ฐ๋ก ๊ณ์ธตํ ํ์ด์ง ํ
์ด๋ธ ๊ตฌ์กฐ์์.
์ด๊ฑด โํ์ํ ๊ฒ๋ง ๊บผ๋ด ์ฐ๋โ ๋ฐฉ์์ด์์.
๋ง์ฝ ๋งํ์ฑ ๋ง ๋ณธ๋ค๋ฉด, ๊ณผํ์ฑ ๋ชฉ๋ก์ด๋ ๋ด์ฉ์ ์์ ๋ง๋ค์ง๋ ์์์!
์ฆ,
๊ทธ๋์ ์ค์ ๋ก๋ ์ ์ฒด 256GB๊ฐ ํ์ํ์ง ์์์.
ํ์ด์ง ํ ์ด๋ธ์ ์ค์ ๋ก ๋๋ฌด์ฒ๋ผ ๊ณ์ธต ๊ตฌ์กฐ(Tree-like structure)๋ก ๋์ด ์์ด์.
๊ตฌ์กฐ | ์ค๋ช | ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ฌ๋ถ |
---|---|---|
ํํํ (1์ฐจ์) | ๋ชจ๋ ํ์ด์ง์ ๋ํด ๋ฌด์กฐ๊ฑด ์ํธ๋ฆฌ ์์ฑ | ์์ ๐ญ |
๊ณ์ธตํ (ํธ๋ฆฌ ๊ตฌ์กฐ) | ํ์ํ ํ์ด์ง๋ง ์ ์ฐจ ๊ตฌ์กฐ ์์ฑ | ์์ ๐ |
๐ ๊ทธ๋์ ํ๋ก์ธ์ค ํ๋๊ฐ 256GB๋ฅผ ์ฐจ์งํ์ง ์๊ณ ๋, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ฑฐ์์!
์์คํ ์ด ์ฌ์ฉํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ค์์ ํ์ด์ง ํ ์ด๋ธ์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ sar - ALL ๋ช ๋ น์ด๋ก kbpgtbl ํ๋์์ ํ์ธํ ์ ์์ต๋๋ค
โํ์ด์ง ํ ์ด๋ธ์ ์ฒ์ ๋ณด๋ฉด ๋๋ฌด ์ปค ๋ณด์ฌ๋, ์ค์ ๋ก๋ โํ์ํ ๋งํผ๋งโ ๋ง๋ค์ด์ ๋๋ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ปด์!โ
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํจ์จ์ ํ ๋จ๊ณ ๋ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํ ๊ธฐ์ ์ด์์.
์ด๊ฑธ 1ํ์ด์ง๋น ํฌ๊ธฐ๊ฐ 400๋ฐ์ดํธ์ธ Huge Page๋ก ๋ฐ๊พธ๋ฉด ํ์ด์ง ํ
์ด๋ธ ๊ณ์ธต์ 1๋จ์ ๊ฑด๋๋ฐ๊ณ [๊ทธ๋ฆผ 04-24]์ฒ๋ผ ๋ฉ๋๋ค.
๊ธฐ๋ณธ ํ์ด์ง๋ 4KiB์ง๋ง, Huge Page๋ ๋ณดํต 2MiB~1GiB
fork()
์๋ ํฅ์!mmap(..., MAP_HUGETLB); // ๋ช
์์ ์ผ๋ก Huge Page ์์ฒญ
๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๋ DB, ๊ฐ์๋จธ์ ๋ฑ์ ์ข์
ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ช ์ํ์ง ์์๋, OS๊ฐ ์์์ 4KiB ํ์ด์ง๋ค์ ๋ฌถ์ด์ Huge Page๋ก ๋ง๋ค์ด์ค๋๋ค.
cat /sys/kernel/mm/transparent_hugepage/enabled
# ์ถ๋ ฅ ์์: always [madvise] never
madvise()
์์คํ
์ฝ๋ก ์์ฒญํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ (Ubuntu 20.04 ๊ธฐ๋ณธ๊ฐ)๊ฐ๋ | ์ค๋ช | ์ฅ์ | ์ฃผ์์ |
---|---|---|---|
ํํํ ํ์ด์ง ํ ์ด๋ธ | ์ ๋ฒ์๋ฅผ ์ผ๊ด ๊ด๋ฆฌ | ๊ตฌ์กฐ ๊ฐ๋จ | ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ํผ |
๊ณ์ธตํ ํ์ด์ง ํ ์ด๋ธ | ํ์ํ ๋ฒ์๋ง ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์ฑ | ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ | ๊ตฌ์กฐ ๋ณต์ก |
Huge Page | ํ์ด์ง ๋จ์ ์์ฒด๋ฅผ ํค์ (ex. 2MiB) | ํ์ด์ง ํ ์ด๋ธ ์์์ง | ๋ช ์์ ์ค์ ํ์ |
Transparent Huge Page | ์ฐ์๋ ํ์ด์ง๋ฅผ OS๊ฐ ์๋์ผ๋ก ๋ฌถ์ | ์๋ ์ต์ ํ | ์คํ๋ ค ๋๋ ค์ง ์๋ ์์ |
์๋ ์๋ DRAM์ด ๋ฌด์์ด ์๋๋ก ์ฑ์ฅํ์ด์.
ํ๋ง๋๋ก "DRAM ์ฑ์ฅ์ด ์์ ๊ฐ์ง ์๋ค..."๋ ๊ฑฐ์ฃ .
ํ์ง๋ง ์ธ์์ ์ ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ํด์.
โDRAM๋ง์ผ๋ก๋ ๋์ ํ ๊ฐ๋นํ ์ ์๋ค!โ
๊ทธ๋์ ์ฐ๊ตฌ์๋ค์ ๋์์ ์ฐพ์ ๋์ฐ์ต๋๋ค.
DRAM์ ๋ณด์ํ๊ฑฐ๋ ๋์ฒดํ ๋ฐฉ๋ฒ๋ค, ๋ฐ๋ก ์ด๊ฒ๋ค์ด์์:
๊ทธ๋ฆฌ๊ณ ๊ทธ ์์๋ ๋ ๋ฉ์ง ๊ธฐ์ ๋ค์ด ์จ์ด ์์ด์:
๋ ํ๋, Disaggregated Memory๋ ๊ฐ๋
๋ ๋์์ด์.
โ ์ฌ๋ฌ ์๋ฒ์ DRAM์ ํฉ์ณ ํ๋์ ๊ฑฐ๋ํ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ์ฐ๋ ๊ฑฐ์์!
๐ ์ต๊ทผ์ CXL(Compute Express Link)์ด๋ผ๋ ๊ณ ์ ํต์ ๊ธฐ์ ๋๋ถ์,
CPU๊ฐ ์๊ฒฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์น ๋ด ๊ฒ์ฒ๋ผ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๊ฒ ๋์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ "DRAM์ด ์์ด๋ ๋๋ค"๋ ๊ฑด ์๋์์.
์คํ๋ ค DRAM์ ์บ์์ฒ๋ผ ์ฌ์ฉํด์
์๋์ ์ฉ๋ ์ฌ์ด์์ ์ ๋ฌํ ๊ท ํ์ ์ฐพ์! ์ด๊ฒ ํต์ฌ์
๋๋ค.
๊ทธ๋์ ๋ง๋ค์ด์ง ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ์ด๊ฑฐ์์:
CPU ๊ฐ๊น์ด: ๋น ๋ฅด์ง๋ง ๋น์ผ ๋ฉ๋ชจ๋ฆฌ (L1/L2 ์บ์, DRAM)
CPU ๋ฉ๋ฆฌ: ๋๋ฆฌ์ง๋ง ํฐ ๋ฉ๋ชจ๋ฆฌ (SCM, SSD ๋ฑ)
๐ฏ ๋ชฉํ๋ ๋จ ํ๋!
"ํซํ ๋ฐ์ดํฐ๋ ์์ชฝ์์, ์ฝ๋ํ ๋ฐ์ดํฐ๋ ์๋์ชฝ์์ ์ฒ๋ฆฌํ์!"
๊ณ์ธต ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์ค์ํ ๊ฑด
โก ๋ฌด์จ ๋ฐ์ดํฐ๋ฅผ DRAM์ ๋๊ณ , SCM์ผ๋ก ๋ด๋ฆด์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด์์.
๐ ํ๋จ ๊ธฐ์ค์ ๋ ๊ฐ์ง:
1. ์ผ๋ง๋ ์์ฃผ ์ ๊ทผํ๋๊ฐ (๋น๋) โ LFU
2. ๋ง์ง๋ง ์ ๊ทผ์ด ์ผ๋ง๋ ์ต๊ทผ์ธ๊ฐ (์ต์ ์ฑ) โ LRU
ํ์ค์์ ์ด ๋์ ์ ์ ํ ์์ด์ ํ๋จํด์.
๊ทธ๋ฐ๋ฐ! ์ด์์ฒด์ ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ์๋ฒฝํ ์ ์๊ฐ ์์ด์.
PTE ์ ๊ทผ ๋นํธ
๋ ์ ํํ์ง ์์ (TLB ๋๋ถ์ ์๋ต๋๊ธฐ๋ ํจ)์๋์ ํ์ด์ง ํดํธ
๋ ์ฑ๋ฅ์ ์
์ํฅ ๐ญHuge page ๋ก ์ธํ ๋นํจ์จ์ ์ธ ๊ณต๊ฐ ํ์ฉ
ํ์ง๋ง ์ด๊ฒ๋ ์ฝ์ง ์์์:
๊ทธ๋์ ์ฐ๊ตฌ์๋ค์ ์ ๋นํ ํ์ด๋ฐ๊ณผ ๊ธฐ์ค์ ์ฐพ์๋ด๋ ค๋ ์๊ณ ๋ฆฌ์ฆ๋ ์ฐ๊ตฌ ์ค์ด์์.
์: Memtis(2023)์ ๋ด๋ถ ๋จํธํ ์์ค์ ๋ณด๊ณ ์ชผ๊ฐ๋ ๊ธฐ์ค์ ์ ์ํ์ด์!
โ10๋ ํ์๋, ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ง๊ธ๊ณผ ์์ ํ ๋ฌ๋ผ์ง์ง๋ ๋ชฐ๋ผ์!โ
์ด๋ ๊ฒ ๋ฆฌ๋
์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋๋ํ๊ฒ ๊ด๋ฆฌํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์ด๋ค ํ๋์ ํ๋์ง ์์๋ดค์ด์. ์ค์ ๋ก ์ปดํจํฐ๋ฅผ ์ฐ๋ฉด์ ๊ฐ๋ free
๋ช
๋ น์ด๋ sar
๋ช
๋ น์ด๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด์ฐฐํด๋ณด์ธ์. ๋ฆฌ๋
์ค์ ๋๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ
์ ์ง์ ๋๋ ์ ์์ ๊ฑฐ์์~
THP ๋ด์ฉ
๋ธ๋ฃจ์คํฌ๋ฆฐ๋ page fault์ ์ผ์ข > os๋จ์์ ํ์ด์งํดํธ๋๋ฉด ๋ธ๋ฃจ์คํฌ๋ฆฐ
OOM ์ ์ ๋ณด๊ธฐ : cat /proc/[PID]/oom_score_adj
DB๊ฐ ํ๋ก์ธ์ค๋ ๋ฆฌ๋
์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋ค.
๐ง โDB๊ฐ ํ๋ก์ธ์ค๋ ๋ฆฌ๋
์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋คโ๋ ๋ป์?
1) ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)๋ ๊ฒฐ๊ตญ ํ๋ก์ธ์ค์ด๋ค
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ MySQL, PostgreSQL, Oracle ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ๋ฆฝ ์คํ๋๋ ํ๋ก๊ทธ๋จ, ์ฆ ํ๋ก์ธ์ค์์.
์ด DB ํ๋ก๊ทธ๋จ๋ ์ด์์ฒด์ ์์ ๊ด๋ฆฌํ๋ ํ๋์ ์ฌ์ฉ์ ํ๋ก์ธ์ค๋ก ์คํ๋ฉ๋๋ค.
์: ps -ef | grep postgres
postgres 10123 1 0 10:00 ? 00:00:00 /usr/lib/postgresql/...
๐ง 2) ๋ฆฌ๋ ์ค๊ฐ ๊ด๋ฆฌํ๋ ๊ฒ๋ค์ DB๋ ๋๊ฐ์ด ๊ฒช๋๋ค
์ด์์ฒด์ ๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ์ฃ . ๊ทธ๋ฌ๋๊น DB๋ ๋ค์๊ณผ ๊ฐ์ ๋ฆฌ๋ ์ค์ ์ ์ฝ๊ณผ ๊ท์น์ ๊ทธ๋๋ก ๋ฐ๋ฆ ๋๋ค.
1) ํ์ด์ง ํดํธ๊ฐ ๋๋ฉด ์ปค๋์ดไปๅ
ฅํด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ๋ ค์ฃผ๊ธฐ
2) ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ์ฌ์ฉ (DB๋ mmap์ ์จ์ ํ์ผ ๋งคํํจ)
3) ์ค์ผ์ค๋ง ๋์ (CPU ์๊ฐ ๋ถ๋ฐฐ๋ฐ์์ผ ํจ)
4) I/O ์์ฒญ ์ ์ปค๋์ ํตํด ๋์คํฌ์ ์ ๊ทผ
5) SIGKILL, SIGTERM ๋ฑ ์๊ทธ๋๋ DB์ ์ ์ฉ๋จ
โ ์์ฝํ๋ฉด, DB๋ ์ผ๋ฐ์ ์ธ ๋ฆฌ๋ ์ค ํ๋ก์ธ์ค์ฒ๋ผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ, ํ์ด์ง ํดํธ, TLB ๋ฏธ์ค ๋ฑ ๋ค ๊ฒช๋๋ค๋ ๋ง์ ๋๋ค.
๐ข PostgreSQL์์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์์
1) ์ฌ์ฉ์๊ฐ SELECT * FROM users WHERE id=1
๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆผ
2) PostgreSQL์ด users ํ
์ด๋ธ ํ์ผ์ ์ด๊ณ mmap์ผ๋ก ๋งคํ
3) ๋ง์ฝ ์์ง ๊ทธ ํ์ผ์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฉด?
โ ํ์ด์ง ํดํธ ๋ฐ์!
4) ๋ฆฌ๋
์ค ์ปค๋์ด ํด๋น ํ์ด์ง๋ฅผ ๋์คํฌ์์ ์ฝ์ด์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ
5) ์ดํ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
์ฆ, PostgreSQL์ด ์ง์ ๋์คํฌ์์ ์ฝ๋ ๊ฒ ์๋๋ผ, ์ปค๋์ ํ์ด์ง ํดํธ ํธ๋ค๋ง์ ์์กดํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฒฐ๊ตญ ๋ฆฌ๋ ์ค ํ๋ก์ธ์ค์ด๋ฏ๋ก, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํ์ด์ง ํดํธ, TLB, ์๊ทธ๋ ๋ฑ ๋ฆฌ๋ ์ค ์ปค๋์ ๋ชจ๋ ๋ฉ์ปค๋์ฆ์ ๊ทธ๋๋ก ๋ฐ๋ฆ ๋๋ค.
๐ ๋ง๋ถ์ฌ์ ์ฝ์ผ๋ฉด ์ข์ ๋ด์ฉ