๐Ÿง Linux

Linux Memory Tiering Deep

๊ฐœ์š”

Linux ๋ฉ”๋ชจ๋ฆฌ ํ‹ฐ์–ด๋ง์€ DRAM, HBM, CXL/PMem ๊ฐ™์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์„ ํ•˜๋‚˜์˜ ์ •์ฑ… ์•„๋ž˜์—์„œ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ hot ํŽ˜์ด์ง€๋ฅผ ๋” ๋น ๋ฅธ ํ‹ฐ์–ด๋กœ ์˜ฌ๋ฆฌ๊ณ , cold ํŽ˜์ด์ง€๋ฅผ ๋” ๋А๋ฆฐ ํ‹ฐ์–ด๋กœ ๋‚ด๋ฆฌ๋˜, ์ด๋™ ๋น„์šฉ๊ณผ thrashing์„ ๊ฐ™์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” kernel ๋‚ด๋ถ€ ๊ธฐ์ค€์œผ๋กœ hotness ํƒ์ง€, ํŽ˜์ด์ง€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, abstract distance(adistance) ๊ธฐ๋ฐ˜ ํ‹ฐ์–ด ์ถ”์ƒํ™”, ์Šน๊ฒฉ ์ œ์–ด, DAMON/DAMOS ์—ฐ๊ณ„๊นŒ์ง€ ์ด์–ด์ง€๋Š” ํ๋ฆ„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์€ mm/memory-tiers.c, include/linux/memory-tiers.h, mm/migrate.c, Documentation/admin-guide/mm/damon/ ๋ฌธ์„œ๊ตฐ์„ ํ•จ๊ป˜ ๋ด์•ผ ์—ฐ๊ฒฐ์ด ๋งž์Šต๋‹ˆ๋‹ค.

linux_0000_linux_memory_tiering_deep

๊ทธ๋ฆผ 1. Linux ๋ฉ”๋ชจ๋ฆฌ ํ‹ฐ์–ด๋ง์˜ ํฐ ํ๋ฆ„

ํ•ต์‹ฌ ๊ฐœ๋…

ํ•ซ๋‹ˆ์Šค ํƒ์ง€

ํ‹ฐ์–ด๋ง์˜ ์ฒซ ๋‹จ๊ณ„๋Š” ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ hot์ธ์ง€ ์ฐพ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” NUMA balancing์˜ hint fault์ด๊ณ , ๋ณด์กฐ ๊ฒฝ๋กœ๋กœ PTE Accessed bit, PMU ์ƒ˜ํ”Œ๋ง, CXL ๋””๋ฐ”์ด์Šค ๊ธฐ๋ฐ˜ ์ถ”์ , DAMON region ์ƒ˜ํ”Œ๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • task_numa_work()๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„ ์ผ๋ถ€๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์Šค์บ”ํ•˜๊ณ  PTE๋ฅผ PROT_NONE์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์ดํ›„ ์ ‘๊ทผ์ด ๋“ค์–ด์˜ค๋ฉด do_numa_page()๊ฐ€ hint fault๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ ‘๊ทผ ์‚ฌ์‹ค๊ณผ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • folio_use_access_time()๋Š” slow memory folio์—์„œ _last_cpupid๋ฅผ ์ ‘๊ทผ ์‹œ๊ฐ„ ๊ธฐ๋ก์šฉ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ์ •ํ™•๋„๋Š” ์ข‹์ง€๋งŒ fault ๊ฒฝ๋กœ๋ฅผ ํƒ€๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ง€ ์ง€์—ฐ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

์ด ํ๋ฆ„์„ ๋ฐ”ํƒ•์œผ๋กœ ์•„๋ž˜ ์ ˆ์—์„œ ์ด๋™, ์ถ”์ƒํ™”, ์ œ์–ด, DAMON/DAMOS๋ฅผ ๊ฐ๊ฐ ๋ถ„ํ•ดํ•ด ๋ด…๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

