์ถ์ฒ: ๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋ฆฌ๋ ์ค ๊ตฌ์กฐ


๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ ๋ณด ์์งํ๊ธฐ
free
: ์์คํ
์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋๊ณผ ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋ ํ์ธ



used
= ํ๋ก์ธ์ค ์ฌ์ฉ ๋ฉ๋ชจ๋ฆฌ + ์ปค๋ ์ฌ์ฉ ๋ฉ๋ชจ๋ฆฌ
used ๊ฐ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐ๋ผ ๋์ด๋๋ค.
memuse.py
#!/usr/bin/python3 import subprocess # ์ ๋นํ ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉ # ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์์ ์์คํ ์ด๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก # size๊ฐ์ ์ค์ฌ์ ๋ค์ ์คํ size = 10000000 print("๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ ์ ์ ์ฒด ์์คํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค.") subprocess.run("free") array = [0]*size print("๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํ์ ์ ์ฒด ์์คํ ๋ฉ๋ชจ๋ฆฌ ๋จ์ ์ฉ๋์ ํ์ํฉ๋๋ค.") subprocess.run("free")

- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด used ๊ฐ์ด ๋์ด๋ ๊ฑธ ํ์ธํ ์ ์๊ณ
- memuse.py ์คํ ์งํ์ free ์คํ ์ used๊ฐ์ด ์ด์ ๊ณผ ๊ฑฐ์ ๊ฐ์์ ํ์ธํ ์ ์์
โ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃํ๋ฉด ์ปค๋์ ํด๋น ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ ํด์ ํจ.
buff/cache
= ํ์ด์ง ์บ์์ ๋ฒํผ ์บ์๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋
โ ๋์คํฌ์ ์๋ ๊ฑธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์ ์ ๊ทผ ์๋ ๋น ๋ฅด๊ฒ
๋์คํฌ์ ์๋ ๋ฐ์ดํฐ ์ฝ์ด์์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์บ์.

buff-cache.sh
#!/bin/bash echo "ํ์ผ ์์ฑ ์ ์ ์์คํ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค." free echo "1GB ํ์ผ์ ์๋ก ์์ฑํฉ๋๋ค. ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ์ 1GB ํ์ด์ง ์บ์ ์์ญ์ ์ฌ์ฉํฉ๋๋ค." dd if=/dev/zero of=testfile bs=1M count=1K echo "ํ์ด์ง ์บ์ ์ฌ์ฉ ํ์ ์์คํ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค." free echo "ํ์ผ ์ญ์ ํ, ์ฆ ํ์ด์ง ์บ์ ์ญ์ ํ์ ์์คํ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ํฉ๋๋ค." rm testfile free

ํ์ผ ์์ฑ ์ ํ๋ก buff/cache
๊ฐ์ด ์ฝ 1GiB ์ ๋ ๋์ด๋ฌ๊ณ , ํ์ผ์ ์ญ์ ํ๋ ๊ฐ์ด ์๋๋๋ก ๋์์ด
sar ๋ช ๋ น์ด๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ ๋ณด ์์งํ๊ธฐ
sar -r 1 5
: 5์ด๋์ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.


sar
์ free
์ ๋ค๋ฅด๊ฒ ํ ์ค์ ์ ๋ณด๊ฐ ๋ค ๋ด๊ฒจ์ด์ด์ ๊ณ์ํด์ ์ ๋ณด ์์ง ์ ํธ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ ์ฌํ์ฉ ์ฒ๋ฆฌ
์์คํ ๋ถํ๊ฐ ๋์์ง๋ฉด free ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ด๋ฆ

์ด๋ ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ ์ ์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํด์ ํด์ free ๊ฐ์ ๋๋ฆฐ๋ค.
์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ = ํ์ด์ง ์บ์(๋์ผํ ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํด์ ํด๋ ๊ด์ฐฎ์)

