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

[๊ณ ์„ฑ๋Šฅ] NUMA(Non-Uniformed Memory Access) Locality์™€ CPU Affinity

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

 

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

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

 

NUMA(Non-Uniformed Memory Access)

๊ณผ๊ฑฐ์—๋Š” CPU๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด ๋ธŒ๋ฆฟ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. CPU ์ฝ”์–ด ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋„ ์˜ค์ง ํ•˜๋‚˜์˜ ๋ธŒ๋ฆฟ์ง€๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”์–ด๋ณ„ ์†๋„ ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋น„์œ ๋ฅผ ์ž ๊น ๋“ค์–ด๋ณด๋ฉด CPU ์ฝ”์–ด๊ฐ€ ๋‚˜์™€ ๋‚ด ์นœ๊ตฌ๋“ค์ด๋ผ๊ณ  ํ•˜๊ณ  ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ง€๊ฐ‘์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋Š” ATM๊ธฐ๊ธฐ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ์–ด๋–ค ๋ฌผ๊ฑด์„ ์‚ฌ๋ ค๊ณ ํ–ˆ์„ ๋•Œ(์—ฐ์‚ฐ), ์ง€๊ฐ‘์— ๋ˆ์ด ์žˆ์œผ๋ฉด ์ง€๊ฐ‘์—์„œ ๋ˆ์„ ๊บผ๋ƒ…๋‹ˆ๋‹ค(์บ์‹œ ํžˆํŠธ). ๋งŒ์•ฝ ์ง€๊ฐ‘์— ๋ˆ์ด ์—†๋‹ค๋ฉด ATM๊ธฐ๊ธฐ์—์„œ ๋ˆ์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋‚˜์™€ ๋‚ด ์นœ๊ตฌ๋“ค์ด ์„œ๋กœ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ๋”๋ผ๋„ ATM๊ธฐ๊ธฐ๋Š” 1๊ฐœ์ด๊ณ  ATM๊ธฐ๊ธฐ๋กœ ๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฆฌ๋„ 1๊ฐœ๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ UMA(Uniformed Memory Access)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://brunch.co.kr/@dreaminz/4


ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ๋ธŒ๋ฆฟ์ง€๊ฐ€ ํ”„๋กœ์„ธ์„œ ๋‚ด๋กœ ํ†ตํ•ฉ๋˜๊ณ  CPU ๋…ธ๋“œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜์—ญ์„ ์ชผ๊ฐœ์„œ ๊ฐ€์ ธ๊ฐ€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ์— CPU ์†Œ์ผ“์ด ๋„ค ๊ฐœ ์žˆ๊ณ , 512GB์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฌผ๋ฆฌ ์ฃผ์†Œ 0~128G-1๋ฒˆ์ง€๊นŒ์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” 0๋ฒˆ ์†Œ์ผ“์˜, 128G~256G-1๋ฒˆ์ง€๊นŒ์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” 1๋ฒˆ ์†Œ์ผ“์˜ ์ง€์—ญ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์„ NUMA๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๊ฐ ์†Œ์ผ“์—์„œ ์ž๊ธฐ ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น ๋ฅด์ง€๋งŒ ๋ฆฌ๋ชจํŠธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๋А๋ฆฐ ์ ‘๊ทผ ์†๋„ (๋ ˆ์ดํ„ด์‹œ)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ CPU ์†Œ์ผ“์— ์ฝ”์–ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ์— ๊ฐ™์€ ์ง€์—ญ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CPU ์ฝ”์–ด๋“ค์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ NUMA ๋…ธ๋“œ๋กœ ์นฉ๋‹ˆ๋‹ค. 8์ฝ”์–ด 4์†Œ์ผ“ CPU๋ผ๋ฉด (ํ•˜์ดํผ์Šค๋ ˆ๋”ฉ์„ ๊ฐ€์ •ํ•˜์ง€ ์•Š์„ ๋•Œ์—) 0~7๋ฒˆ ์ฝ”์–ด๋Š” NUMA ๋…ธ๋“œ 0๋ฒˆ, 8~15๋ฒˆ ์ฝ”์–ด๋Š” NUMA ๋…ธ๋“œ 1๋ฒˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

