[Concurrency] NUMA (Non-Uniformed Memory Access)
NUMA๋ ํ์ฌ ์ปดํจํฐ ๊ตฌ์กฐ, ํนํ ๋ฉํฐ์ฝ์ด์ ์์ด์ ํต์ฌ์ ์ธ ๊ตฌ์ฑ ๋ ผ๋ฆฌ ์ค ํ๋๋ค.
CPU <> RAM ๊ฐ์ ๋ฉํฐ์ฝ์ด ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ๊ณ ์๋ ํ๋์จ์ด ์คํ & ์ํํธ์จ์ด ๊ณ์ธต์ด๋ผ๊ณ ํ ์ ์๋ค.
์๋ฒ๊ธ ์ด๊ณ ์ฑ๋ฅ ์ฅ๋น์์ ์ต์ ํ๋ฅผ ํ ๊ฒฝ์ฐ์๋ NUMA๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋์ ๊ทน๋ํํ๋ ๊ฒ์ด ์์ฆ์๋ ๋งค์ฐ ๋น์ฐํ๋ค.
๋ฐ๋ผ์ ๋๊ท๋ชจ ๋ณ๋ ฌ ์ํฌ๋ก๋๋ฅผ ๋๋ฆด ํ์๊ฐ ์๊ฑฐ๋, ๊ณ ์ฑ๋ฅ ์ธํ๋ผ ๊ด๋ฆฌ๋ฅผ ํ ์ผ์ด ์๋ค๋ฉด ์์๋ฌ์ผ ํ๋ ๋ด์ฉ์ด๋ค.
UMA (Uniformed Memory Access)
์๋๋ ๊ตฌ์กฐ๊ฐ ๋จ์ํ๋ค. ๊ทธ๋ฅ CPU์ RAM์ด ๋ฒ์ค๋ฅผ ํตํด ์งํต์ผ๋ก ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ์๊ณ , ์ด๋ฅผ UMA๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด ๋ฐฉ์์ ๋จ์ ์, ์ฝ์ด๊ฐ ๋์ด๋ ์๋ก ๋ณ๋ชฉ์ด ์ฌํด์ง๋ค๋ ๊ฒ์ด๋ค.
์ฌ๋ฌ ์ฝ์ด๊ฐ ๋จ์ผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒ์ค๋ฅผ ํตํด ์ก์ธ์คํ๊ธฐ ๋๋ฌธ์, ๋จ์ผ ๋ณ๋ชฉ์ง์ ์ด ์กด์ฌํ๊ณ , ์ฝ์ด๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ์ ๋ถํ๊ฐ ์ปค์ง๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ํํ๊ณ , ๋ ๋์ ์ฑ๋ฅ์ ์ํด์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ถํ ํ๊ณ ์ฝ์ด๋ง๋ค ๊ฑฐ์ ๋ ๋ฆฝ์ ์ธ ์ฑ๋ฅ์ ๊ฐ์ ธ๊ฐ์ ์๋๋ก ํด์ฃผ๋ ๊ฒ์ด NUMA๋ค.
๋ค๋ง NUMA๊ฐ ๋์๋ค๊ณ ํด์ ๊ธฐ์กด์ UMA ๋ฐฉ์์ด ๋ฒ๋ ค์ง๊ฑฐ๋ ํ ๊ฒ์ ์๋๋ค. ๋๋ถ๋ถ์ ์ผ๋ฐ๊ธ ์ฅ๋น๋ค์ UMA๋ฅผ ์ฐ๊ณ , ๋ณดํต์ ๊ทธ๊ฒ ๋ ํจ์จ์ ์ด๋ค.
NUMA (Non-Uniformed Memory Access)
NUMA๋ RAM์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถํ ํ๊ณ CPU์ ์์ผ(NUMA NODE)๋ง๋ค RAM ์์ญ์ ํ ๋นํ๋ ๊ธฐ๋ฒ์ด๋ค.
RAM ์์ฒด์ ์์ํ ํ๋์จ์ด ๋ณ๋ชฉ์ ์ด์ฉ ์ ์์ง๋ง, ์ฌ๋ฌ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฑ๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์์ํ ๋์ญํญ ํฅ์์ด ํฌ๊ฒ ์ผ์ด๋๋ค. ์ด๊ฒ๋ง ํด๋ ๊ฝค ๊ฐ๋ ฅํ๋ค.
๊ฒ๋ค๊ฐ CPU๊ฐ ๋ ์ข์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋์ผํ๊ฒ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์บ์ ํํธ ํ๋ฅ ๋ ๋ ์ฆ๊ฐํ๋ค๋ ๋ถ์์ ์ธ ์ฅ์ ์ด ์๋ค.
AMD๊ฐ 2003๋ ์ ์ฒ์ ์๋ํ๊ณ , Intel์ 2007-8๋ ์ฏค์ ์์ํ๋ค. ์๋ฏธ์๋ ๋์ ์ด ์์๋ ๊ฒ์ ์ธํ Nehalem ์ํคํ ์ณ ์ ์จ์ NUMA๊ฐ ๋ค์ด๊ฐ๊ณ ๋ถํฐ๋ค.
NUMA์ ๋จ์ ๊ณผ ํ๊ณ
ํ์ง๋ง ์ด๊ฒ ํญ์ ํจ์จ์ ์ธ ๊ฒ์ ์๋๋ค.
NUMA์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณ๋ ฌํ๊ฐ ์ด์์ ์ผ๋ก ๋์ด์๋ค๋ ๊ฐ์ ํ์ ์์ฑ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋๊น ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ํ์ง ์๊ฑฐ๋, NUMA ๋
ธ๋์ ์ํ ์ฝ์ด๋ผ๋ฆฌ๋ง ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ํ๋ ๊ฒฝ์ฐ๋ค.
์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ณ์ ์ฌ์ฉํ๊ฑฐ๋, ๊ฑฐ๋ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ์ ๋๊ณ ์ ๊ทผํ๋ ํจํด์ด ๋น๋ฒํ๋ค๋ฉด ์คํ๋ ค NUMA๋ฅผ ์ฐ๋ ๊ฒ์ด ๋ ๋๋ ค์ง ์ ์๋ค.
๋ง์ฝ ๋ค๋ฅธ NUMA์ ์ฐ๊ฒฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด CPU ๊ฐ ์ธํฐ์ปค๋ฅํธ(๋ค๋ฅธ ๋ง๋ก Remote Memory Access)๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ผ ํ๋๋ฐ, ์ด๊ฒ ์๋นํ ๋๋ฆฌ๊ณ ๋นํจ์จ์ ์ด๋ค.
๋ท๋ง๋ธ์ ์ฌ๋ก: https://netmarble.engineering/single-process-programming-numa-effect/
๋ท๋ง๋ธ ๋ธ๋ก๊ทธ์์ ํผ์จ๊ฑด๋ฐ, ์ด๊ฒ ๋ชจ๋ ์ฝ์ด๊ฐ ๋์ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํด์ ํ์ชฝ NUMA ๊ทธ๋ฃน์๋ง remote access๊ฐ ํญ์ฃผ-๋ฆฌ์์ค๊ฐ ๋ญ๋น๋ ํ์์ด๋ค.
์ฌ์ค ๊ทธ๋์ ์ค๋ ๋ ๊ฐ ๊ณต์ ๊ฐ ๋น๋ฒํ ์ผ๋ฐ์ ์ธ ์์ฉํ๋ก๊ทธ๋จ๋ค์ NUMA์ ์ ๋ง์ง ์๋๋ค.
์ค๋ ๋๋ฆฌํผ๊ฐ ์ฝ์ด๋ฅผ 30-100๊ฐ์ฉ ์ณ๋ฐ๋ ์๋ฒ๊ธ ์ฌ์์ธ๋ฐ๋ ๊ธฐ๋ณธ๊ฐ์ด NUMA OFF์ธ ์ด์ ๊ฐ, ์ผ๋จ ํ๋ฉด์ ์ผ๋ก๋ ๋ชฉ์ ์ด ์์ฉ CPU์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ NUMA๋ฅผ ์์ ๋๊ฑฐ๋, INTERLEAVE ์ต์
๋ฑ์ ํ์ฉํ๋ ํธ์ด ์ข๋ค.
NUMA๊ฐ ํจ๊ณผ์ ์ธ ๊ฒฝ์ฐ
์ผ๋จ ์ฝ์ด๋ฅผ ์ ์ฅ์ด์ง๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์ง์ญ์ ์ธ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ NUMA๊ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด๋ค.
์ด ํจ๊ณผ๋ฅผ ์ ๋ฐ๋ ๊ฒ์ด PostgreSQL ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด๋ค. ๊ทธ๋์ ์ค์ ์ํฌ๋ก๋์์ DB๋ฅผ ํ๋ํ ๋ ๋ค์ด๊ฐ๋ ์ต์ ํ ์๋จ ์ค ํ๋๊ฐ NUMA๋ค.
๊ทธ๋ฆฌ๊ณ MapReduce ๊ฐ์ ๋ํ ๋ถ์ฐ์์คํ
์ด๋ Spark ๊ฐ์ ๋ณ๋ ฌ ์ํฌ๋ก๋์๋ ํจ๊ณผ๊ฐ ์๋ค.
์ด์ธ์๋ ๊ฐ์ํ๋ฅผ ํตํด ํ๋ก์ธ์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ถํ ํ๋ VM ์๋น์ค๋, k8s ๋ฑ๋ ๊ฝค ์ ๋ง๋๋ค๊ณ ํ ์ ์๋ค.
NUMA ์ํ ํ์ธํ๊ธฐ (LINUX)
lscpu๋ฅผ ํตํด CPU ์ ๋ณด์ ํจ๊ป NUMA ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค.
๋๊ฐ๋ OS์์ NUMA์ ๊ด๋ จ๋ ์ธํ
์ ์์์ ํด์ค๋ค. NUMA๊ฐ ํจ์จ์ ์ธ ํ๋์จ์ด์ ์กฐํฉ์ด๋ผ๋ฉด ๋ณดํต ์์์ NUMA๋ฅผ ์ ์ ํ ๊น์์ค๋ค.
๋ด ๊ฒฝ์ฐ์๋ NUMA Node๊ฐ 1๊ฐ๋ฟ์ธ๋ฐ, ๋ณดํต์ ์ด๊ฒ ์ ์์ด๋ค.
NUMA ์ฌ์ฉ ์กฐ๊ฑด
NUMA๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ , NUMA๊ฐ ์ ์ ๋๊ฒ ํ๋ ค๋ฉด ํฌ๊ฒ 2๊ฐ์ง ์กฐ๊ฑด์ด ํ์ํ๋ค.
- CPU๊ฐ ๋ฉํฐ์์ผ์ ์ง์ํ๊ฑฐ๋ ๋ฉํฐ NUMA ๋ ธ๋๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ
- ๋ฉ์ธ๋ณด๋์ ์ง์ ์ฌ๋ถ (๋ฐ์ด์ค์ค ์ค์ , NUMA ๊ฐ์๋ฅผ ์ํ๋๋๋ก ์กฐ์ ๊ฐ๋ฅ)
์ด 2๊ฐ์ง๊ฐ ์ถฉ์กฑ๋๋ฉด ํด๋น NUMA ๊ตฌ์ฑ์ OS๊ฐ detectํด์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ RAM ์์ฒด์๋ ํ๋์จ์ด ์ ํ์ด ์๋ค.
CPU ์ง์
NUMA๋ฅผ ์ง์ํ๋ CPU ์์ฒด๋ ์๊ฐ๋ณด๋ค ์ ํ์ ์ด๋ค.
2 Socket์ ์ง์ํ๋ ์ธํ
์ ์จ, AMD EPYC, AMD ์ค๋ ๋๋ฆฌํผ ๊ฐ์ ์๋ฒ๊ธ CPU๋ค๋ง์ด multi NUMA๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ ๋๋ฆฌํผ์ ๊ฒฝ์ฐ์๋ NUMA๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋จ์ผ NUMA๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋๊ธฐ๋ ํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฐ์ด์ค์ค์์ ์ค์ ํ ์ ์๋ค.
NUMA ํ๋
๋๊ฐ NUMA๋ฅผ OS๊ฐ ์๋์ผ๋ก ์ก์์ฃผ๊ธด ํ๋๋ฐ, ๊ธฐ๋ณธ ์ต์ ๋ง์ผ๋ก๋ ๋ถ์ถฉ๋ถํ ์๋ ์๋ค.
๊ทธ๋์ NUMA ์ต์ ํ๋
- ์ค์ NUMA ์ค์ ์ ๋ฐ๊พธ๋ ๊ฒ (OS๋ ๋ฐ์ด์ค์ค)
- ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ NUMA๋ฅผ ๊ณ ๋ คํด์ ์์ฑํ๋ ๊ฒ
ํฌ๊ฒ 2๊ฐ์ง ์ ๋๋ก ๋ถ๊ธฐ๋๋ค.
์ด๊ฑด ์ ๋๋ก ๋ค๋ฃจ๋ ค๋ฉด ์ง๋ฉด์ด ํ์์ด ๊ธธ์ด์ง๊ธฐ์, ์์ฃผ ์ฌ์ฉํ๋ ๋ช๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฐฉํฅ์ฑ๋ง ์ ๋๋ค.
1. NUMA Node INTERLEAVING
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ๋ฌ๊ฐ์ NUMA์ ๋ถ์ฐ์ํค๋ ๊ธฐ๋ฒ์ด๋ค. ์ด๋ฌ๋ฉด ์ค๋ ๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ๋น๋ฒํ ์ฌ์ฉ ํจํด์ ํํด์ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค. ๋์ ์ฑ๊ธ์ค๋ ๋์ ํ๊ท ์ฑ๋ฅ์ ์ข ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
2. CPU or Memory ๊ณ ์
OS์์ ์ ๊ณตํ๋ ์ ์ฉ ๋๊ตฌ(numactl ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ํ๋ก์ธ์ค๊ฐ ํน์ NUMA๋ง ์ฌ์ฉํ๋๋ก ๊ณ ์ ํ ์ ์๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ Remote Access๋ฅผ ์ต์ํํด์ ์ ์๋ฏธํ ์ต์ ํ๊ฐ ๋ ์ ์๋ค.
์ฌ๊ธฐ์ ํน์ NUMA์ CPU์ ๊ณ ์ ํ๋ ๊ฒ์ CPU Affinity, ํน์ NUMA์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ ์ ํ๋ ๊ฒ์ Memory Binding๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฅผ ๋ค๋ฉด, postgres ์๋ฒ๋ฅผ ํน์ NUMA์์๋ง ์คํ๋๊ฒ ํ๋ ค๋ฉด ์ด๋ ๊ฒ ํ ์ ์๋ค.
# 0๋ฒ NUMA๋ก ๊ณ ์
numactl --cpunodebind=0 --membind=0 postgres3. In Kubernetes
์ฟ ๋ฒ๋ฅผ ์ธ๋๋ NUMA๋ ๊ฝค ์ค์ํ ์ฃผ์ ๋ค. ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ์๋ ์ด๋ฐ์ ๋ฐ ์ด์ ๋๋ฌธ์ ํน์ Pod๊ฐ ๋์ผํ NUMA์ ํ๋์จ์ด๋ค๋ก ์คํ๋๊ธฐ๋ฅผ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฟ ๋ฒ๋คํฐ์ค๋ NUMA ํ๋์ ์ํ ๋ฐฐ์น ์ต์
๋ฑ์ ์ง์ํ๋ค. cpuManagerPolicy, topologyManagerPolicy, memoryManagerPolicy ๋ฑ์ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๋ก Pod๊ฐ ํน์ NUMA ๋
ธ๋์์ CPU/GPU/RAM์ ๊ณ ์ ๋๋๋ก ์กฐ์ ํ ์ ์๋ค.
์ด์ธ์๋ CPU Pinning, HugePages, Device Plugin ๋ฑ ์ด๋ฐ์ ๋ฐ ํ๋ ์ต์
๋ค์ด ๋ง์๋ฐ, ๋๋ฌด ๊ธธ์ด์ง๋ฏ๋ก ์์ธํ ๋ค๋ฃจ์ง ์๊ฒ ๋ค.
GPU์ NUMA
๋-AI ์๋, GPU ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์์๋ NUMA๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ต์ ํ๊ฐ ๊ฝค ์ค์ํ๋ค.
NUMA Node๊ฐ ์ฌ๋ฌ๊ฐ์ธ ์ํฉ์์๋ง ํ์ ๋๋ค.
GPU ์์ฒด๋ RAM๊ณผ ์ง์ ์ ์ธ ์ฐ๊ฒฐ์ ์ด ์์ด์ NUMA๋ ๊ฐ๋ ์ด ์์ง๋ง, GPU๊ฐ CPU์ ์ํตํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ์ฌํญ์ด๋ค. CPU๋ RAM์ ํตํด GPU์ ์ถ๋ก ํ ๊ฐ์ ๋ณด๋ด์ฃผ๋๋ฐ, ์ด๊ฒ ์ฌ์ค ๋ด๋ถ DMA์ ํตํด์ ์ฒ๋ฆฌ๋๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋ NUMA ํ๊ฒฝ์์ GPU๊ฐ DMA๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์ฝ์ผ๋ ค๋ฉด ์ฐ๊ฒฐ๋ CPU์ ๋์ผํ NUMA์์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ CPU๊ฐ GPU์ ๋น ๋ฅด๊ฒ ์งํต์ผ๋ก ๋ณด๋ด๋ ค๋ฉด ๋์ผ NUMA NODE์ CPU <> GPU๋ผ๋ฆฌ๋ง ํจ๊ป ๋ถ์ด์ ์ํธ์์ฉ์ ํ๋๋ก ํด์ผ ํ๋ค. ์๊ทธ๋ฌ๋ฉด ์ค๊ฐ์ ๋ถํ์ํ Remote Memory Access๊ฐ ์๊ธด๋ค.
vLLM ๊ฐ์ ์์คํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฌํ ์ต์ ํ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ฐธ์กฐ
https://www.techplayon.com/what-is-numa-non-uniform-memory-access/
https://netmarble.engineering/single-process-programming-numa-effect/
https://en.wikipedia.org/wiki/Non-uniform_memory_access