๐ก๊ฒฐ๋ก : free ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ด๋ค๋ฉด ์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ(buff/cache - ๋ฒํผ ์บ์, ํ์ด์ง ์บ์)์ ํด์ ํด์ free ๊ฐ์ ๋๋ฆฐ๋ค.
ํ๋ก์ธ์ค ์ญ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ํด์
์ฌํ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด Out Of Memory(OOM)
์ํ๊ฐ ๋๋ค.

์ด๋ฐ ์ํฉ์ ๋น ์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ
์ด ์ ๋นํ ํ๋ก์ธ์ค๋ฅผ ๊ณจ๋ผ์ ๊ฐ์ ์ข
๋ฃ์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง๋๋ OOM Killer
๋ผ๋ ๊ธฐ๋ฅ์ด ๋์ํ๋ค.

dmesg
๋ช
๋ น์ด๋ก OOM Killer ๋์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
๐ก์ด๋ค ํ๋ก์ธ์ค๊ฐ ๊ฐ์๊ธฐ ์๊ณ ๋ ์์ด ์ข ๋ฃ๋๋ฉด ํ์ธํด๋ณด๊ธฐ
+) ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ถฉ๋ถํ๋ฐ OOM Killer๊ฐ ๋์ํ๋ค๋ฉด ์ด๋ค ํ๋ก์ธ์ค ๋๋ ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ๋์(memeory leak)๊ฐ ์ผ์ด๋๊ณ ์์์ง๋ ๋ชจ๋ฅธ๋ค.
โ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋๋ ์์ํ ํ๋ก์ธ์ค ์ฐพ๊ธฐ
ps aux ๋ช ๋ น์ด๋ก ๊ฐ๋จํ๊ฒ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ

RSS
: ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ๋ ์๊ธฐ๋ ๋ฌธ์ ์
- ๋ฉ๋ชจ๋ฆฌ ๋จํธํ
- ๋ฉํฐ ํ๋ก์ธ์ค ๊ตฌํ์ด ์ด๋ ค์
- ๋น์ ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
๋ฉ๋ชจ๋ฆฌ ๋จํธํ

์ ๊ทธ๋ฆผ์์ ๋น์ด์๋ ๋ฉ๋ชจ๋ฆฌ๋ ํฉ์น๋ฉด 300๋ฐ์ดํธ์ด์ง๋ง ๊ฐ์ ๋ฐ๋ก๋ฐ๋ก 100๋ฐ์ดํธ์ฉ 3๊ฐ์ ์์ญ์ผ๋ก ๋๋ ์ ธ์๊ธฐ ๋๋ฌธ์ 100๋ฐ์ดํธ๋ณด๋ค ํฐ ์์ญ์ ํ๋ณดํ๋ ค๋ฉด ์คํจํ๋ค.

๋ฉํฐ ํ๋ก์ธ์ค ๊ตฌํ์ด ์ด๋ ค์

์ด๋ค ํ๋ก๊ทธ๋จ A์ B๊ฐ ์๊ณ ๊ฐ๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋งคํ๋๋๋ก ๋ง๋ค์๋ค๋ฉด A์ B๋ ๋์์ ์คํ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋น์ ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
์ด๋ค ํ๋ก์ธ์ค๊ฐ ์ปค๋์ด๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด ์์ ์ด ์ฌ์ฉํ๋ ์์ญ์ด ์๋์๋ ๋ถ๊ตฌํ๊ณ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๊น

๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
: ์์คํ
์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๋ ๋์ ์ ๊ฐ์ ์ฃผ์
๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ธฐ๋ฅ
๋ฌผ๋ฆฌ ์ฃผ์
: ์์คํ
์ ์ค์น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ ์ฃผ์

ํ๋ก์ธ์ค๊ฐ ์ฃผ์ 100์ ์ ๊ทผํ๋ฉด, ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์์๋ ์ฃผ์ 600์ ์กด์ฌํ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค.