promotion๊ณผ demotion์€ ๊ฒฐ๊ตญ ํŽ˜์ด์ง€๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์ด๊ณ , ์ปค๋„์˜ migrate_pages() ๊ณ„์—ด์ด ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค. ์ด๋™์€ ๋‹จ์ˆœ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ isolate, unmap, TLB flush, copy, remap, release ์ˆœ์„œ๋ฅผ ๊ฑฐ์น˜๋ฉฐ ๋น„์šฉ์ด ๊ฝค ํฝ๋‹ˆ๋‹ค.

Linux Memory Tiering Deep

๊ทธ๋ฆผ 3. migrate_pages()๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€ ์ด๋™ ๋‹จ๊ณ„

  • folio_isolate_lru()๋กœ ๋Œ€์ƒ folio๋ฅผ LRU์—์„œ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • remove_migration_ptes()๊ฐ€ migration entry๋ฅผ ์ •์ƒ PTE๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • folio_migrate_flags()๊ฐ€ ์ฐธ์กฐ ์ƒํƒœ, dirty ์ƒํƒœ, cpupid ๊ฐ™์€ ๋ณด์กฐ ์ •๋ณด๋ฅผ ์˜ฎ๊น๋‹ˆ๋‹ค.
  • fast/slow ํ‹ฐ์–ด๋ฅผ ๋„˜๋Š” ์ด๋™์—์„œ๋Š” cpupid๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด ๊ณผ๋„ํ•œ ์žฌ์ด๋™์„ ์ค„์ž…๋‹ˆ๋‹ค.

ํ‹ฐ์–ด ์ถ”์ƒํ™”

ํ•˜๋“œ์›จ์–ด ๊ฑฐ๋ฆฌ(NUMA distance)๋งŒ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ข…๋ฅ˜๋ฅผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„์€ abstract distance(adistance)๋ฅผ ์”๋‹ˆ๋‹ค. mt_perf_to_adistance()๋Š” latency๋Š” ๋น„๋ก€, bandwidth๋Š” ๋ฐ˜๋น„๋ก€๋กœ ๋ฐ˜์˜ํ•ด ์„ฑ๋Šฅ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ๊ฑฐ๋ฆฌ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • MEMTIER_CHUNK_SIZE๋Š” 128์ด๊ณ , adistance๋ฅผ 128 ๋‹จ์œ„๋กœ ๋ฌถ์–ด memory_tier๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ DRAM์€ MEMTIER_ADISTANCE_DRAM = 576์— ๋†“์ž…๋‹ˆ๋‹ค.
  • find_create_memory_tier()๋Š” ๊ฐ™์€ chunk์— ์†ํ•˜๋Š” memtype์„ ๊ฐ™์€ tier๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.
  • node_is_toptier()๋Š” CPU๊ฐ€ ๋ถ™์€ ์ƒ์œ„ tier๋ฅผ ํŒ๋ณ„ํ•˜๊ณ , next_demotion_node()๋Š” ํ•˜์œ„ tier๋กœ ๊ฐˆ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
Linux Memory Tiering Deep

๊ทธ๋ฆผ 4. HMAT/CDAT ์„ฑ๋Šฅ ์ •๋ณด๊ฐ€ adistance์™€ memory_tier๋กœ ์ •๋ฆฌ๋˜๋Š” ๊ณผ์ •

/sys/devices/virtual/memory_tiering/memory_tier*/nodelist๋ฅผ ๋ณด๋ฉด ์‹ค์ œ tier ๊ตฌ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cat /sys/devices/virtual/memory_tiering/memory_tier*/nodelist

์ œ์–ด ๋ฃจํ”„

์Šน๊ฒฉ์€ ์ด๋“์ด ๋ถ„๋ช…ํ•  ๋•Œ๋งŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ปค๋„์€ ์Šน๊ฒฉ๋Ÿ‰ ์ƒํ•œ๊ณผ hot threshold๋ฅผ ํ•จ๊ป˜ ์จ์„œ thrashing์„ ๋ง‰์Šต๋‹ˆ๋‹ค. hint fault latency๊ฐ€ ์งง์€ ํŽ˜์ด์ง€๋งŒ hot ํ›„๋ณด๋กœ ๋‚จ๊ธฐ๊ณ , ์Šน๊ฒฉ๋ฅ ์ด ์ƒํ•œ์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด threshold๋ฅผ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

