์๊ฐ์์ ์ํด ์ค๋นํ ๊ธฐ์ฌ ๋ฒ์ญ
์ด์ ์๋ Linux์์ Hugepages๋ฅผ ํ
์คํธํ๊ณ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
์ด ๊ธฐ์ฌ๋ ์ค์ ๋ก Hugepages๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฅ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํฉ๋๋ค. ๋๋ Hugepages๊ฐ ๋ง๋ฒ์ฒ๋ผ ์์ฐ์ฑ์ ํฅ์์ํฌ ๊ฒ์ด๋ผ๋ ์ ๋ง์ ์๋ ์ฌ๋๋ค์ ๋ง์ด ๋ง๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ hugepaging์ ๋ณต์กํ ์ฃผ์ ์ด๋ฏ๋ก ์๋ชป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
1๋ถ: Linux์์ hugepages๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธ(์๋ณธ ์ฌ๊ธฐ์ )
๋ฌธ์ :
์์คํ
์์ HugePages๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์๋ฃจ์
:
๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
cat /sys/kernel/mm/transparent_hugepage/enabled
๋น์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ป์ ๊ฒ์ ๋๋ค :
always [madvise] never
์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค(ํญ์, ๋ฏธ์น๊ฒ, ์ ๋๋ก), ํ์ฌ ํ์ฑํ๋ ์ต์ ์ ๊ดํธ ์์ ํ์๋ฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋ฏธ์น๊ฒ ํ๋ค).
๋ฏธ์น๊ฒ ํ๋ค ๊ทธ ์๋ฏธ transparent hugepages
๋ค์์ ์ฌ์ฉํ์ฌ ๋ช
์์ ์ผ๋ก hugepage๋ฅผ ์์ฒญํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํด์๋ง ํ์ฑํ๋ฉ๋๋ค.
ํญ์ ๊ทธ ์๋ฏธ transparent hugepages
๋ชจ๋ ํ๋ก์ธ์ค์ ๋ํด ํญ์ ํ์ฑํ๋์ด ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํค์ง๋ง ๋ง์ ํ๋ก์ธ์ค๊ฐ ์ ์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋ก๋๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ ์ ์์ต๋๋ค.
๋ชป ๊ทธ ์๋ฏธ transparent hugepages
madvise๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญํ๋๋ผ๋ ํฌํจ๋์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์์๋ณด๋ ค๋ฉด ๋ค์์ผ๋ก ๋ฌธ์ํ์ธ์.
๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
์ต์
1: ์ง์ ๋ณ๊ฒฝ sysfs
(์ฌ๋ถํ
ํ ๋งค๊ฐ๋ณ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์๊ฐ๋๋ค):
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
์ต์ 2: ์์ ๋ ๊ตฌ์ฑ์ผ๋ก ์ปค๋์ ๋ค์ ์ปดํ์ผํ์ฌ ์์คํ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํฉ๋๋ค(์ด ์ต์ ์ ์ฌ์ฉ์ ์ ์ ์ปค๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ๊ถ์ฅ๋ฉ๋๋ค).
- ํญ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
- madvise๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ญ์์ค.
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
2๋ถ: HugePages์ ์ฅ์ ๊ณผ ๋จ์
Hugepages ์ฌ์ฉ์ ์ฅ์ , ๋จ์ ๋ฐ ๊ฐ๋ฅํ ํจ์ ์ ์ ํ์ ์ผ๋ก ์ค๋ช ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ๋ณต์กํ๊ณ ํํ์ ์ธ ๊ธฐ์ฌ๋ Hugepages๊ฐ ๋ง๋ณํต์น์ฝ์ด๋ผ๊ณ ์ฐฉ๊ฐํ๋ ์ฌ๋๋ค์๊ฒ๋ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ๋จ์์ฑ์ ์ํด ์ ํ์ฑ์ ํฌ์ํ๊ฒ ์ต๋๋ค. ๋ง์ ์ฃผ์ ๊ฐ ์ค์ ๋ก ๋ณต์กํ๊ณ ๋ฐ๋ผ์ ํฌ๊ฒ ๋จ์ํ๋์๋ค๋ ์ ์ ๋ช ์ฌํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ Linux๋ฅผ ์คํํ๋ 64๋นํธ x86 ์์คํ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ผ๋ฉฐ ๊ฑฐ์ โโ๋ชจ๋ ์ต์ Linux์ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์คํ ์ด ํฌ๋ช ํ hugepage๋ฅผ ์ง์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค(๊ฑฐ๋ ํ์ด์ง๋ฅผ ๋ฎ์ด์ฐ์ง ์๋๋ค๋ ๊ฒ์ ๋จ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค). ํ๊ฒฝ.
์์ธํ ๊ธฐ์ ์ค๋ช ์ ์๋ ๋งํฌ์ ์ฒจ๋ถํ๊ฒ ์ต๋๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
C++ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด์ ํน์ ์ฃผ์(ํฌ์ธํฐ ๊ฐ)๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ฃผ์๊ฐ ๋ฐ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ์ ์ฃผ์(RAM ์ฃผ์)๋ฅผ ๋ฐ์ํ๋ ๊ฒ์ ์๋๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๋ํ๋ ๋๋ค. ํ๋ก์ธ์์๋ ์ปค๋์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฌผ๋ฆฌ์ ์์น์ ๋งคํํ๋ ๋ฐ ๋์์ด ๋๋ ํน์ MMU(๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฅ์น) ๋ชจ๋์ด ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์๋ ๋ง์ ์ฅ์ ์ด ์์ง๋ง ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฑ๋ฅ(๋ค์ํ ์ด์ ๋ก)
- ํ๋ก๊ทธ๋จ ๊ฒฉ๋ฆฌ, ์ฆ ์ด๋ค ํ๋ก๊ทธ๋จ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ ์ ์์ต๋๋ค.
ํ์ด์ง๋ ๋ฌด์์ ๋๊น?
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ด์ง๋ก ๋๋์ด์ง๋๋ค. ๊ฐ ๊ฐ๋ณ ํ์ด์ง๋ ํน์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋, RAM์ ์์ญ์ ๊ฐ๋ฆฌํฌ ์๋ ์๊ณ , ๋น๋์ค ์นด๋์ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ฅ์น์ ํ ๋น๋ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํฌ ์๋ ์์ต๋๋ค.
์ฒ๋ฆฌํ๋ ๋๋ถ๋ถ์ ํ์ด์ง๋ RAM์ ๊ฐ๋ฆฌํค๊ฑฐ๋ ์ค์๋ฉ๋๋ค. ์ฆ, ํ๋ ๋๋ผ์ด๋ธ๋ SSD์ ์ ์ฅ๋ฉ๋๋ค. ์ปค๋์ ๊ฐ ํ์ด์ง์ ๋ฌผ๋ฆฌ์ ๋ ์ด์์์ ๊ด๋ฆฌํฉ๋๋ค. ์คํธํ๋ ํ์ด์ง์ ์ก์ธ์คํ๋ฉด ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์คํ๋ ค๋ ์ค๋ ๋๋ฅผ ์ค์งํ๊ณ ํ๋ ๋๋ผ์ด๋ธ/SSD์์ ํ์ด์ง๋ฅผ RAM์ผ๋ก ์ฝ์ ๋ค์ ์ค๋ ๋๋ฅผ ๊ณ์ ์คํํฉ๋๋ค.
์ด ํ๋ก์ธ์ค๋ ์คํธ๋ฆผ ํฌ๋ช ํ๋ฏ๋ก ๋ฐ๋์ HDD/SSD์์ ์ง์ ์ฝ์ ํ์๋ ์์ต๋๋ค. ์ผ๋ฐ ํ์ด์ง์ ํฌ๊ธฐ๋ 4096๋ฐ์ดํธ์ ๋๋ค. Hugepages ํฌ๊ธฐ๋ 2MB์ ๋๋ค.
๋ฒ์ญ ์ฐ๊ด ๋ฒํผ(TLB)
ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ์ก์ธ์คํ ๋ CPU๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ฌผ๋ฆฌ์ ํ์ด์ง(์ฆ, ๊ฐ์ ์ฃผ์ ๋งต์ด ์์ด์ผ ํจ)๋ฅผ ์์์ผ ํฉ๋๋ค.
์ปค๋์๋ ์ฌ์ฉ๋๋ ํ์ด์ง์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ(ํ์ด์ง ํ ์ด๋ธ)๊ฐ ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์ฃผ์๋ฅผ ์ค์ ์ฃผ์์ ๋งคํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ด์ง ํ ์ด๋ธ์ ์๋นํ ๋ณต์กํ๊ณ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์คํ ๋๋ง๋ค ์ ์ฒด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ ์๋ ์์ต๋๋ค.
๋คํํ ์ฐ๋ฆฌ ํ๋ก์ธ์์๋ ๊ฐ์ ์ฃผ์์ ๋ฌผ๋ฆฌ์ ์ฃผ์ ๊ฐ์ ๋งคํ์ ์บ์ํ๋ TLB๊ฐ ์์ต๋๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ์ก์ธ์ค ์๋์์ ํ์ด์ง ํ ์ด๋ธ์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ์ง๋ง ํ์ด์ง์ ๋ํ ๋ชจ๋ ํ์ ์ก์ธ์ค๋ TLB์์ ์ฒ๋ฆฌ๋ ์ ์์ผ๋ฏ๋ก ๋น ๋ฅธ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ฌผ๋ฆฌ์ ์ฅ์น๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์(์ ์ด์ ์๋๊ฐ ๋นจ๋ผ์ง) ์ฉ๋์ด ์ ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๋ง์ ํ์ด์ง์ ์ก์ธ์คํ๋ ค๋ ๊ฒฝ์ฐ TLB๋ ๋ชจ๋ ํ์ด์ง์ ๋ํ ๋งคํ์ ์ ์ฅํ ์ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋จ ์คํ ์๋๊ฐ ํจ์ฌ ๋๋ ค์ง๋๋ค.
๊ฑฐ๋ํ ํ์ด์ง๊ฐ ๊ตฌ์กฐํ๋ฌ ์ต๋๋ค
๊ทธ๋ ๋ค๋ฉด TLB ์ค๋ฒํ๋ก๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? (์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ ํ ๋์ผํ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค).
์ด๊ฒ์ด ๋ฐ๋ก Hugepages๊ฐ ๋ฑ์ฅํ๋ ๊ณณ์ ๋๋ค. ๋จ ํ๋์ TLB ํญ๋ชฉ์ด ํ์ํ 4096๋ฐ์ดํธ ๋์ ์ด์ ํ๋์ TLB ํญ๋ชฉ์ด ๋ฌด๋ ค 2MB๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. TLB์ 512๊ฐ์ ํญ๋ชฉ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์๋ Hugepages ์์ด ์ผ์น์ํฌ ์ ์์ต๋๋ค.
4096 bโ
512=2 MB
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ๊ทธ๋ค๊ณผ ๋น๊ตํ ์ ์์ต๋๊น?
2 MBโ
512=1 GB
์ด๊ฒ์ด ๋ฐ๋ก Hugepages๊ฐ ๋ฉ์ง ์ด์ ์ ๋๋ค. ๋ง์ ๋ ธ๋ ฅ์ ๋ค์ด์ง ์๊ณ ๋ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์ค์ํ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
๊ฑฐ๋ํ ํ์ด์ง ์คํธํ
์ปค๋์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๊ฐ ์ฌ์ฉ๋๋ ๋น๋๋ฅผ ์๋์ผ๋ก ๋ชจ๋ํฐ๋งํฉ๋๋ค. ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ(RAM)๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉด ์ปค๋์ ๋ ์ค์ํ(๋ ์์ฃผ ์ฌ์ฉ๋๋) ํ์ด์ง๋ฅผ ํ๋ ๋์คํฌ๋ก ์ด๋ํ์ฌ ๋ ์ค์ํ ํ์ด์ง๋ฅผ ์ํด ์ผ๋ถ RAM์ ํ๋ณดํฉ๋๋ค.
์์น์ ์ผ๋ก Hugepages์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปค๋์ ๊ฐ๋ณ ๋ฐ์ดํธ๊ฐ ์๋ ์ ์ฒด ํ์ด์ง๋ง ๊ตํํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
char* mymemory = malloc(2*1024*1024); // ะะพะทัะผะตะผ ััะพ ะทะฐ ะพะดะฝั Hugepage!
// ะะฐะฟะพะปะฝะธะผ mymemory ะบะฐะบะธะผะธ-ะปะธะฑะพ ะดะฐะฝะฝัะผะธ
// ะกะดะตะปะฐะตะผ ะผะฝะพะณะพ ะดััะณะธั
ะฒะตัะตะน,
// ะบะพัะพััะต ะฟัะธะฒะตะดัั ะบ ะฟะพะดะผะตะฝะต ัััะฐะฝะธัั mymemory
// ...
// ะะฐะฟัะพัะธะผ ะดะพัััะฟ ัะพะปัะบะพ ะบ ะฟะตัะฒะพะผั ะฑะฐะนัั
putchar(mymemory[0]);
์ด ๊ฒฝ์ฐ ์ปค๋์ ์ฌ์ฉ์๊ฐ 2๋ฐ์ดํธ๋ฅผ ์ฝ์ ์ ์๋๋ก ํ๋ ๋๋ผ์ด๋ธ/SSD์์ ์ต๋ 4096MB์ ์ ๋ณด๋ฅผ ๋์ฒด(์ฝ๊ธฐ)ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ ํ์ด์ง์ ๊ฒฝ์ฐ ํ๋ ๋๋ผ์ด๋ธ/SSD์์ XNUMX๋ฐ์ดํธ๋ง ์ฝ์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ hugepage๋ฅผ ์ฌ์ ์ํ๋ฉด ์ ์ฒด ํ์ด์ง์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์ฝ๋ ๊ฒ์ด ๋ ๋น ๋ฆ ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฌด์์๋ก ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๊ณ ๋ช ํฌ๋ก๋ฐ์ดํธ๋ง ์ฝ๋ ๊ฒฝ์ฐ ์ผ๋ฐ ํ์ด์ง๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ ๋ค๋ฅธ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์์์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ฉด์ ๋๋์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฐจ์ ์ผ๋ก ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ hugepages๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๊ทธ๋ฌ๋ ์ถ์์ ์ธ ์ํํธ์จ์ด๊ฐ ์๋ ์ง์ ํ ์คํธํ์ฌ ๋ฌด์์ด ๋ ๋นจ๋ฆฌ ์๋ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํ ๋น
C๋ฅผ ์์ฑํ๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ ํ์์ ์์๋ก ์์(๋๋ ๊ฑฐ์ ์์๋ก ํฐ) ๋ฉ๋ชจ๋ฆฌ ์์ ์์ฒญํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. malloc()
. 30๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
char* mymemory = malloc(30);
ํ๋ก๊ทธ๋๋จธ์๊ฒ๋ ์ด์ ์ฒด์ ์ 30๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ "์์ฒญ"ํ๊ณ ์ผ๋ถ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ malloc ()
ํจ์ ๋ด์์ ํธ์ถํ๋ C ํจ์์ผ ๋ฟ์
๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ ํ ๋น์ ๋ํด ์ ์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ๋ ๊ฒ์ ๋นํจ์จ์ ์
๋๋ค. ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๊ฐ ์ด๋ฏธ ํด์ ๋์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. (free())
, ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. malloc()
ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๋งค์ฐ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํฉ๋๋ค.
๋์์ ๋ชจ๋ ์ผ์ด ๋น์ ์๊ฒ๋ ๋์ ๋์ง ์๊ฒ ์ผ์ด๋๋๋ฐ ์ ๊ฑฑ์ ํด์ผํฉ๋๊น? ํ์ง๋ง ๋์ ์ด๊ธฐ ๋๋ฌธ์ free()
๊ทธ๋ฐ ๋ป์ ์๋์ผ
๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐํ๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์๋ ๋ช ๋ฐ์ดํธ๋ง ์ฌ์ฉ๋๋ ํ ์ธ๊ทธ๋จผํธ๊ฐ ์๊ณ ๊ทธ ์ฌ์ด์ ๋ชจ๋ ํญ๋ชฉ์ ํด์ ๋ฉ๋๋ค. (free())
.
๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐํ๋ ์์ฒญ๋๊ฒ ๋ณต์กํ ์ฃผ์ ์ด๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ์กฐ๊ธ๋ง ๋ณ๊ฒฝํด๋ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ฌ๊ฐํ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐํ๋ฅผ ์ผ์ผํค์ง ์์ง๋ง, ํ์ ์ผ๋ถ ์์ญ์ ์กฐ๊ฐํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ hugepages๊ฐ ์ํฉ์ ๋์ฑ ์ ํ์ํฌ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
hugepages์ ์ ํ์ ์ฌ์ฉ
์ด ๊ธฐ์ฌ๋ฅผ ์ฝ์ ํ, hugepages๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ด๋ ๋ถ๋ถ์ด ์ด์ ์ ์ป์ ์ ์๊ณ ์ด๋ ๋ถ๋ถ์ ์ด์ ์ ์ป์ ์ ์๋์ง ํ๋จํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด hugepages๋ฅผ ํ์ฑํํด์ผ ํ ๊น์?
๋คํํ ์ฌ์ฉํ ์ ์์ต๋๋ค madvise()
์ ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํด์๋ง ๊ฑฐ๋ํ ํ์ด์ง์ ํ์ฑํํฉ๋๋ค.
๋จผ์ ๋ค์์ ์ฌ์ฉํ์ฌ hugepages๊ฐ madvise() ๋ชจ๋์์ ์คํ๋๊ณ ์๋์ง ํ์ธํ์ธ์.
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ madvise()
hugepages๋ฅผ ์ฌ์ฉํ ์์น๋ฅผ ์ปค๋์ ์ ํํ ์๋ ค์ค๋๋ค.
#include <sys/mman.h>
// ะะปะปะพัะธััะนัะต ะฑะพะปััะพะต ะบะพะปะธัะตััะฒะพ ะฟะฐะผััะธ, ะบะพัะพััั ะฑัะดะตัะต ะธัะฟะพะปัะทะพะฒะฐัั
size_t size = 256*1024*1024;
char* mymemory = malloc(size);
// ะัะพััะพ ะฒะบะปััะธัะต hugepagesโฆ
madvise(mymemory, size, MADV_HUGEPAGE);
// โฆ ะธ ะทะฐะดะฐะนัะต ัะปะตะดัััะตะต
madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)
์ด ๋ฐฉ๋ฒ์ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ ์ปค๋์ ๋ํ ์กฐ์ธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ ์ปค๋์ด ํน์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํด ์๋์ผ๋ก hugepages๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์ madvise()
, ์ด ์ฃผ์ ๋ ์์ฒญ๋๊ฒ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ง ๋ฅ์ํด์ง๊ณ ์ถ๋ค๋ฉด ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๊ธฐ ์ ์ ๋ช ์ฃผ ๋์ ์ฝ๊ณ ํ
์คํธํ ์ค๋น๋ฅผ ํ์ญ์์ค.
๋ฌด์์ ์ฝ์๊น์?
hugepages์ ๋ํ IBM OpenStack ๊ธฐ์ฌ ํฌ๋ช ํ ๊ฑฐ๋ํ ํ์ด์ง์ ๋ถํฌ๋ช ํ ๊ฑฐ๋ํ ํ์ด์ง TLB์ ๊ดํ Wikipedia ๊ธฐ์ฌ ํฌ๋ช ํ hugepages์ ๋ํ Linux ์ปค๋ ๋ฌธ์ StackOverflow: ๊ฑฐ๋ํ ํ์ด์ง๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐํ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ดํ Microsoft ๊ธฐ์ฌ
์ง๋ฌธ์ด์๋ค? ๋๊ธ์ ์ ์ด์ฃผ์ธ์!
์ถ์ฒ : habr.com