2์ฅ์ ๋์จ readlf
(-h ํ๋ก๊ทธ๋จ ์์ ์ฃผ์ ํ์ธ) cat /proc/<pid>/maps
์ ๋์ค๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ ์ฃผ์๋ค. ํ๋ก์ธ์ค์์ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ(๋ฌผ๋ฆฌ ์ฃผ์)์ ์์.
ํ์ด์ง ํ ์ด๋ธ
ํ์ด์ง ํ
์ด๋ธ
: ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํ๋๋ฐ ์ฌ์ฉํ๋ค. ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์ ์ ์ฅ๋์ด์์.
CPU๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ด์ง ๋จ์๋ก ์ชผ๊ฐ์ ๊ด๋ฆฌํ๋๋ฐ ์ฃผ์๋ ํ์ด์ง ๋จ์๋ก ๋ณํ๋๋ค.
x86_64 ์ํคํ ์ฒ์์ ํ์ด์ง ํฌ๊ธฐ๋ 4KiB๋ค.
๐ก์ฑ ์์๋ ์ค๋ช ํ๊ธฐ ํธํ๋๋ก ํ์ด์ง ํฌ๊ธฐ๋ฅผ 100๋ฐ์ดํธ๋ก ์ ํจ.
ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ
: ํ์ด์ง ํ
์ด๋ธ์์ ํ ํ์ด์ง์ ๋์ํ๋ ๋ฐ์ดํฐ
โ ๊ฐ์ฅ ์ฃผ์์ ๋ฌผ๋ฆฌ ์ฃผ์ ๋์ ์ ๋ณด ํฌํจ


๊ฐ์ ์ฃผ์ 0~300์ด ๋ฌผ๋ฆฌ ์ฃผ์ 500~800์ ๋งคํ๋ ๋ชจ์ต
ํ์ด์ง ํ ์ด๋ธ์ ์ปค๋์ด ์์ฑํจ.
2์ฅ์์ ์ปค๋์ ํ๋ก์ธ์ค ์์ฑ ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณด(fork()
)ํ๊ณ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ํ์ผ ๋ด์ฉ์ ๋ณต์ฌ(execve()
)ํ๋ค๊ณ ํ๋๋ฐ ์ด๋ ๋์์ ํ๋ก์ธ์ค์ฉ ํ์ด์ง ํ
์ด๋ธ๋ ์์ฑํ๋ค.
ํ์ง๋ง ํ๋ก์ธ์ค๊ฐ ๊ฐ์ฅ ์ฃผ์์ ์ ๊ทผํ ๋ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํ๋ ๊ฑด CPU๊ฐ ํ๋ ์์ ์ด๋ค.

์ฃผ์ 300~500์ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ฉด CPU์์ ํ์ด์ง ํดํธ
๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
ํ์ด์ง ํดํธ ๋ฐ์ ์ ํ์ด์ง ํดํธ ํธ๋ค๋ฌ
์ฒ๋ฆฌ๊ฐ ์คํ๋๋ค.

๊ทธ ์ดํ์ SIGSEGV ์๊ทธ๋์ ํ๋ก์ธ์ค์ ์ก์ ํ๋ค. SIGSEGV ์๊ทธ๋์ ๋ฐ์ ํ๋ก์ธ์ค๋ ๋ณดํต ๊ฐ์ ์ข ๋ฃ๋๋ค.
package main
import "fmt"
func main() {
// nil์ ๋ฐ๋์ ์ ๊ทผ์ ์คํจํด์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ ํน์ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
var p *int = nil
fmt.Println("๋น์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ")
*p = 0
fmt.Println("๋น์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ")
}

๋น์ ์์ ์ธ ์ฃผ์์ ์ ๊ทผํ ์งํ์ SIGSEGV ์๊ทธ๋์ ์์ ํ๋๋ฐ ์ด ์๊ทธ๋์ ๋์ฒํ์ง ๋ชปํด์ ์ข ๋ฃ๋ ๊ฒ์ ์ ์ ์๋ค.
C์ธ์ด๋ Go ์ธ์ด์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ๋ค๋ฃจ๋ ์ธ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด SIGSEGV ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข ๋ฃ๋๋ ์ผ์ด ์ข ์ข ๋ฐ์ํ๋ค.(ํ์ด์ฌ์ ๋ฐ์ ์ํจ. ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ ์ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ.)
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
๋ฉ๋ชจ๋ฆฌ ๋จํธํ