Linux Memory Tiering Deep

๊ทธ๋ฆผ 5. hint fault ์ง€์—ฐ๊ณผ ์Šน๊ฒฉ๋Ÿ‰ ์ƒํ•œ์„ ์ด์šฉํ•œ ์ œ์–ด ๋ฃจํ”„

  • rate limit์€ ์ƒ์œ„ ํ‹ฐ์–ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ž ์‹๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  • hot threshold๋Š” ์Šค์บ” ํ›„ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ๋‹ค์‹œ ์ ‘๊ทผ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ฑธ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค.
  • ์ž๋™ ์กฐ์ •์€ ์›Œํฌ๋กœ๋“œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์Šน๊ฒฉ ์ ๊ทน์„ฑ์„ ๋‹ค์‹œ ๋งž์ถฅ๋‹ˆ๋‹ค.

DAMON / DAMOS ๊ธฐ๋ฐ˜ ํ‹ฐ์–ด๋ง

DAMON์€ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ region ๋‹จ์œ„๋กœ ๊ด€์ฐฐํ•˜๋ฏ€๋กœ ๋Œ€์šฉ๋Ÿ‰์—์„œ๋„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. DAMOS๋Š” ๊ทธ ๊ด€์ฐฐ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ migrate_hot๊ณผ migrate_cold ๊ฐ™์€ ์ž‘์—…์„ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Linux Memory Tiering Deep

๊ทธ๋ฆผ 6. DAMON region ์ƒ˜ํ”Œ๋ง๊ณผ DAMOS์˜ ์ž๋™ ์ž‘์—… ์ ์šฉ

  • sampling interval์€ ๋Œ€ํ‘œ ์ฃผ์†Œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ณผ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • aggregation interval์€ ์ ‘๊ทผ ๋นˆ๋„๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฌถ์–ด ๋ณผ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • region ์ˆ˜ ์ƒํ•œ์€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ์„ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • quota์™€ quota goal์€ ์ƒ์œ„ ํ‹ฐ์–ด ์‚ฌ์šฉ๋ฅ ์„ ๋งž์ถ”๋„๋ก ์ž‘์—…๋Ÿ‰์„ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต/๋ถ„์„

๋ฐฉ์‹ ์‹ ํ˜ธ ์žฅ์  ํ•œ๊ณ„ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
NUMA hint fault ์ ‘๊ทผ ์‹œ fault ๋…ธ๋“œ ๋‹จ์œ„ ์ ‘๊ทผ ์œ„์น˜๋ฅผ ์•Œ๊ธฐ ์ข‹์Œ fault ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์ง€์—ฐ์ด ์žˆ์Œ ๊ธฐ๋ณธ ํ‹ฐ์–ด๋ง
PTE Accessed bit hardware A-bit ๋น„์šฉ์ด ๋‚ฎ์Œ ๋นˆ๋„ ์ •๋ณด๊ฐ€ ๊ฑฐ์น ์Œ ์ €๋น„์šฉ ๋ณด์กฐ ํƒ์ง€
PMU ์ƒ˜ํ”Œ๋ง PEBS / IBS ์ •๋ฐ€๋„๊ฐ€ ๋†’์Œ ํ•˜๋“œ์›จ์–ดยท๋“œ๋ผ์ด๋ฒ„ ์˜์กด ๊ณ ์ •๋ฐ€ ๋ถ„์„
DAMON region sampling region ๋‹จ์œ„ ์ƒ˜ํ”Œ๋ง ๋Œ€์šฉ๋Ÿ‰์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ผ์ •ํ•จ ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ •๋ฐ€๋„๋Š” ๋‚ฎ์Œ ์ƒ์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง
CXL hot-page tracking ๋””๋ฐ”์ด์Šค/์ปจํŠธ๋กค๋Ÿฌ ์ถ”์  CPU ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์ข‹์Œ ํ”Œ๋žซํผ ์˜์กด์„ฑ์ด ํผ CXL ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ

