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/ ๋ฌธ์๊ตฐ์ ํจ๊ป ๋ด์ผ ์ฐ๊ฒฐ์ด ๋ง์ต๋๋ค.
๊ทธ๋ฆผ 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 ์์๋ฅผ ๊ฑฐ์น๋ฉฐ ๋น์ฉ์ด ๊ฝค ํฝ๋๋ค.
๊ทธ๋ฆผ 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๋ก ๊ฐ ๊ฒฝ๋ก๋ฅผ ๊ณ ๋ฆ ๋๋ค.
๊ทธ๋ฆผ 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๋ฅผ ๋ ์๊ฒฉํ๊ฒ ๋ฐ๊ฟ๋๋ค.
๊ทธ๋ฆผ 5. hint fault ์ง์ฐ๊ณผ ์น๊ฒฉ๋ ์ํ์ ์ด์ฉํ ์ ์ด ๋ฃจํ
- rate limit์ ์์ ํฐ์ด๊ฐ ๊ณผ๋ํ๊ฒ ์ ์๋๋ ๊ฒ์ ๋ง์ต๋๋ค.
- hot threshold๋ ์ค์บ ํ ๋๋ฌด ๋ฆ๊ฒ ๋ค์ ์ ๊ทผ๋ ํ์ด์ง๋ฅผ ๊ฑธ๋ฌ๋ ๋๋ค.
- ์๋ ์กฐ์ ์ ์ํฌ๋ก๋๊ฐ ๋ฐ๋์ด๋ ์น๊ฒฉ ์ ๊ทน์ฑ์ ๋ค์ ๋ง์ถฅ๋๋ค.
DAMON / DAMOS ๊ธฐ๋ฐ ํฐ์ด๋ง
DAMON์ ํ์ด์ง๊ฐ ์๋๋ผ region ๋จ์๋ก ๊ด์ฐฐํ๋ฏ๋ก ๋์ฉ๋์์๋ ์ค๋ฒํค๋๋ฅผ ์ผ์ ํ๊ฒ ์ ์งํ๊ธฐ ์ฝ์ต๋๋ค. DAMOS๋ ๊ทธ ๊ด์ฐฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ migrate_hot๊ณผ migrate_cold ๊ฐ์ ์์
์ ์ง์ ์คํํฉ๋๋ค.
๊ทธ๋ฆผ 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 ๊ธฐ๋ฐ ์์คํ |
๋์ ์๋ฆฌ
- ํ์จ์ด(HMAT/CDAT)๋ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฑ๋ฅ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ปค๋์ ๊ทธ ๊ฐ์
adistance๋ก ๋ฐ๊พธ๊ณ , ๊ฐ์ chunk์ ๋ ธ๋๋ฅผ ๊ฐ์memory_tier๋ก ๋ฌถ์ต๋๋ค. - NUMA balancing์ด๋ DAMON์ด hot ํ์ด์ง๋ฅผ ์ฐพ์ต๋๋ค.
- hot์ผ๋ก ํ๋จ๋๋ฉด
migrate_pages()๊ฐ ํ์ด์ง๋ฅผ ๋ค๋ฅธ tier๋ก ์ฎ๊น๋๋ค. - migration entry๊ฐ ์ ๊ทผ์ ๋ง๊ณ , ์ด๋์ด ๋๋๋ฉด ์ folio๊ฐ ๋ค์ ๋งคํ๋ฉ๋๋ค.
- ์น๊ฒฉ๋ฅ ๊ณผ threshold๋ ์ ์ด ๋ฃจํ๊ฐ ์กฐ์ ํด์ thrashing์ ์ค์ ๋๋ค.
์ด ํ๋ฆ ๋๋ถ์ DRAM, HBM, CXL/PMem ๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ข
๋ฅ๋ฅผ ํ ์ ์ฑ
์ผ๋ก ๋ค๋ฃฐ ์ ์์ต๋๋ค. ํนํ memory_tier์ node_demotion ๊ฒฝ๋ก๊ฐ ๋ถ๋ฆฌ๋ผ ์์ด, ์์ ํฐ์ด๋ ์น๊ฒฉ ๋์์ผ๋ก, ํ์ ํฐ์ด๋ ๊ฐ๋ฑ ๋์์ผ๋ก ๋น๊ต์ ๋ช
ํํ๊ฒ ๊ด๋ฆฌ๋ฉ๋๋ค.
์ฅ๋จ์
- ์ฅ์ : ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต์ ํ๋์ ์ ์ฑ ์ผ๋ก ๋ฌถ์ ์ ์์ต๋๋ค.
- ์ฅ์ : DAMON/DAMOS๋ฅผ ์ฐ๋ฉด ๋์ฉ๋์์๋ ๋ชจ๋ํฐ๋ง ๋น์ฉ์ ๊ด๋ฆฌํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ฅ์ : hot ํ์ด์ง๋ฅผ ์์ ํฐ์ด์ ์ง์ค์์ผ ํ๊ท ์ง์ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
- ๋จ์ : hint fault ๊ธฐ๋ฐ์ ๋ณธ์ง์ ์ผ๋ก ๋๋ฆฌ๊ณ ๋น์ฉ์ด ์์ต๋๋ค.
- ๋จ์ : ์๋ชป๋ ์น๊ฒฉ์ thrashing์ผ๋ก ๋ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋จ์ : CXL, HMAT, CDAT ๊ฐ์ ํ๋ซํผ ์ง์ ํ์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๊ด๋ จ ๊ธฐ์
- Memory Hierarchy
- Virtual Memory
- Memory Controller
- CXL Version Comparison
- HBM Generation Comparison
- Linux kernel
Documentation/admin-guide/mm/damon/index.rst - Linux kernel
Documentation/admin-guide/mm/damon/usage.rst - Linux kernel
Documentation/admin-guide/mm/damon/reclaim.rst - Linux kernel
Documentation/admin-guide/mm/damon/lru_sort.rst - Linux kernel
include/linux/memory-tiers.h - Linux kernel
mm/memory-tiers.c - Linux kernel
mm/migrate.c
ํต์ฌ ์ ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ ํฐ์ด๋ง์ hot ํ์ด์ง๋ฅผ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ก, cold ํ์ด์ง๋ฅผ ๋๋ฆฐ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณด๋ด๋ ์ ์ฑ
์
๋๋ค. ํต์ฌ์ ํ์ง ์ง์ฐ๊ณผ ์ด๋ ๋น์ฉ์ ๊ฐ์ํ ๋งํผ ์ง์ง hotํ์ง ํ๋จํ๋ ๋ฐ ์์ต๋๋ค. ์ปค๋์ adistance์ memory_tier๋ก ๊ณ์ธต์ ์ถ์ํํ๊ณ , migrate_pages()๋ก ์ค์ ์ด๋์ ์ฒ๋ฆฌํฉ๋๋ค. DAMON/DAMOS๋ region ๋จ์ ๊ด์ฐฐ๊ณผ quota/goal ์ ์ด๋ก ์ด ๊ณผ์ ์ ๋ ์ ๋น์ฉ์ผ๋ก ๋ณด์ํฉ๋๋ค.