๋ฉํฐ ํ๋ก์ธ์ค ๊ตฌํ์ด ์ด๋ ค์
๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ํ๋ก์ธ์ค๋ง๋ค ๋ง๋ค์ด์ง๋ค. ๋ฐ๋ผ์ ๋ฉํฐํ๋ก์ธ์ค ํ๊ฒฝ์์ ๊ฐ์์ ํ๋ก๊ทธ
๋จ์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๊ณผ ์ฃผ์๊ฐ ์ค๋ณต๋๋ ๊ฑธ ํผํ ์ ์๋ค.

๋น์ ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
ํ๋ก์ธ์ค๋ง๋ค ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ด ์๋ค๋ ๋ง์ ์ ์ด์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋์ด์๋์ง ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๊ทผํ ์ ์๋ค๋ ๋ป์ด๋ค.
โ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋น์ ์์ ์ธ ์ ๊ทผ ๋ถ๊ฐ๋ฅ

ํ๋ก์ธ์ค์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๊ธฐ
<์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋ ์ปค๋์ด ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ์ ์ฐจ>
- ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ
- ์ปค๋์ด ๋ฉ๋ชจ๋ฆฌ ํ๋ณด
- ๊ฐ์์ฃผ์ ๊ณต๊ฐ์ ๋งคํ
- ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์์ ์์น ์ฃผ์๋ฅผ ํ๋ก์ธ์ค์๊ฒ ๋๋ ค์ค๋ค.
ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ ์๊ฐ ๋ฐ๋ก ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ์กฐ๊ธ ์ง๋ ํ์ ์ฌ์ฉํ๋ ์ผ์ด ๋ง์์ ๋ฆฌ๋ ์ค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ์ ์ฐจ๋ฅผ ๋ ๋จ๊ณ๋ก ๋๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ ๋น : ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์๋กญ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋งคํํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น : ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ญ ํ ๋น: mmap() ์์คํ ์ฝ
mmap() ์์คํ ์ฝ ํธ์ถ ์
- ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ ๋ณ๊ฒฝ
- ์์ฒญ๋ ํฌ๊ธฐ๋งํผ ์์ญ์ ํ์ด์ง ํ ์ด๋ธ์ ์ถ๊ฐ๋ก ๋งคํ
- ๋งคํ๋ ์์ญ์ ์์ ์ฃผ์๋ฅผ ํ๋ก์ธ์ค์ ๋๋ ค์ค๋ค.

Meltdown ์ทจ์ฝ์ ์ ๊ณตํฌ p.128
2018๋ ์ด์ ๊น์ง ๋ฆฌ๋ ์ค๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก์ธ์ค ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๋งคํํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด์์ง๋ง ์ด์ ๋ ์ทจ์ฝ์ ๋๋ฌธ์ ๋์ด์ ๋งคํ๋์ง ์๋๋ก ๊ธฐ๋ณธ๊ฐ์ด ๋ฐ๋์๋ค.
๋ฉ๋ชจ๋ฆฌ ํ ๋น: Demand paging
: ์ค์ ๋ก ์ฌ์ฉ ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
mmap() ์์คํ ์ฝ์ ํธ์ถํ ์งํ๋ผ๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋์ํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ์กด์ฌํ์ง ์๋๋ค.
๋์ ๊ฐ ํ์ด์ง์ ์ฒ์ ์ ๊ทผํ ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.(๋ฐ๋ก ํ ๋นX, ํ์์ ํ ๋นO : ์ง์ฐ๋ก๋ฉ)

ํ์ด์ง์ ์ ๊ทผ ์ ์๋์ ๊ฐ์ ์ ์ฐจ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
- ํ๋ก์ธ์ค๊ฐ ํ์ด์ง์ ์ ๊ทผ
- ํ์ด์ง ํดํธ๊ฐ ๋ฐ์
- ์ปค๋์ ํ์ด์ง ํดํธ ํธ๋ค๋ฌ๊ฐ ๋์ํด์ ํ์ด์ง์ ๋์ํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น

