๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ

[๊ณ ์„ฑ๋Šฅ] TLB(Translation Lookaside Buffer)์™€ TLB miss

by ์„œ์•„๋ž‘๐Ÿ˜ƒ 2025. 10. 9.

 

๋“ค์–ด๊ฐ€๋ฉฐ

์˜ค๋Š˜์€ ๊ณ ์„ฑ๋Šฅ ์‹œ๋ฆฌ์ฆˆ ๋‘ ๋ฒˆ์งธ์ธ Translation Lookaside Buffer(TLB)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒ์†Œํ•  ์ˆ˜๋„ ์žˆ๋Š” ์šฉ์–ด์ธ๋ฐ, ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์บ์‹œ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋ ˆ์ž„ ํ• ๋‹น์— ๊ด€ํ•œ ํฌ์ŠคํŒ…์„ ๋ณด๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋ ˆ์ž„ ํ• ๋‹น

ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์™€ ํŽ˜์ด์ง• ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ(Virtual Memory)์™€ ํŽ˜์ด์ง• ๊ธฐ๋ฒ•(Paging) ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์•ž์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์˜ ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ์™€ ์™ธ

ground90.tistory.com

 

TLB(Translation Lookaside Buffer)๋ž€?

TLB๋ž€ CPU๊ฐ€ ๊ฐ€์ƒ์ฃผ์†Œ(virtual address)๋ฅผ ๋ฌผ๋ฆฌ์ฃผ์†Œ(physical address)๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ , ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฐ€์ƒํŽ˜์ด์ง€ → ๋ฌผ๋ฆฌํ”„๋ ˆ์ž„ ๋งคํ•‘์„ ์บ์‹œํ•ด ๋‘” ํŠน์ˆ˜ํ•œ ์บ์‹œ์ž…๋‹ˆ๋‹ค. ์ฃผ์†Œ ๋ณ€ํ™˜์— ๋“œ๋Š” ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต L1-TLB (์ž‘๊ณ  ๋น ๋ฆ„)์™€ L2-TLB (ํฌ๊ณ  ๋А๋ฆผ) ๊ณ„์ธต์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. I-TLB(์ฝ”๋“œ์šฉ) / D-TLB(๋ฐ์ดํ„ฐ์šฉ)๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

CPU๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ๋•Œ์˜ ํ๋ฆ„

  1. CPU๊ฐ€ ๊ฐ€์ƒ์ฃผ์†Œ๋กœ ๋กœ๋“œ/์Šคํ† ์–ด/์‹คํ–‰ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.
  2. TLB๋ฅผ ๋จผ์ € ์กฐํšŒ — TLB hit์ด๋ฉด ์ฆ‰์‹œ ๋ฌผ๋ฆฌ์ฃผ์†Œ๋กœ ์ ‘๊ทผ(very fast).
  3. TLB miss์ด๋ฉด ํ•˜๋“œ์›จ์–ด(๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด)๊ฐ€ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์›Œํฌ(page walk) ํ•˜์—ฌ ๋งคํ•‘์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
    • ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์—์„œ ๋งคํ•‘์ด ์žˆ์œผ๋ฉด TLB์— ํ•ญ๋ชฉ์„ ๋„ฃ๊ณ (access), ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (soft TLB miss)
    • ๋งคํ•‘์ด ์—†์œผ๋ฉด ํŽ˜์ด์ง€ ํดํŠธ(page fault) → ์ปค๋„์ด ์ฒ˜๋ฆฌ(major/minor page fault).
  4. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์›Œํฌ ์ž์ฒด๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„(๋‹ค๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”)์™€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ์ˆ˜๋ฐฑ ์‚ฌ์ดํด์˜ ๋น„์šฉ์ด ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜: https://velog.io/@junttang/OS-2.5-MV-5-Memory-Paging-1

 

TLB miss์˜ ๋น„์šฉ

  1. soft miss (TLB miss but page present)
    • ํ•˜๋“œ์›จ์–ด ํŽ˜์ด์ง€ ์›Œ์ปค๊ฐ€ ๋‹ค๋‹จ๊ณ„ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด ๋งคํ•‘์„ ์ฐพ์•„ TLB์— ์ฑ„์›๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ์‚ฌ์ดํด ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค(๊ตฌ์ฒด๊ฐ’์€ CPU/์บ์‹œ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค).
  2. hard miss / page fault (page not present)
    • ์ปค๋„์ด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ(๋””์Šคํฌ/ํŽ˜์ด์ง€ ์Šค์™‘)ํ•˜๋ฉด ๋ฐ€๋ฆฌ์ดˆ ~ ์ˆ˜์‹ญ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ํฐ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.(๋””์Šคํฌ I/O).
    • ์žฆ์€ ํŽ˜์ด์ง€ ํดํŠธ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ€์ƒํ™” ํ™˜๊ฒฝ์€ nested page walk๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋น„์šฉ์ด ๋” ํฝ๋‹ˆ๋‹ค.(๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ).