NUMA Locality

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

์ถœ์ฒ˜: https://openstack-in-production.blogspot.com/2015/08/numa-and-cpu-pinning-in-high-throughput.html

 

NUMA๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

NUMA ๋น„์ง€์—ญ ์ ‘๊ทผ(remote access)๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ์—ฌ๋Ÿฌ ์š”์†Œ์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

์š”์ธ ์˜ํ–ฅ ๋ฐฉํ–ฅ ์„ค๋ช…
์ง€์—ฐ(latency) ์ฆ๊ฐ€ remote ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์‹œ local๋ณด๋‹ค ๋” ๊ธด ์ ‘๊ทผ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ
๋ฐ”์Šค ํญ(bandwidth) ๊ฐ์†Œ cross-node ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„์Šค๊ฐ€ ๋ณ‘๋ชฉ์ด ๋  ์ˆ˜ ์žˆ์Œ
์บ์‹œ ์ผ๊ด€์„ฑ ๋น„์šฉ(cache coherence traffic) ์ฆ๊ฐ€ ์›๊ฒฉ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋ฉด ์บ์‹œ ๊ฐ„ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ ์œ ๋ฐœ
TLB/ํŽ˜์ด์ง€ ์›Œํฌ ๋น„์šฉ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ ์›๊ฒฉ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํƒ์ƒ‰ ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Œ
๋ฉ”๋ชจ๋ฆฌ ๋Œ€๊ธฐ / ๊ฒฝ์Ÿ ์ฆ๊ฐ€ ์—ฌ๋Ÿฌ CPU๊ฐ€ ๊ฐ™์€ remote ๋…ธ๋“œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ๊ฒฝ์šฐ ๋ณ‘๋ชฉ ๊ฐ€๋Šฅ

ํŠนํžˆ, ๋Œ€๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ(workloads with high memory throughput)์ด๋‚˜ ๋‚ฎ์€ ์ง€์—ฐ(latency sensitivity)์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” NUMA locality๋ฅผ ์ œ๋Œ€๋กœ ๋งž์ถ”์ง€ ์•Š์œผ๋ฉด 10% ์ด์ƒ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Linux ์ปค๋„ ๋ฌธ์„œ์—์„œ๋„ “memory type์ด๋‚˜ ๋ฒ„์Šค ํŠน์„ฑ์— ๋”ฐ๋ผ bandwidth/latency๊ฐ€ ๋‹ค๋ฆ„”์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

NUMA locality ๋ณด์žฅ์„ ์œ„ํ•œ ์ „๋žต 

์Šค๋ ˆ๋“œ ์ˆ˜ & CPU ์ฝ”์–ด ์ˆ˜

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฒฝ๊ณ„ํ•ด์•ผํ•  ๊ฒƒ์€ ๋ฌธ๋งฅ ๊ตํ™˜(Context Switching)์ž…๋‹ˆ๋‹ค. ๋ฌธ๋งฅ ๊ตํ™˜์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฝ”์–ด์˜ ์บ์‹œ๊ฐ€ ๋‚ ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ CPU ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ๋งŽ์œผ๋ฉด ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ž์ฃผ ๋ฌธ๋งฅ ๊ตํ™˜์„ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ํ•˜๋“œ์›จ์–ด ์ฝ”์–ด ์ˆ˜๋ณด๋‹ค ์ ๊ฒŒ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰์ค‘์ธ active thread ์ˆ˜ < ์ฝ”์–ด ์ˆ˜

 

CPU affinity

CPU affinity๋ž€ ์šด์˜์ฒด์ œ๊ฐ€ ํŠน์ • ์Šค๋ ˆ๋“œ(๋˜๋Š” ํ”„๋กœ์„ธ์Šค)๋ฅผ ํŠน์ • CPU ์ฝ”์–ด์— ๊ณ ์ •์‹œ์ผœ ์‹คํ–‰ํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ƒ NUMA๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด "์ด ์Šค๋ ˆ๋“œ๋Š” CPU 2์—์„œ๋งŒ ๋Œ์•„๋ผ"๋ผ๊ณ  ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‹ค๋ฌด์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ๊ฐ€์ ธ์™€๋ดค์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ œ๊ฐ€ ์ ์šฉํ•œ ๊ฑด ์•„๋‹ˆ๊ณ  ์„œ์น˜..).