๋ฉ๋ชจ๋ฆฌ ๋จ์ : ํ์ด์ง
Page In : ๋์คํฌ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ ์ฝ์ด์ค๋ ๊ฒ
Page Out : ๋ฉ๋ชจ๋ฆฌ์์ ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๊ฒ
ํ์ด์ง ํดํธ ํธ๋ค๋ฌ๋
- ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์๋ ํ์ด์ง ์ ๊ทผ โ ํ๋ก์ธ์ค์ SIGSEGV ๋ณด๋.
- ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๋ ์กด์ฌํด๋ ๋์ํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ก๋ฆฌ๊ฐ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ โ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ์ฒ๋ฆฌ๋ก ๋ถ๊ธฐ.
demand-paging.py
#!/usr/bin/python3 import mmap import time import datetime ALLOC_SIZE = 100 * 1024 * 1024 ACCESS_UNIT = 10 * 1024 * 1024 PAGE_SIZE = 4096 def show_message(msg): print("{}: {}".format(datetime.datetime.now().strftime("%H:%M:%S"), msg)) show_message("์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ๋ณด ์ . ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด 100๋ฉ๊ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํฉ๋๋ค: ") input() # mmap() ์์คํ ์ฝ ํธ์ถ๋ก 100MiB ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ๋ณด memregion = mmap.mmap(-1, ALLOC_SIZE, flags=mmap.MAP_PRIVATE) show_message("์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํ์ต๋๋ค. ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด 1์ด๋น 1MiB์ฉ, ํฉ๊ณ 100MiB ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํฉ๋๋ค: ") input() for i in range(0, ALLOC_SIZE, PAGE_SIZE): memregion[i] = 0 if i%ACCESS_UNIT == 0 and i != 0: show_message("{} MiB ์งํ์ค".format(i//(1024*1024))) time.sleep(1) show_message("์๋กญ๊ฒ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ชจ๋ ์ ๊ทผํ์ต๋๋ค. ์ํฐ ํค๋ฅผ ๋๋ฅด๋ฉด ์ข ๋ฃํฉ๋๋ค: ") input()

์์คํ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ณํ๋ฅผ ํ์ธํ๊ธฐ


์์คํ ์ ์ฒด ํ์ด์ง ํดํธ ๋ฐ์ ์ํฉ์ ํ์ธํ๊ธฐ
sar -B
: ์์คํ
์ ์ฒด์ ํ์ด์ง ํดํธ ๋ฐ์ ํ์๋ฅผ ํ์ธํ ์ ์๋ค.
์์ ์์ ํ๋ก๊ทธ๋จ์ด ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ์ ๋๋ง ์ด๋น ํ์ด์ง ํดํธ ํ์๋ฅผ ๋ปํ๋ fault/s
ํ๋๊ฐ ๋์ด๋๋ ๊ฑธ ์ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฒ์ญ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ์ ์ํ ๋๋ง๋ค mmap() ํธ์ถ ใดใด
ํ๋ก๊ทธ๋ ์์ ์ mmap() ์์คํ ์ฝํด์ ์ด๋ ์ ๋ ํฌ๊ธฐ์ ์์ญ์ ๋ฏธ๋ฆฌ ํ๋ณดํ๋ค.

ํ์ด์ง ํ ์ด๋ธ ๊ณ์ธตํ
ํ๋ก์ธ์ค๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 400๋ฐ์ดํธ๋ง ์ฌ์ฉํ๋ค๋ฉด ํํํ ํ์ด์ง ํ ์ด๋ธ์ ์๋์ฒ๋ผ ๋๋ค.