๊ฒฐ๋ก : TLB miss๋Š” ๋Œ€์ฒด๋กœ ์บ์‹œ ๋ฏธ์Šค๋ณด๋‹ค ๋” ๋น„์‹ผ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ , ์‹ฌํ•˜๋ฉด ์ „์ฒด ์‘๋‹ต ์‹œ๊ฐ„/์ง€์—ฐ์„ ๋ง๊ฐ€ํŠธ๋ฆฝ๋‹ˆ๋‹ค.

 

 

TLB Reach ๊ทน๋Œ€ํ™” ์ „๋žต

1. Hugepage ์‚ฌ์šฉ

TLB์— ๋” ํฐ ํŽ˜์ด์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” /dev/hugepages ๋ผ๋Š” ๊ณต๊ฐ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Hugepage๋ฅผ ํ™œ์šฉํ•˜๋ฉด TLB๊ฐ€ ์ปค๋ฒ„ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ์ฆ๊ฐ€ํ•˜์—ฌ TLB ๋ฏธ์Šค ํšŸ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ํฌ๊ธฐ: 4KB
  • Huge Page ํฌ๊ธฐ: 2MB ๋˜๋Š” 1GB
  • ํšจ๊ณผ: TLB ์—”ํŠธ๋ฆฌ ํ•˜๋‚˜๊ฐ€ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„(TLB reach)์ด ์ปค์ง → TLB miss์œจ ๊ฐ์†Œ
  • ์˜ˆ์‹œ ๊ณ„์‚ฐ
    • 64-entry TLB × 4KB = 256KB reach
    • 64-entry TLB × 2MB = 128MB reach → 512๋ฐฐ ์ฆ๊ฐ€

๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ hugepages๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

# ํ˜„์žฌ Hugepage ์„ค์ • ํ™•์ธ
cat /proc/meminfo | grep Huge

# hugepage ํ™œ์„ฑํ™”
sudo sysctl -w vm.nr_hugepages=512

# C++ ์˜ˆ์‹œ
void* ptr = mmap(NULL, 2*1024*1024, PROT_READ|PROT_WRITE,
                 MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);

 

 

2. ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด ์ตœ์ ํ™”(Locality ๊ฐ•ํ™”)

์บ์‹œ ์ง€์—ญ์„ฑ ๊ฐ•ํ™” ์ฑ•ํ„ฐ์—์„œ๋„ ๋‹ค๋ค˜๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ์—ฐ์†์  ์ ‘๊ทผ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

// BAD: ๋žœ๋ค ์ ‘๊ทผ → TLB miss ์ฆ๊ฐ€
for (int i : random_indices)
    sum += arr[i];

// GOOD: ์—ฐ์† ์ ‘๊ทผ → TLB hit ์œ ์ง€
for (int i = 0; i < N; ++i)
    sum += arr[i];

 

3. ํŽ˜์ด์ง€ ์ •๋ ฌ ๋ฐ SoA(Structure of Arrays) ์‚ฌ์šฉ

์ด ์—ญ์‹œ๋„ ์บ์‹œ ์ง€์—ญ์„ฑ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. alignas(64)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ ๋ผ์ธ๊ณผ page ๊ฒฝ๊ณ„์— ๋งž์ถฅ๋‹ˆ๋‹ค. ์ด๋Š” false sharing ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ cross-page access๋กœ ์ธํ•œ TLB miss๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  SoA๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ํŽ˜์ด์ง€ ์ ‘๊ทผ์„ ์ค„์ž…๋‹ˆ๋‹ค.

// BAD
struct Particle { 
	double x, y, z; 
};
std::vector<Particle> p; // AoS

// GOOD
std::vector<double> x, y, z; // SoA

 

4. NUMA(Locality-aware Allocation) ์‹œ์Šคํ…œ

NUMA๋Š” Non-Uniformed Memory Access(๋ถˆ๊ท ์ผ ๊ธฐ์–ต์žฅ์น˜ ์ ‘๊ทผ)์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. CPU ์†Œ์ผ“์ด ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ๋ฐ์Šคํฌํƒ‘์ด ์•„๋‹ˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐœ์˜ CPU ์†Œ์ผ“์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ํšจ๊ณผ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ณ„ ์ง€์—ญ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. NUMA์— ๊ด€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ๋”ฐ๋กœ ์ž์„ธํžˆ ํฌ์ŠคํŒ…์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://bluemoon-1st.tistory.com/85

์•„๋ž˜ ๋ช…๋ น์–ด๋Š” NUMA์ •์ฑ…์„ ์ปจํŠธ๋กคํ•˜๋Š” ๋ช…๋ น์–ด๋กœ์จ, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ง€์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ๋‚ด ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

numactl --cpunodebind=0 --membind=0 ./app

 

 

๋งˆ์น˜๋ฉฐ

์šฐ๋ฆฌ๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๋ฐ˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋น„์šฉ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. TLB๋Š” ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์— TLB๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ์„ธ์Šค ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€