KSM (Kernel Samepage Merging)
๊ฐ์
KSM(Kernel Samepage Merging)์ Linux ์ปค๋ 2.6.32๋ถํฐ ๋์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ค๋ณต ์ ๊ฑฐ(deduplication) ๊ธฐ์ ์ ๋๋ค. KVM ๊ฐ์ํ ํ๊ฒฝ์์ ์ ์ฌํ ๊ฒ์คํธ OS ์ด๋ฏธ์ง ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ฅผ ์ํด ๊ฐ๋ฐ๋์์ผ๋, ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํ๋ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ฉํ ์ ์์ต๋๋ค.
KSM์ ์ปค๋ ์ค๋ ๋์ธ ksmd๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ค์บํ์ฌ ๋์ผํ ๋ด์ฉ์ ๊ฐ์ง ํ์ด์ง๋ฅผ ์ฐพ์ ํ๋์ ์ฐ๊ธฐ ๋ณดํธ ํ์ด์ง๋ก ๋ณํฉํฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ํด๋น ํ์ด์ง๋ฅผ ์์ ํ๋ ค ํ๋ฉด ์๋์ผ๋ก Copy-on-Write(COW)๊ฐ ๋ฐ์ํ์ฌ ๋
๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฌผ๋ฆฌ์ RAM ์ฌ์ฉ๋์ ํฌ๊ฒ ์ค์ผ ์ ์์ผ๋ฉฐ, KVM ํ๊ฒฝ์์๋ ์ต๋ 300%์ ์ค๋ฒ์ปค๋ฐ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
KSM์ madvise(MADV_MERGEABLE)๋ก ๋ฑ๋ก๋ ์ต๋ช
(private anonymous) ํ์ด์ง์๋ง ๋์ํ๋ฉฐ, ํ์ผ ๊ธฐ๋ฐ page cache๋ ๋ณํฉํ์ง ์์ต๋๋ค. ๋ณํฉ๋ ํ์ด์ง๋ ์ค์์์๋ ์ ์์ง๋ง, ๋ค์ ์ค์์ธ๋๋ฉด ๊ณต์ ์ํ๊ฐ ์ ์ง๋์ง ์์ผ๋ฏ๋ก ksmd๊ฐ ๋์ผ์ฑ์ ๋ค์ ์ฐพ์ ์ฌ๋ณํฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆผ 1. KSM ๋์ ๊ฐ์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณํฉ ๊ฐ๋
ํต์ฌ ๊ฐ๋
ksmd ์ปค๋ ์ค๋ ๋
ksmd๋ KSM์ ํต์ฌ ๋์์ ์ํํ๋ ์ปค๋ ์ค๋ ๋์ ๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ง์ ๋ ๊ฐ๊ฒฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ค์บํ๊ณ , ๋์ผํ ํ์ด์ง๋ฅผ ์ฐพ์ ๋ณํฉํฉ๋๋ค.
sleep_millisecs: ์ค์บ ๊ฐ๊ฒฉ(๋ฐ๋ฆฌ์ด). ๊ธฐ๋ณธ๊ฐ 20mspages_to_scan: ํ ๋ฒ์ ์ค์บํ ํ์ด์ง ์. ๊ธฐ๋ณธ๊ฐ 100run: ksmd ์ ์ด (0: ์ค์ง, 1: ์คํ, 2: ์ค์ง+๋ณํฉ ํด์ )- ์ค์บ์ ํด์ ํ
์ด๋ธ์ ์ด์ฉํ ๋น ๋ฅธ ๋น๊ต ํ
memcmp()๋ก ์ต์ข ํ์ธ
madvise ์ธํฐํ์ด์ค
KSM์ madvise(2) ์์คํ
์ฝ์ ํตํด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ณํฉ ๋์ ์์ญ์ ์ง์ ์ง์ ํฉ๋๋ค.
MADV_MERGEABLE: ์ง์ ๋ ์ฃผ์ ๋ฒ์๋ฅผ KSM ๋ณํฉ ๋์์ผ๋ก ๋ฑ๋กMADV_UNMERGEABLE: ์ด์ ์ ๋ฑ๋ก๋ ๋ณํฉ ๋์์ ์ทจ์ํ๊ณ ์ด๋ฏธ ๋ณํฉ๋ ํ์ด์ง๋ฅผ ํด์ CONFIG_KSM์ด ๋นํ์ฑํ๋ ์ปค๋์์๋MADV_MERGEABLE์ด EINVAL๋ก ์คํจ- ๋ณํฉ ํด์ ์ ๊ฐ์๊ธฐ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ์ ์์ด OOM ํฌ๋ฌ๊ฐ ๋ฐ๋๋ ์ ์์
stable tree / unstable tree
KSM์ ๋ชจ๋ ํ๋ณด ํ์ด์ง๋ฅผ ๋งค๋ฒ ์์ ๋น๊ตํ์ง ์๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก stable tree์ unstable tree๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- stable tree: ์ด๋ฏธ ๋ณํฉ๋ KSM ํ์ด์ง๋ฅผ ์ถ์ ํ๋ ๊ตฌ์กฐ๋ก, ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์ฐธ์กฐํ๋ ๊ณต์ ํ์ด์ง๋ฅผ ๊ด๋ฆฌ
- unstable tree: ์ด๋ฒ ์ค์บ ์ฃผ๊ธฐ์์ ๋ณํฉ ํ๋ณด๋ก ๋ฐ๊ฒฌ๋ ์ต๋ช ํ์ด์ง๋ฅผ ์์๋ก ๋ณด๊ดํ๋ ๊ตฌ์กฐ
- ํด์ ๋น๊ต์ tree ํ์์ผ๋ก ํ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ขํ ๋ค ์ต์ข
์ ์ผ๋ก
memcmp()๋ก ๋์ผ์ฑ์ ํ์ธ max_page_sharingํ๋์ ๋๋ฌํ ํ์ด์ง๋ ๋ณ๋ ์ฒด์ธ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ฉฐ, ์ด ๋น์ฉ์ด ์ปค์ง๋ฉด VM ์ฐ์ฐ ์ง์ฐ์๊ฐ์ด ์ฆ๊ฐํ ์ ์์
sysfs ์ธํฐํ์ด์ค
KSM์ /sys/kernel/mm/ksm/ ๋๋ ํ ๋ฆฌ์ sysfs ํ์ผ์ ํตํด ์ ์ด๋ฉ๋๋ค.
| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
pages_to_scan |
100 | ํ ๋ฒ์ ์ค์บํ ํ์ด์ง ์ |
sleep_millisecs |
20 | ์ค์บ ๊ฐ๊ฒฉ (ms) |
run |
0 | ksmd ์ ์ด (0:์ค์ง, 1:์คํ, 2:๋ณํฉํด์ ) |
merge_across_nodes |
1 | NUMA ๋ ธ๋ ๊ฐ ๋ณํฉ ํ์ฉ |
use_zero_pages |
0 | ์ ๋ก ํ์ด์ง ํน๋ณ ์ฒ๋ฆฌ |
max_page_sharing |
8192 | KSM ํ์ด์ง๋น ์ต๋ ๊ณต์ ์ |
stable_node_chains_prune_millisecs |
์ปค๋ ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ | ๊ณต์ ํ๋ ๋๋ฌ ํ์ด์ง ๋ฉํ๋ฐ์ดํฐ ์ ๋ฆฌ ์ฃผ๊ธฐ |
smart_scan |
1 | ์ค๋งํธ ์ค์บ (์ด์ ์คํจ ํ์ด์ง ์คํต) |
KSM ์ด๋๋ฐ์ด์
KSM ์ด๋๋ฐ์ด์ ๋ ํ๋ณด ํ์ด์ง ์์ ๋์ ์ธ ๋ณํ์ ์ ์ํ์ฌ pages_to_scan ํ๋ผ๋ฏธํฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํฉ๋๋ค.
advisor_mode=scan-time: ์ค์บ ์๊ฐ ๊ธฐ๋ฐ ์ด๋๋ฐ์ด์ ํ์ฑํadvisor_target_scan_time: ์ ์ฒด ํ๋ณด ํ์ด์ง ์ค์บ ๋ชฉํ ์๊ฐ(์ด). ๊ธฐ๋ณธ๊ฐ 200์ดadvisor_max_cpu: ksmd ์ค๋ ๋์ ์ต๋ CPU ์ฌ์ฉ๋ฅ ์ํ. ๊ธฐ๋ณธ๊ฐ 70%advisor_min_pages_to_scan/advisor_max_pages_to_scan:pages_to_scan๋ฒ์ ์ ํ
์ ๋ก ํ์ด์ง ์ต์ ํ
use_zero_pages ์ต์
์ ๋น ํ์ด์ง(zero page)๋ฅผ ํน๋ณ ์ฒ๋ฆฌํ์ฌ ์ปค๋ ์ ๋ก ํ์ด์ง์ ๋ณํฉํ๋๋ก ํฉ๋๋ค.
use_zero_pages=1๋ก ์ค์ ํ๋ฉด ๋น ํ์ด์ง๋ค์ด ๊ฐ๊ฐ ์ ๋ก ํ์ด์ง์ ๋ณํฉ- ์์ ์ ๋ก ํ์ด์ง(coloured zero page)๋ฅผ ์ฌ์ฉํ๋ ์ํคํ ์ฒ์์ ์ฑ๋ฅ ํฅ์
- ํน์ ์ํฌ๋ก๋์์๋ ์ฒดํฌ์ฌ์ด ์ผ์นํ๋ ๋น ํ์ด์ง๋ฅผ ๊ณผ๋ํ๊ฒ ์ค์บํ ์ ์์ด ์ฃผ์ ํ์
NUMA ์ธ์ ๋ณํฉ
merge_across_nodes ํ๋ผ๋ฏธํฐ๋ ์๋ก ๋ค๋ฅธ NUMA ๋
ธ๋์ ํ์ด์ง ๋ณํฉ์ ์ ์ดํฉ๋๋ค.
merge_across_nodes=1(๊ธฐ๋ณธ๊ฐ): ๋ชจ๋ ๋ ธ๋์ ํ์ด์ง๋ฅผ ๋ณํฉํ์ฌ ์ต๋ํ ๋ง์ ๊ณต์ ๋ฌ์ฑmerge_across_nodes=0: ๋์ผํ NUMA ๋ ธ๋ ๋ด ํ์ด์ง๋ง ๋ณํฉํ์ฌ ์ ๊ทผ ์ง์ฐ์๊ฐ ์ต์ํ- NUMA ๊ฑฐ๋ฆฌ๊ฐ ํฐ ๋ฉํฐ๋ ธ๋ ์์คํ ์์๋ 0์ผ๋ก ์ค์ ํ์ฌ ์ง์ฐ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด ํจ๊ณผ์
- ์ค์ ๋ณ๊ฒฝ ์ ๋จผ์
run=2๋ก ๋ชจ๋ ๊ณต์ ๋ฅผ ํด์ ํ ํ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค
๋น๊ต/๋ถ์
| ๊ธฐ๋ฒ | ์๋ฆฌ | ์ ํฉํ ๋์ | CPU ๋น์ฉ | ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ํจ๊ณผ | ๋ณด์ ๊ณ ๋ ค |
|---|---|---|---|---|---|
| KSM (madvise) | ์ฃผ๊ธฐ์ ์ค์บ์ผ๋ก ๋์ผ ํ์ด์ง ๋ณํฉ | KVM, ๋ค์ค ์ฌ์ฉ์ | ์ค๊ฐ~๋์ | ๋์ (์ต๋ 300% ์ค๋ฒ์ปค๋ฐ) | Side-channel ์ํ |
| KSM (global) | ์ ์ฒด ์ต๋ช ํ์ด์ง ์ค์บ | ๋ฒ์ฉ | ๋์ | ์ค๊ฐ | ๋์ ์ค์บ ๋น์ฉ |
| COW (fork) | fork ์ ํ์ด์ง ๊ณต์ , ์ฐ๊ธฐ ์ ๋ณต์ | ํ๋ก์ธ์ค ์์ฑ | ๋ฎ์ | ์ค๊ฐ | ์์ |
| ํฌ๋ช ๊ฑฐ๋ ํ์ด์ง | 4KBโ2MB ํ์ด์ง ๋ณํฉ | ๋์ฉ๋ ์ํฌ๋ก๋ | ๋ฎ์ | ์บ์ ํจ์จ ํฅ์ | ์์ |
| ํ์ด์ง ๊ณต์ (Uffd) | userfaultfd๋ฅผ ํตํ ๊ณต์ | VM ๋ง์ด๊ทธ๋ ์ด์ | ์ค๊ฐ | ๋์ | VM ์์กด |
๋์ ์๋ฆฌ
KSM ์ค์บ ๋ฐ ๋ณํฉ ํ๋ฆ
- ์์ฉ ํ๋ก๊ทธ๋จ์ด
madvise(MADV_MERGEABLE)๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ KSM์ ๋ฑ๋กํฉ๋๋ค. - ksmd ์ค๋ ๋๊ฐ ์ค์ ๋ ๊ฐ๊ฒฉ(
sleep_millisecs)๋ง๋ค ํ๋ณด ์์ญ์ ์ค์บํฉ๋๋ค. - ๊ฐ ํ์ด์ง์ ๋ํด ํด์ ๊ฐ์ ๊ณ์ฐํ๊ณ , ๋์ผํ ํด์๋ฅผ ๊ฐ์ง ๊ธฐ์กด ํ์ด์ง์ ๋น๊ตํฉ๋๋ค.
memcmp()๋ก ํ์ด์ง ๋ด์ฉ์ด ์์ ํ ์ผ์นํ๋ฉด ํด๋น ํ์ด์ง๋ค์ ํ๋์ ์ฐ๊ธฐ ๋ณดํธ ํ์ด์ง๋ก ๋ณํฉํฉ๋๋ค.- ๋ณํฉ๋ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ ์ํธ๋ฆฌ๊ฐ ํ๋์ ๋ฌผ๋ฆฌ ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ๋์ค์ ์ด๋ค ํ๋ก์ธ์ค๊ฐ ํด๋น ํ์ด์ง์ ์ฐ๊ธฐ๋ฅผ ์๋ํ๋ฉด COW๊ฐ ๋ฐ์ํ์ฌ ๋ณต์ ๋ฉ๋๋ค.
๋ณํฉ ๊ฒฝ๋ก:
App Memory โ madvise(MERGEABLE) โ ksmd Scan โ Hash Compare โ memcmp โ Merge (COW)
์ฐ๊ธฐ ๊ฒฝ๋ก:
Process Write โ COW Fault โ Page Copy โ Unmerge
๊ทธ๋ฆผ 2. KSM ํ์ด์ง ์ค์บ, ๋ณํฉ, COW ํ๋ฆ
KSM ์์ต์ฑ ๊ณ์ฐ
KSM์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ์ง๋ง rmap_item ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํฉ๋๋ค. ์์คํ ์ ์ฒด ์์ต์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํฉ๋๋ค:
general_profit โ ksm_saved_pages * sizeof(page) - (all_rmap_items) * sizeof(rmap_item)
ksm_saved_pages:pages_sharing+ksm_zero_pages์ ํฉall_rmap_items:pages_sharing+pages_shared+pages_unshared+pages_volatile์ ํฉ
ํ๋ก์ธ์ค๋ณ ์์ต์ฑ์ /proc/<pid>/ksm_stat์์ ํ์ธํ ์ ์์ต๋๋ค:
process_profit โ ksm_saved_pages * sizeof(page) - ksm_rmap_items * sizeof(rmap_item)
ksm_rmap_items/ksm_merging_pages๋น์จ์ด 64๋นํธ CPU์์ 64๋ฅผ ์ด๊ณผํ๋ฉด ์์ต์ด ๊ฑฐ์ ์๊ฑฐ๋ ์์
๋ชจ๋ํฐ๋ง ์งํ
/sys/kernel/mm/ksm/ ๋ฐ /proc/vmstat์์ KSM ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค:
| ์งํ | ์ค๋ช |
|---|---|
pages_shared |
๊ณต์ ๋ ๊ณ ์ ํ์ด์ง ์ |
pages_sharing |
๊ณต์ ๋ฅผ ์ฌ์ฉํ๋ ์ถ๊ฐ ์ฌ์ดํธ ์ (์ ์ฝ๋ ๋ฉ๋ชจ๋ฆฌ) |
pages_unshared |
๊ณ ์ ํ์ง๋ง ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ๋๋ ํ์ด์ง ์ |
pages_volatile |
๋๋ฌด ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝ๋์ด ํธ๋ฆฌ์ ๋ฐฐ์นํ ์ ์๋ ํ์ด์ง ์ |
pages_skipped |
์ค๋งํธ ์ค์บ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฑด๋๋ด ํ์ด์ง ์ |
full_scans |
๋ชจ๋ ๋ณํฉ ๊ฐ๋ฅ ์์ญ์ด ์ค์บ๋ ํ์ |
stable_node_chains |
max_page_sharing ํ๋์ ๋ฟ์ KSM ํ์ด์ง ์ |
stable_node_dups |
dedup ํ๋ ๋๋ฌธ์ ๋ณต์ ๋ stable node ์ |
ksm_zero_pages |
์ ๋ก ํ์ด์ง ์ต์ ํ๋ก ์ ์ฝ๋ ํ์ด์ง ์ |
cow_ksm |
KSM ํ์ด์ง์ ์ฐ๊ธฐ ์ COW ๋ฐ์ ํ์ |
ksm_swpin_copy |
์ค์์ธ ์ KSM ํ์ด์ง ๋ณต์ ํ์ |
์ค๋งํธ ์ค์บ
smart_scan=1 (๊ธฐ๋ณธ๊ฐ)๋ก ์ค์ ํ๋ฉด ์ด์ ์ ๋ณํฉ๋์ง ์์ ํ์ด์ง๋ฅผ ๊ฑด๋๋ฐ์ด ์ค์บ ํจ์จ์ ํฅ์์ํต๋๋ค.
- ์ด์ ์ค์บ์์ ๋ณํฉ์ ์คํจํ ํ์ด์ง๋ ๊ฑด๋๋
pages_skipped์งํ๋ก ํจ๊ณผ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ- ์ค์บ ๋น์ฉ์ ์ค์ด๋ฉด์๋ ๋ณํฉ ๊ฐ๋ฅ์ฑ์ ์ ์ง
์ฅ๋จ์
์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ๋์ผํ ํ์ด์ง๋ฅผ ๊ณต์ ํ์ฌ ๋ฌผ๋ฆฌ์ RAM ์ฌ์ฉ๋ ๋ํญ ๊ฐ์
- KVM ์ต์ ํ: ๊ฐ์ํ ํ๊ฒฝ์์ ๋ค์์ VM์ ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ด์ ๊ฐ๋ฅ
- ์ ์ฐํ ์ ์ด: madvise๋ก ๋ณํฉ ๋์์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ง์ ์ง์
- ์๋ ์ต์ ํ: ์ด๋๋ฐ์ด์ ๊ฐ ์ํฌ๋ก๋์ ๋ฐ๋ผ ์ค์บ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์กฐ์
- NUMA ์ธ์: NUMA ๋ ธ๋ ๊ฐ ๋ณํฉ์ ์ ์ดํ์ฌ ์ ๊ทผ ์ง์ฐ์๊ฐ ์ต์ํ ๊ฐ๋ฅ
๋จ์
- CPU ์ค๋ฒํค๋: ksmd ์ค๋ ๋๊ฐ ์ง์์ ์ผ๋ก CPU๋ฅผ ์ฌ์ฉํ์ฌ ์ค์บ ์ํ
- ๋ณด์ ์ํ: ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ก ์ธํ Side-channel ๊ณต๊ฒฉ ๊ฐ๋ฅ์ฑ
- ์ง์ฐ์๊ฐ ์ฆ๊ฐ: COW ๋ฐ์ ์ ์ถ๊ฐ ์ง์ฐ์๊ฐ ๋ฐ์
- ์ค์ ์ ๊ณต์ ํด์ : ์ค์์์ ํ ์ค์์ธ ์ ๊ณต์ ๊ฐ ํด์ ๋์ด ์ฌ๋ณํฉ ํ์
- ๋ฉํ๋ฐ์ดํฐ ์ค๋ฒํค๋: rmap_item ์ ์ฅ์ ์ํ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์๋น
๊ด๋ จ ๊ธฐ์
- KVM (Kernel-based Virtual Machine): KSM์ด ์ต์ด๋ก ๊ฐ๋ฐ๋ ๊ฐ์ํ ํ๋ซํผ
- COW (Copy-on-Write): KSM์ ๊ธฐ๋ฐ ๊ธฐ์ ๋ก ์ฐ๊ธฐ ๋ฐ์ ์ ํ์ด์ง ๋ณต์
- madvise: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ ์ปค๋์ ์ ๋ฌํ๋ ์์คํ ์ฝ
- NUMA (Non-Uniform Memory Access): ๋ฉํฐ์์ผ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ต์ ํ
- ํฌ๋ช ๊ฑฐ๋ ํ์ด์ง (THP): 4KB ํ์ด์ง๋ฅผ 2MB๋ก ๋ณํฉํ์ฌ ์บ์ ํจ์จ ํฅ์
- zRAM: ๋ฉ๋ชจ๋ฆฌ ์์ถ์ ํตํ ๊ฐ์ ์ค์ ๊ตฌํ
- ์ฌ์ฉ์ ํ์ด์ง ํ ์ด๋ธ (rmap): KSM์ด ์ฌ์ฉํ๋ ์ญ๋ฐฉํฅ ๋งคํ ๊ตฌ์กฐ
- Linux Kernel ๋ฌธ์:
/sys/kernel/mm/ksm/ํ๋๋ธ, ์ด๋ฒคํธ ์นด์ดํฐ, ์์ต์ฑ ๊ณ์ฐ์ ๊ธฐ์ค ๋ฌธ์ madvise(2)๋งค๋ด์ผ:MADV_MERGEABLE,MADV_UNMERGEABLE์ ์ฉ ๋์๊ณผ ์คํจ ์กฐ๊ฑด ์ค๋ช
ํต์ฌ ์ ๋ฆฌ
KSM์ Linux ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ณต ์ ๊ฑฐ ๊ธฐ์ ๋ก, ksmd ์ปค๋ ์ค๋ ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์บํ์ฌ ๋์ผํ ํ์ด์ง๋ฅผ ์ฐพ์ ์ฐ๊ธฐ ๋ณดํธ๋ ํ๋์ ๊ณต์ ํ์ด์ง๋ก ๋ณํฉํฉ๋๋ค. KVM ๊ฐ์ํ ํ๊ฒฝ์์ ์ ์ฉํ๋ฉฐ, madvise ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ณํฉ ๋์์ ์ง์ ์ง์ ํ ์ ์์ต๋๋ค. sysfs๋ฅผ ํตํ ์ธ๋ฐํ ์ ์ด์ ์ด๋๋ฐ์ด์ ๋ฅผ ํตํ ์๋ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ์ง๋ง, CPU ์ค๋ฒํค๋์ ๋ณด์ ์ํ๊ณผ ๊ฐ์ ํธ๋ ์ด๋์คํ๊ฐ ์กด์ฌํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ค์ ๊ณผ ๋ชจ๋ํฐ๋ง์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ ์ ์์ต๋๋ค.