๋™์ž‘ ์›๋ฆฌ

  1. ํŽŒ์›จ์–ด(HMAT/CDAT)๋‚˜ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปค๋„์€ ๊ทธ ๊ฐ’์„ adistance๋กœ ๋ฐ”๊พธ๊ณ , ๊ฐ™์€ chunk์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ™์€ memory_tier๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.
  3. NUMA balancing์ด๋‚˜ DAMON์ด hot ํŽ˜์ด์ง€๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. hot์œผ๋กœ ํŒ๋‹จ๋˜๋ฉด migrate_pages()๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค๋ฅธ tier๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
  5. migration entry๊ฐ€ ์ ‘๊ทผ์„ ๋ง‰๊ณ , ์ด๋™์ด ๋๋‚˜๋ฉด ์ƒˆ folio๊ฐ€ ๋‹ค์‹œ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
  6. ์Šน๊ฒฉ๋ฅ ๊ณผ threshold๋Š” ์ œ์–ด ๋ฃจํ”„๊ฐ€ ์กฐ์ •ํ•ด์„œ thrashing์„ ์ค„์ž…๋‹ˆ๋‹ค.

์ด ํ๋ฆ„ ๋•๋ถ„์— DRAM, HBM, CXL/PMem ๊ฐ™์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ข…๋ฅ˜๋ฅผ ํ•œ ์ •์ฑ…์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ memory_tier์™€ node_demotion ๊ฒฝ๋กœ๊ฐ€ ๋ถ„๋ฆฌ๋ผ ์žˆ์–ด, ์ƒ์œ„ ํ‹ฐ์–ด๋Š” ์Šน๊ฒฉ ๋Œ€์ƒ์œผ๋กœ, ํ•˜์œ„ ํ‹ฐ์–ด๋Š” ๊ฐ•๋“ฑ ๋Œ€์ƒ์œผ๋กœ ๋น„๊ต์  ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์žฅ๋‹จ์ 

  • ์žฅ์ : ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์„ ํ•˜๋‚˜์˜ ์ •์ฑ…์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : DAMON/DAMOS๋ฅผ ์“ฐ๋ฉด ๋Œ€์šฉ๋Ÿ‰์—์„œ๋„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : hot ํŽ˜์ด์ง€๋ฅผ ์ƒ์œ„ ํ‹ฐ์–ด์— ์ง‘์ค‘์‹œ์ผœ ํ‰๊ท  ์ง€์—ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : hint fault ๊ธฐ๋ฐ˜์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋А๋ฆฌ๊ณ  ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : ์ž˜๋ชป๋œ ์Šน๊ฒฉ์€ thrashing์œผ๋กœ ๋ฐ”๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : CXL, HMAT, CDAT ๊ฐ™์€ ํ”Œ๋žซํผ ์ง€์› ํ’ˆ์งˆ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ธฐ์ˆ 

ํ•ต์‹ฌ ์ •๋ฆฌ

๋ฉ”๋ชจ๋ฆฌ ํ‹ฐ์–ด๋ง์€ hot ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋กœ, cold ํŽ˜์ด์ง€๋ฅผ ๋А๋ฆฐ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณด๋‚ด๋Š” ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ํƒ์ง€ ์ง€์—ฐ๊ณผ ์ด๋™ ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•  ๋งŒํผ ์ง„์งœ hotํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„์€ adistance์™€ memory_tier๋กœ ๊ณ„์ธต์„ ์ถ”์ƒํ™”ํ•˜๊ณ , migrate_pages()๋กœ ์‹ค์ œ ์ด๋™์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. DAMON/DAMOS๋Š” region ๋‹จ์œ„ ๊ด€์ฐฐ๊ณผ quota/goal ์ œ์–ด๋กœ ์ด ๊ณผ์ •์„ ๋” ์ €๋น„์šฉ์œผ๋กœ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.