1. numactl ๋กœ NUMA ๋…ธ๋“œ ์ „์ฒด๋ฅผ ์ง€์ • (memory locality ํ™•๋ณด)

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


2. ์ฝ”๋“œ ๋‚ด์—์„œ ์Šค๋ ˆ๋“œ๋ณ„ core pinning(cache locality ํ™•๋ณด)

#include <pthread.h>
#include <sched.h>

void pin_to_core(int core_id) {
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(core_id, &cpuset);
    pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
}

// NUMA node 0์—์„œ ๋Œ์•„๊ฐ€๋Š” core 0~3์— ๊ฐ๊ฐ thread pinning
pin_thread_to_core(0);
pin_thread_to_core(1);
pin_thread_to_core(2);
pin_thread_to_core(3);


// ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์‹œ
std::thread t([] {
    pin_thread_to_core(2);
    run_strategy();
});

 

 

์‹œ๋‚˜๋ฆฌ์˜ค ์˜ˆ์‹œ

HFT(๊ณ ๋นˆ๋„ ํŠธ๋ ˆ์ด๋”ฉ) ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด CPU affinity๋ฅผ ๊ตฌ์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Core 0: network recv thread (NIC 0๋ฒˆ NUMA node)
  • Core 1: feeding thread
  • Core 2~3: strategy threads
  • Core 4: order send thread
  • Core 5: logging thread

์ด๋Ÿฐ ์‹์œผ๋กœ thread affinity๋ฅผ ๋ช…ํ™•ํžˆ ๊ณ ์ •ํ•˜๋ฉด cache thrash์™€ context switching์ด ๊ฑฐ์˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

 

๋งˆ์น˜๋ฉฐ

NUMA๋Š” ํ”„๋กœ์„ธ์„œ์˜ ์„ค๊ณ„๋ฐฉ์‹์—์„œ ๋‚˜์˜จ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด์™€ ๋ฐ€์ ‘ํ•˜์ฃ . ๊ฒฐ๊ตญ ๊ณ ์„ฑ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ฒ”์šฉ์„ฑ์„ ๋ฒ„๋ฆฌ๊ณ , CPU ์—ฐ์‚ฐ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜ ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ๊ทธ๋žจ์€ CPU ์‚ฌ์šฉ์œจ์ด ์ผ์ •ํ•˜๊ฒŒ High๋ฅผ ์œ ์ง€ํ•˜๋”๋ผ๊ตฌ์š”. ์ €๋„ ์•„์ง ๋ถ€์กฑํ•˜์ง€๋งŒ NUMA Performance๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ๊ณ ํšจ์œจ ์„œ๋น„์Šค๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ์œ„ํ•œ ์ „๋žต(์—ฌํƒœ๊นŒ์ง€ ๋‹ค๋ค˜๋˜ ๋‚ด์šฉ)์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด์„œ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชฉํ‘œ ์ „๋žต
์บ์‹œ ํšจ์œจ ๊ทน๋Œ€ํ™” ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ํ•œ ์ฝ”์–ด์— ๊ณ ์ • (1:1 mapping)
NUMA ์ตœ์ ํ™” ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ NUMA ๋…ธ๋“œ์— ๋ฐฐ์น˜
Throughput ํ–ฅ์ƒ CPU ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋˜, ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ์ตœ์†Œํ™”
Low Latency ๊ฐ™์€ ์ฝ”์–ด/NUMA ๋…ธ๋“œ ๋‚ด์—์„œ lock-free ring buffer ์‚ฌ์šฉ
I/O Thread ์ตœ์ ํ™” ๋„คํŠธ์›Œํฌ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ๋ฅผ NIC๊ฐ€ ์—ฐ๊ฒฐ๋œ NUMA ๋…ธ๋“œ์— ๊ณ ์ •

๋Œ“๊ธ€