์ด์ ๋นํด ๊ณ์ธตํ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค๋ฉด, 4ํ์ด์ง๊ฐ ํ ๋จ์์ธ 2๋จ ๊ตฌ์กฐ๋ก ๋ง๋ค ์ ์๋ค.
์ด๋ ๊ฒํ๋ฉด ํ์ด์ง ํ ์ด๋ธ ์ ์ฒด ์ํธ๋ฆฌ ๊ฐ์๊ฐ 16๊ฐ์์ 8๊ฐ๋ก ์ค์ด๋ ๋ค. ๋ง์ฝ ์ฌ์ฉํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์ปค์ง๋ค๋ฉด ํ์ด์ง ํ ์ด๋ธ ์ฌ์ฉ๋์ด ๋์ด๋๋ค.
๋ชจ๋ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ์ ํ์ํ ํฉ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ํํํ ํ์ด์ง ํ ์ด๋ธ๋ณด๋ค ๊ณ์ธตํ ํ์ด์ง ํ ์ด๋ธ ์ชฝ์ด ์์ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.
x86_64 ์ํคํ ์ฒ๋ผ๋ฉด 4๋จ ๊ตฌ์กฐ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค. ๊ณ์ธตํ ํ์ด์ง ํ ์ด๋ธ์ ํตํด ํ์ด์ง ํ ์ด๋ธ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ํฌ๊ฒ ์ค์ธ๋ค.
sar -r ALL
: kbpgtbl ํ๋์์ ํ์ด์ง ํ
์ด๋ธ์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ํ์ธ ๊ฐ๋ฅ
Huge Page
1ํ์ด์ง๋น ํฌ๊ธฐ๊ฐ 400๋ฐ์ดํธ์ธ Huge Page๋ก ๋ณ๊ฒฝ


ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ ๊ฐ์๊ฐ 20๊ฐ์์ 4๊ฐ๋ก ์ค์. ์ด๋ ๊ฒ ํ๋ฉด ํ์ด์ง ํ ์ด๋ธ์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ ์ค์ด๋ ๋ค.
๊ฒ๋ค๊ฐ fork() ํจ์์์ ํ์ด์ง ํ ์ด๋ธ์ ๋ณต์ฌํ๋ ๋น์ฉ๋ ์ค์ด์ fork() ํจ์ ์ฒ๋ฆฌ๊ฐ ๋นจ๋ผ์ง๋ ํจ๊ณผ๋ ๊ธฐ๋ํ ์ ์๋ค.
๐กDB๋ ๊ฐ์ ๋จธ์ ๋งค๋์ ์ฒ๋ผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋์ผ๋ก ์ฌ์ฉํ๋ SW๋ผ๋ฉด Huge Page๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์
+) mmap() ํจ์์ flags ์ธ์์ MAP_HUGETL ํ๋๊ทธ ์ง์ ์ ์ฌ์ฉ ๊ฐ๋ฅ
Transparent Huge Page(THP)
๋ฉ๋ชจ๋ฆฌ ํ๋ณด์ ์ผ์ผ์ด Huge Page๊ฐ ํ์ํ๋ค๊ณ ์์ฒญํด์ผ ํ๋ฏ๋ก ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์๋ ๋ฒ๊ฑฐ๋กญ๋ค.
โ ๋ฆฌ๋ ์ค์ THP ๊ธฐ๋ฅ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
THP๋ ์ฐ์๋ ์ฌ๋ฌ 4KB ํ์ด์ง๊ฐ ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๊ทธ๊ฑธ ํ๋๋ก ๋ฌถ์ด์ ์๋์ผ๋ก Huge Page๋ก ๋ฐ๊พผ๋ค.
๋จ์ : ์ฌ๋ฌ ํ์ด์ง๋ฅผ ํฉ์ณ์ ํ๋์ Huge Page๋ก ๋ง๋๋ ๋ฐ ๋ค์ด๊ฐ๋ ๋น์ฉ, ๊ทธ๋ฆฌ๊ณ Huge Page๋ฅผ ๊ตฌ์ฑํ๋ ์กฐ๊ฑด์ด ์ฑ๋ฆฝํ์ง ์๊ฒ๋๋ฉด ์ปค๋ค๋ ํ์ด์ง๋ฅผ 4KB ํ์ด์ง๋ก ๋ค์ ๋ถํ ํ๋ ์ฒ๋ฆฌ ๋๋ฌธ์ ๋ถ๋ถ์ ์ผ๋ก ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
โ ๊ด๋ฆฌ์๊ฐ ์ ํ์ ์ผ๋ก ๊ฒฐ์ .
Uploaded by N2T