ืชืจืืื ืืืืืจ ืฉืืืื ืืชืืืืื ืืงืืจืก
ืืขืืจ ืืืืจืชื ืขื ืืื ืืืืืง ืืืืคืขืื ืืช Hugepages ืืืื ืืงืก.
ืืืืจ ืื ืืืื ืฉืืืืฉื ืจืง ืื ืืฉ ืื ืืงืื ืืืฉืชืืฉ ืื ื-Hugepages. ืคืืฉืชื ืืจืื ืื ืฉืื ืฉืืกืืืื ืฉ-Hugepages ืืฉืคืจ ืืช ืืคืจืืืืงืืืืืืช ืืฆืืจื ืงืกืืื. ืขื ืืืช, hugepaging ืืื ื ืืฉื ืืืจืื ืืขืืื ืืคืืืข ืืืืฆืืขืื ืื ื ืขืฉื ืื ืฉืืืืฉ ืื ื ืืื.
ืืืง 1: ืืืืืช ืฉ-hugepages ืืืคืขืืื ืืืื ืืงืก (ืืงืืจื ืืื )
ืืขืื:
ืขืืื ืืืืืง ืื HugePages ืืืคืขื ืืืขืจืืช ืฉืื.
ืคืชืจืื:
ืื ืื ืคืฉืื:
cat /sys/kernel/mm/transparent_hugepage/enabled
ืชืงืื ืืฉืื ืืื:
always [madvise] never
ืชืจืื ืจืฉืืื ืฉื ืืคืฉืจืืืืช ืืืื ืืช (ืชืืื, ืืืืจืฃ, ืืฃ ืคืขื), ืืืืคืฉืจืืช ืืคืขืืื ืืขืช ืชืืื ืืืงืคืช ืืกืืืจืืื (ืืืจืืจืช ืืืื madvise).
madvise ืืืืจ ืฉ transparent hugepages
ืืืคืขื ืจืง ืขืืืจ ืืืืจื ืืืืจืื ืืืืงืฉืื ืืืคืืจืฉ ืืคื ืขื ืง ืืืืฆืขืืช
ืชืืื ืืืืจ ืฉ 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 ืืื ืชืจืืคืช ืคืื, ืืืืชืจ ืขื ืืืืืง ืืืขื ืืคืฉืืืช. ืจืง ืืืื ืืืืืจ ืฉืืจืื ืืื ืืฉืืื ืื ืืืืช ืืืจืืืื ืืืื ืืคืืฉืืื ืืืื.
ืฉืืื ืื ืฉืื ืื ื ืืืืจืื ืขื ืืขืจืืืช 64-bit x86 ืืืจืฆืืช ืืื ืืงืก, ืืฉืื ื ืคืฉืื ืื ืื ืฉืืืขืจืืช ืชืืืืช ื-hugepages ืฉืงืืคืื (ืฉืื ืืื ืื ืืืกืจืื ืฉ-hugepages ืื ืืืืืคืื), ืืคื ืฉืงืืจื ืืืขื ืืื ืืื ืืงืก ืืืืจื ืืช ืกืืืื.
ืืฆืจืฃ ืชืืืืจ ืืื ื ื ืืกืฃ ืืงืืฉืืจืื ืืืื.
ืืืืจืื ืืืจืืืืื
ืื ืืชื ืืชืื ืช C++, ืืชื ืืืืข ืฉืืืืืืืงืืื ืืืืืจืื ืืฉ ืืชืืืืช ืกืคืฆืืคืืืช (ืขืจืื ืืฆืืืข).
ืขื ืืืช, ืืชืืืืช ืืื ืืื ื ืืฉืงืคืืช ืืืืจื ืืชืืืืช ืคืืืืืช ืืืืืจืื (ืืชืืืืช RAM). ืื ืืืืฆืืื ืืชืืืืช ืืืืืจืื ืืืจืืืืื. ืืืขืื ืืืืื MMU (ืืืืืช ื ืืืื ืืืืจืื) ืืืืื ืืืกืืืข ืืืืื ืืืคืืช ืืืืจืื ืืืจืืืืื ืืืืงืื ืคืืื.
ืืืืฉื ืื ืืชืจืื ืืช ืจืืื, ืื ืืืฉืืืื ืฉืืื ืื:
- ืืืฆืืขืื (ืืกืืืืช ืฉืื ืืช);
- ืืืืื ืชืืื ืืช, ืืืืืจ, ืืฃ ืชืืื ืืช ืื ืืืืื ืืงืจืื ืืืืืืจืื ืฉื ืชืืื ืืช ืืืจืช.
ืื ืื ืืคืื?
ืืืืจืื ืืืจืืืืื ืืืืืง ืืืคืื. ืื ืขืืื ืืืื ืืฆืืืข ืขื ืืืืจืื ืคืืื ืกืคืฆืืคื, ืืื ืืืื ืืืฆืืืข ืขื ืืืืจ ื-RAM, ืื ืฉืืื ืืืื ืืืฆืืืข ืขื ืืชืืืช ืฉืืืงืฆืชื ืืืืฉืืจ ืคืืื, ืืืื ืืจืืืก ืืกื.
ืจืื ืืืคืื ืฉืืชื ืขืืกืง ืืื ืืฆืืืขืื ืขื ืืืืจืื RAM ืื ืืืืืคืื, ืืืืืจ ืื ืืืืืกื ืื ืืืื ื ืืงืฉืื ืื ื-SSD ืฉืื. ืืงืจื ื ืื ืื ืืช ืืคืจืืกื ืืคืืืืช ืฉื ืื ืขืืื. ืื ื ืืืฉืื ืืืฃ ืืืืืฃ, ืืืืื ืขืืฆืจืช ืืช ืืฉืจืฉืืจ ืฉืื ืกื ืืืฉืช ืืืืืจืื, ืงืืจื ืืช ืืขืืื ืืืืื ื ืืงืฉืื/SSD ืืชืื ื-RAM, ืืืืืจ ืืื ืืืฉืื ืืืืฆืืข ืืฉืจืฉืืจ.
ืชืืืื ืื ืืื ืฉืงืืฃ ืืืจื, ืืืืืจ ืืื ื ืงืืจื ืืืืจื ืืฉืืจืืช ืื- HDD/SSD. ืืืืื ืฉื ืืคืื ืจืืืืื ืืื 4096 ืืชืื. ืืืื ืืคื ืขื ืง ืืื 2 ืืื ืืืื.
ืืืืจ ืืกืืฆืืืืืื ืืชืจืืื (TLB)
ืืืฉืจ ืชืืื ืืช ื ืืืฉืช ืืืฃ ืืืืจืื, ื-CPU ืืืื ืืืขืช ืืืืื ืขืืื ืคืืื ืืงืจืื ื ืชืื ืื (ืืืืืจ, ืืฉ ืื ืืคืช ืืชืืืช ืืืจืืืืืืช).
ืืงืจื ื ืืฉ ืืื ื ื ืชืื ืื (ืืืืช ืืคืื) ืฉืืืื ืืช ืื ืืืืืข ืขื ืืืคืื ืฉืืื ื ืขืฉื ืฉืืืืฉ. ืืืืฆืขืืช ืืื ื ื ืชืื ืื ืื, ื ืืชื ืืืคืืช ืืชืืืช ืืืจืืืืืืช ืืืชืืืช ืคืืืืช.
ืขื ืืืช, ืืืืช ืืืคืื ืืืจืืืช ืืืืืืช ืืืื, ืื ืฉืคืฉืื ืืื ื ื ืืืืืื ืื ืชื ืืช ืื ืืื ื ืื ืชืื ืื ืืื ืคืขื ืฉืชืืืื ื ืืืฉ ืืืืืจืื.
ืืืจืื ืืืื, ืืืขืื ืฉืื ื ืืฉ TLB ืฉืฉืืืจ ืืช ืืืืคืื ืืื ืืชืืืืช ืืืจืืืืืืืช ืืคืืืืืช. ืืืฉืืขืืช ืืื ืฉืืืจืืช ืฉืขืืื ื ืื ืชื ืืช ืืืืช ืืืคืื ืื ืืกืืื ืืืืฉื ืืจืืฉืื, ื ืืชื ืืืคื ืืื ืืืืฉื ืืขืืงืืช ืืืฃ ื-TLB, ืื ืฉืืืคืฉืจ ืคืขืืื ืืืืจื.
ืืืืืื ืฉืืื ืืืืฉื ืืืืฉืืจ ืคืืื (ืื ืฉืืืคื ืืืชื ืืืืืจ ืืืืชืืืื), ืืงืืืืืช ืฉืื ืืืืืืช. ืื ืื ืืชื ืจืืฆื ืืืฉืช ืืืคืื ื ืืกืคืื, ื-TLB ืื ืืืื ืืืืกื ืืืคืืืื ืขืืืจ ืืืื, ืื ืฉืืืจืื ืืชืืื ืืช ืฉืื ืืคืขืื ืืจืื ืืืชืจ ืืื.
Hugepages ืื ืืืฆืื
ืื ืื ืื ืื ื ืืืืืื ืืขืฉืืช ืืื ืืื ืืข ืืฆืคืช TLB? (ืื ื ืื ืืืื ืฉืืชืืื ืืช ืขืืืื ืืงืืงื ืืืืชื ืืืืช ืืืืจืื).
ืื ืืืงืื ืฉืื Hugepages ื ืื ืก ืืชืืื ื. ืืืงืื 4096 ืืชืื ืฉืืืจืฉืื ืจืง ืื ืืกืช TLB ืืืช, ืื ืืกืช TLB ืืืช ืืืืื ืืขืช ืืืฆืืืข ืขื 2 ืืื-ืืืื ืขืฆืืืื. ืืืื ื ื ืื ืฉื-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 ืจืง ืืื ืฉืชืืื ืืงืจืื ืืืื ืืื. ืืืื ืืคืื ืจืืืืื, ืืฉ ืืงืจืื ืจืง 4096 ืืชืื ืืืืื ื ืืงืฉืื/SSD.
ืืื, ืื ืขืืงืฃ ืืฃ ืขื ืง, ืื ืืืืจ ืืืชืจ ืืงืจืืื ืจืง ืื ืืชื ืฆืจืื ืืืฉืช ืืื ืืขืืื. ืื ืืืืจ ืฉืื ืืชื ืื ืกื ืืืฉืช ืืืืคื ืืงืจืื ืืืืงืื ืฉืื ืื ืฉื ืืืืืจืื ืืจืง ืงืืจื ืืื ืงืืืืืืืืื, ืขืืื ืืืฉืชืืฉ ืืืคืื ืจืืืืื ืืื ืืืืื ืืฉืื ืืืจ ืืืจ.
ืืฆื ืฉื ื, ืื ืืชื ืฆืจืื ืืืฉืช ืืืืง ืืืื ืืืืืืจืื ืืจืฆืฃ, ืืคื ืขื ืง ืืฉืคืจื ืืช ืืืืฆืืขืื ืฉืื. ืขื ืืืช, ืืชื ืฆืจืื ืืืืืง ืืช ืื ืืขืฆืื (ืื ืขื ืชืืื ื ืืืคืฉืืช) ืืืจืืืช ืื ืขืืื ืืืจ ืืืชืจ.
ืืงืฆืื ืืืืืจืื
ืื ืืชื ืืืชื C, ืืชื ืืืืข ืฉืืชื ืืืื ืืืงืฉ ืืืืืืช ืืืืจืื ืงืื ืืช ืืืืคื ืฉืจืืจืืชื (ืื ืืืขื ืฉืจืืจืืชื) ืฉื ืืืืจืื ืืืขืจืืื ืืืืฆืขืืช malloc()
. ื ื ืื ืฉืืชื ืฆืจืื 30 ืืชืื ืฉื ืืืืจืื:
char* mymemory = malloc(30);
ืืืชืื ืช, ืืืื ื ืจืื ืฉืืชื "ืืืงืฉ" 30 ืืชืื ืฉื ืืืืจืื ืืืขืจืืช ืืืคืขืื ืืืืืืจ ืืฆืืืข ืืืืืจืื ืืืจืืืืื ืืืฉืื. ืืื ืืืขืฉื malloc ()
ืืื ืจืง ืคืื ืงืฆืื C ืฉืงืืจืืช ืืชืื ืืคืื ืงืฆืื
ืขื ืืืช, ืืงืฉืช ืืืชืจ ืืืืชืจ ืืืืจืื ืขืืืจ ืื ืืงืฆืื ืืื ื ืืขืืื; ืกืืืจ ืืื ืื ืฉืงืืข ืืืืจืื ืืืฉืื ืืืจ ืฉืืืจืจ (free())
, ืืื ืื ื ืืืืืื ืืขืฉืืช ืื ืฉืืืืฉ ืืืืจ. malloc()
ืืืืฉืืช ืืืืืจืืชืืื ืืืจืืืื ืืืื ืืฉืืืืฉ ืืืืจ ืืืืืจืื ืืฉืืืจืจ.
ืืื ืขื ืืืช, ืืื ืงืืจื ืื ืืื ืืฉืื ืื, ืื ืืื ืื ืฆืจืื ืืืืืื ืืืชื? ืืื ืืืื ืืืชืืจ free()
ืื ืืืืจ ืืช ืื
ืืฉ ืืืจ ืืื ืคืืฆืื ืืืืจืื. ืืืงืจืื ืงืืฆืื ืืื, ืืฉื ื ืืงืืขื ืขืจืื ืฉืืื ื ืขืฉื ืฉืืืืฉ ืจืง ืืืื ืืชืื, ืืขืื ืฉืื ืื ืฉืืื ืืื ืฉืืืจืจ (free())
.
ืฉืืื ืื ืฉืคืืฆืื ืืืืจืื ืืื ื ืืฉื ืืืจืื ืืืคืืื, ืืืคืืื ืฉืื ืืืื ืงืืื ืืชืืื ืืช ืืืืืื ืืืืืช ืืขืื ืืฉืคืขื ืืฉืืขืืชืืช. ืืจืื ืืืงืจืื, ืชืืื ืืืช ืื ืืืจืื ืืคืืฆืื ืืืืจืื ืืฉืืขืืชื, ืื ืขืืื ืืืืืช ืืืืข ืืื ืฉืื ืืฉ ืืขืื ืขื ืคืืฆืื ืืืืืจ ืืืฉืื ืฉื ืืขืจืืื, ืืคื ืขื ืง ืืืืืื ืืืืืืจ ืืช ืืืฆื.
ืฉืืืืฉ ืกืืงืืืื ืืืคื ืขื ืง
ืืืืจ ืงืจืืืช ืืืืจ ืื, ืืืืืช ืืืื ืืืงืื ืืชืืื ืืช ืฉืื ืืืืืื ืืืคืืง ืชืืขืืช ืืฉืืืืฉ ื- 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)
ืฉืืื ืื ืฉืฉืืื ืื ืืื ืคืฉืื ืขืฆื ืืงืจื ื ืืืฆื ืื ืื ืืืืจืื. ืื ืื ืืืืจ ืฉืืงืจื ื ืืฉืชืืฉ ืืืืืืืืช ืืืคื ืขื ืง ืขืืืจ ืืืืจืื ื ืชืื.
ืขืืื ืืชืืขืื madvise()
, ืื ืืฉื ืื ืืฉ ืขืงืืืช ืืืืื ืชืืืื ืืืคืืื. ืื ืื ืืชื ืืชืืืื ืืืืืช ืืืฉ ืืื ืืื, ืืชืืื ื ืืงืจืื ืืืืืืง ืืืฉื ืืื ืฉืืืขืืช ืืคื ื ืฉืืชื ืืฆืคื ืืชืืฆืืืช ืืืืืืืช.
ืื ืืงืจืื?
ืืืืจ IBM OpenStack ืขื hugepages ืืคื ืขื ืง ืฉืงืืคืื ืืขืืืช ืืคื ืขื ืง ืื ืฉืงืืคืื ืืืืจ ืืืืงืืคืืื ืขื TLB ืชืืขืื ืืืืช ืืื ืืงืก ืขื ืืคื ืขื ืง ืฉืงืืคืื StackOverflow: ืืคื ืขื ืง ืืืขืืื ืืคืืฆืื ืืืืจืื ืืืืจ ืฉื ืืืงืจืืกืืคื ืขื ื ืืืื ืืืืจืื ืืืจืืืืื
ืืฉ ืฉืืื? ืืชืื ืืชืืืืืช!
ืืงืืจ: www.habr.com