[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๊ฐ€์ง€ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค.


  1. CPU๊ฐ€ ๋ฉ€ํ‹ฐ์†Œ์ผ“์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ๋ฉ€ํ‹ฐ NUMA ๋…ธ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ

  1. ๋ฉ”์ธ๋ณด๋“œ์˜ ์ง€์› ์—ฌ๋ถ€ (๋ฐ”์ด์˜ค์Šค ์„ค์ •, NUMA ๊ฐœ์ˆ˜๋ฅผ ์›ํ•˜๋Š”๋Œ€๋กœ ์กฐ์ ˆ ๊ฐ€๋Šฅ)



์ด 2๊ฐ€์ง€๊ฐ€ ์ถฉ์กฑ๋˜๋ฉด ํ•ด๋‹น NUMA ๊ตฌ์„ฑ์„ OS๊ฐ€ detectํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  RAM ์ž์ฒด์—๋Š” ํ•˜๋“œ์›จ์–ด ์ œํ•œ์ด ์—†๋‹ค.



CPU ์ง€์›

NUMA๋ฅผ ์ง€์›ํ•˜๋Š” CPU ์ž์ฒด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์ œํ•œ์ ์ด๋‹ค.
2 Socket์„ ์ง€์›ํ•˜๋Š” ์ธํ…” ์ œ์˜จ, AMD EPYC, AMD ์Šค๋ ˆ๋“œ๋ฆฌํผ ๊ฐ™์€ ์„œ๋ฒ„๊ธ‰ CPU๋“ค๋งŒ์ด multi NUMA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ๋ฆฌํผ์˜ ๊ฒฝ์šฐ์—๋Š” NUMA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ผ NUMA๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฐ”์ด์˜ค์Šค์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.




NUMA ํŠœ๋‹

๋Œ€๊ฐœ NUMA๋ฅผ OS๊ฐ€ ์ž๋™์œผ๋กœ ์žก์•„์ฃผ๊ธด ํ•˜๋Š”๋ฐ, ๊ธฐ๋ณธ ์˜ต์…˜๋งŒ์œผ๋กœ๋Š” ๋ถˆ์ถฉ๋ถ„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ NUMA ์ตœ์ ํ™”๋Š”

  1. ์‹ค์ œ NUMA ์„ค์ •์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ (OS๋‚˜ ๋ฐ”์ด์˜ค์Šค)
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ 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 postgres

3. 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