ã³ãŒã¹åè¬çåãã«çšæãããèšäºã®ç¿»èš³
以åãLinux 㧠Hugepages ããã¹ãããŠæå¹ã«ããæ¹æ³ã«ã€ããŠèª¬æããŸããã
ãã®èšäºã¯ãå®éã« Hugepages ã䜿çšããå Žæãããå Žåã«ã®ã¿åœ¹ç«ã¡ãŸãã ç§ã¯ãHugepages ãéæ³ã®ããã«çç£æ§ãåäžããããšããèŠéãã«éšãããå€ãã®äººã«äŒããŸããã ãã ãããã¥ãŒãžããŒãžã³ã°ã¯ââè€éãªãããã¯ã§ããã䜿çšæ¹æ³ã誀ããšããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ããŒã 1: Linux 㧠hugepage ãæå¹ã«ãªã£ãŠããããšã確èªãã (ãªãªãžãã«) ãã㧠)
åé¡ïŒ
ã·ã¹ãã 㧠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 ã®å Žåãšåæ§ã«ãã·ã¹ãã ãééçãªãã¥ãŒãžããŒãžããµããŒãããŠãããšåçŽã«ä»®å®ããŠããããšã«æ³šæããŠãã ãã (ãã¥ãŒãžããŒãžãäžæžããããªãããšã¯æ¬ ç¹ã§ã¯ãªããã)ãç°å¢ã
以äžã®ãªã³ã¯ã«ããã«æè¡çãªèª¬æãæ·»ä»ããŸãã
ä»®æ³ã¡ã¢ãª
C++ ããã°ã©ãã§ããã°ãã¡ã¢ãªå ã®ãªããžã§ã¯ãã«ã¯ç¹å®ã®ã¢ãã¬ã¹ (ãã€ã³ã¿å€) ãããããšããåç¥ã§ãããã
ãã ãããããã®ã¢ãã¬ã¹ã¯å¿ ãããã¡ã¢ãªå ã®ç©çã¢ãã¬ã¹ (RAM ã¢ãã¬ã¹) ãåæ ããŠããããã§ã¯ãããŸããã ãããã¯ä»®æ³ã¡ã¢ãªå ã®ã¢ãã¬ã¹ãè¡šããŸãã ããã»ããµã«ã¯ãã«ãŒãã«ãä»®æ³ã¡ã¢ãªãç©ççãªå Žæã«ãããããã®ã«åœ¹ç«ã€ç¹å¥ãª MMU (ã¡ã¢ãªç®¡çãŠããã) ã¢ãžã¥ãŒã«ããããŸãã
ãã®ã¢ãããŒãã«ã¯å€ãã®å©ç¹ããããŸãããæãéèŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
- ããã©ãŒãã³ã¹ (ããŸããŸãªçç±ã«ãã)ã
- ããã°ã©ã ã®åé¢ãã€ãŸããã©ã®ããã°ã©ã ãå¥ã®ããã°ã©ã ã®ã¡ã¢ãªããèªã¿åãããšãã§ããŸããã
ããŒãžãšã¯äœã§ãã?
ä»®æ³ã¡ã¢ãªã¯ããŒãžã«åå²ãããŸãã åã ã®ããŒãžã¯ç¹å®ã®ç©çã¡ã¢ãªãæããŸããRAM å ã®é åãæãããšãããã㪠ã«ãŒããªã©ã®ç©çããã€ã¹ã«å²ãåœãŠãããã¢ãã¬ã¹ãæãããšãã§ããŸãã
æ±ãããŒãžã®ã»ãšãã©ã¯ RAM ããã€ã³ãããŠããããã¹ã¯ãããããŠãããããŒã ãã©ã€ããŸã㯠SSD ã«ä¿åãããŠããŸãã ã«ãŒãã«ã¯åããŒãžã®ç©çã¬ã€ã¢ãŠãã管çããŸãã ã¹ããŒãã£ã³ã°ãããããŒãžã«ã¢ã¯ã»ã¹ãããšãã«ãŒãã«ã¯ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããšããŠããã¹ã¬ãããåæ¢ããããŒãžãããŒã ãã©ã€ã/SSD ãã RAM ã«èªã¿åããã¹ã¬ããã®å®è¡ãç¶ç¶ããŸãã
ãã®ããã»ã¹ã¯ã¹ããªãŒã ééçã§ããã€ãŸããå¿ ããã HDD/SSD ããçŽæ¥èªã¿åãå¿ èŠã¯ãããŸããã éåžžã®ããŒãžã®ãµã€ãºã¯ 4096 ãã€ãã§ãã Hugepages ã®ãµã€ãºã¯ 2 ã¡ã¬ãã€ãã§ãã
翻蚳é¢é£ãããã¡ (TLB)
ããã°ã©ã ãã¡ã¢ãªã®ããŒãžã«ã¢ã¯ã»ã¹ãããšããCPU ã¯ã©ã®ç©çããŒãžããããŒã¿ãèªã¿åãããèªèããŠããå¿ èŠããããŸã (ã€ãŸããä»®æ³ã¢ãã¬ã¹ ããããæã£ãŠããå¿ èŠããããŸã)ã
ã«ãŒãã«ã«ã¯ã䜿çšãããŠããããŒãžã«é¢ãããã¹ãŠã®æ å ±ãå«ãŸããããŒã¿æ§é (ããŒãž ããŒãã«) ããããŸãã ãã®ããŒã¿æ§é ã䜿çšãããšãä»®æ³ã¢ãã¬ã¹ãç©çã¢ãã¬ã¹ã«ãããã§ããŸãã
ãã ããããŒãž ããŒãã«ã¯éåžžã«è€éã§é ããããããã»ã¹ãã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããã³ã«ããŒã¿æ§é å šäœãåæããããšã¯ã§ããŸããã
幞ããªããšã«ãç§ãã¡ã®ããã»ããµã«ã¯ãä»®æ³ã¢ãã¬ã¹ãšç©çã¢ãã¬ã¹éã®ãããã³ã°ããã£ãã·ã¥ãã TLB ããããŸãã ã€ãŸããæåã®ã¢ã¯ã»ã¹è©Šè¡ã§ã¯ããŒãž ããŒãã«ã解æããå¿ èŠããããŸããããã®åŸã®ããŒãžãžã®ã¢ã¯ã»ã¹ã¯ãã¹ãŠ TLB ã§åŠçã§ãããããé«éãªæäœãå¯èœã«ãªããŸãã
ç©çããã€ã¹ãšããŠå®è£ ãããŠãããã (ããããé«éã§ãããã)ããã®å®¹éã«ã¯å¶éããããŸãã ãããã£ãŠãããå€ãã®ããŒãžã«ã¢ã¯ã»ã¹ãããå ŽåãTLB ã¯ãã¹ãŠã®ããŒãžã®ãããã³ã°ãä¿åã§ãããããã°ã©ã ã®å®è¡ãå€§å¹ ã«é ããªããŸãã
Hugepages ãå©ãã«æ¥ãŸã
ã§ã¯ãTLB ãªãŒããŒãããŒãåé¿ããã«ã¯ã©ãããã°ããã§ãããã? (ããã°ã©ã ã«ã¯äŸç¶ãšããŠåãéã®ã¡ã¢ãªãå¿ èŠã§ãããšæ³å®ããŠããŸã)ã
ããã§Hugepagesãç»å ŽããŸãã 4096 ã€ã® TLB ãšã³ããªã ããå¿ èŠãšãã 2 ãã€ãã®ä»£ããã«ã512 ã€ã® TLB ãšã³ããªããªããš XNUMX ã¡ã¬ãã€ããæãããšãã§ããããã«ãªããŸããã TLB ã« XNUMX åã®ãšã³ããªããããšä»®å®ããŸããããã§ã¯ Hugepage ãªãã§äžèŽãããããšãã§ããŸãã
4096 bâ
512=2 MB
ã§ã¯ãã©ããã£ãŠããããšæ¯èŒã§ããã®ã§ããããã
2 MBâ
512=1 GB
ããããHugepages ãçŽ æŽãããçç±ã§ãã ããã»ã©åŽåããããã«çç£æ§ãåäžãããããšãã§ããŸãã ãã ããããã«ã¯éèŠãªæ³šæç¹ããããŸãã
Hugepage ã®ã¹ããŒãã£ã³ã°
ã«ãŒãã«ã¯ãåã¡ã¢ãª ããŒãžã®äœ¿çšé »åºŠãèªåçã«ç£èŠããŸãã ååãªç©çã¡ã¢ãª (RAM) ããªãå Žåãã«ãŒãã«ã¯éèŠåºŠã®äœã (䜿çšé »åºŠã®äœã) ããŒãžãããŒããã£ã¹ã¯ã«ç§»åããŠãããéèŠãªããŒãžã®ããã« RAM ã解æŸããŸãã
ååãšããŠãåãããšã Hugepage ã«ãåœãŠã¯ãŸããŸãã ãã ããã«ãŒãã«ã亀æã§ããã®ã¯ããŒãžå
šäœã®ã¿ã§ãããåã
ã®ãã€ãã亀æããããšã¯ã§ããŸããã
次ã®ãããªããã°ã©ã ããããšããŸãã
char* mymemory = malloc(2*1024*1024); // ÐПзÑЌеЌ ÑÑП за ÐŸÐŽÐœÑ Hugepage!
// ÐапПлМОЌ mymemory какОЌО-лОбП ЎаММÑЌО
// СЎелаеЌ ЌМПгП ÐŽÑÑгОÑ
веÑей,
// кПÑПÑÑе пÑОвеЎÑÑ Ðº пПЎЌеМе ÑÑÑаМОÑÑ mymemory
// ...
// ÐапÑПÑОЌ ЎПÑÑÑп ÑПлÑкП к пеÑÐ²ÐŸÐŒÑ Ð±Ð°Ð¹ÑÑ
putchar(mymemory[0]);
ãã®å Žåãã«ãŒãã«ã¯ããŠãŒã¶ãŒã 2 ãã€ããèªã¿åãããã«ãããŒã ãã©ã€ã/SSD ãã 4096 ã¡ã¬ãã€ããã®æ å ±ã眮ãæãã (èªã¿åã) å¿ èŠããããŸãã éåžžã®ããŒãžã®å ŽåãããŒããã©ã€ã/SSD ããèªã¿åãå¿ èŠãããã®ã¯ XNUMX ãã€ãã®ã¿ã§ãã
ãããã£ãŠãhugepage ããªãŒããŒã©ã€ããããå ŽåãããŒãžå šäœã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã«ã®ã¿èªã¿åããéããªããŸãã ããã¯ãã¡ã¢ãªã®ããŸããŸãªéšåã«ã©ã³ãã ã«ã¢ã¯ã»ã¹ããããšããŠããŠãæ°ãããã€ããèªã¿åãã ãã®å Žåã¯ãéåžžã®ããŒãžã䜿çšããä»ã«ã¯äœãå¿é ããå¿ èŠããªãããšãæå³ããŸãã
äžæ¹ãã¡ã¢ãªã®å€§éšåã«é 次ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ãhugepage ã䜿çšãããšããã©ãŒãã³ã¹ãåäžããŸãã ãã ããïŒæœè±¡çãªãœãããŠã§ã¢ã䜿çšããã«ïŒèªåã§ãã¹ãããŠãäœãããéãåäœãããã確èªããå¿ èŠããããŸãã
ã¡ã¢ãªå ã®å²ãåœãŠ
C ãäœæããå Žåã¯ã次ã䜿çšããŠããŒãããä»»æã«å°ãã (ãŸãã¯ã»ãŒä»»æã«å€§ãã) éã®ã¡ã¢ãªãèŠæ±ã§ããããšãããããŸãã malloc()
ã 30 ãã€ãã®ã¡ã¢ãªãå¿
èŠã ãšããŸãã
char* mymemory = malloc(30);
ããã°ã©ãã«ãšã£ãŠã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã« 30 ãã€ãã®ã¡ã¢ãªããèŠæ±ãããä»®æ³ã¡ã¢ãªãžã®ãã€ã³ã¿ãè¿ããŠããããã«èŠãããããããŸããã ã§ãå®ã¯ malloc ()
é¢æ°å
ããåŒã³åºãåãªã C é¢æ°ã§ã
ãã ããå²ãåœãŠããšã«ããã«å€ãã®ã¡ã¢ãªãèŠæ±ããã®ã¯éå¹çã§ãã ããã€ãã®ã¡ã¢ãªã»ã°ã¡ã³ãããã§ã«è§£æŸãããŠããå¯èœæ§ãæãé«ãã§ã (free())
ãåå©çšããããšãã§ããŸãã malloc()
解æŸãããã¡ã¢ãªãåå©çšããããã®éåžžã«è€éãªã¢ã«ãŽãªãºã ãå®è£
ããŸãã
åæã«ããã¹ãŠã®ããšã¯ããªãã«ãšã£ãŠæ°ã¥ãããã«èµ·ãã£ãŠããã®ã§ããªãå¿é
ããå¿
èŠãããã§ããããïŒ ããããææŠã ããããã free()
ããããæå³ã§ã¯ãããŸãã
èšæ¶ã®æçåãšãããã®ããããŸãã 極端ãªå Žåã«ã¯ãæ°ãã€ãã ãã䜿çšãããŠããããŒã ã»ã°ã¡ã³ããååšãããã®éã®ãã¹ãŠã®ãã€ãã解æŸãããããšããããŸãã (free())
.
ã¡ã¢ãªã®æçåã¯éåžžã«è€éãªãããã¯ã§ãããããã°ã©ã ãžã®ããããªå€æŽã§ãé倧ãªåœ±é¿ãäžããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ã»ãšãã©ã®å Žåãããã°ã©ã ã«ãã£ãŠé倧ãªã¡ã¢ãªã®æçåãåŒãèµ·ããããããšã¯ãããŸããããããŒãã®äžéšã®é åã§æçåã®åé¡ãçºçããå Žåãhugepage ã«ãã£ãŠç¶æ³ãæªåããå¯èœæ§ãããããšã«æ³šæããå¿ èŠããããŸãã
hugepage ã®éžæç䜿çš
ãã®èšäºãèªãã åŸã¯ãããã°ã©ã ã®ã©ã®éšåã hugepage ã䜿çšããããšã§ã¡ãªãããåŸãããã®ããã©ã®éšåãã¡ãªãããåŸãããªãã®ããå€æããããšã«ãªããŸãã ããã§ã¯ããããã hugepage ãæå¹ã«ããå¿ èŠãããã®ã§ãããã?
幞ããªããšã«ã䜿çšã§ããŸã madvise()
ãã¥ãŒãžããŒãžã³ã°ã圹ç«ã€ã¡ã¢ãªé åã«å¯ŸããŠã®ã¿ãã¥ãŒãžããŒãžã³ã°ãæå¹ã«ããŸãã
ãŸããhugepages ã madvise() ã¢ãŒãã§å®è¡ãããŠããããšã確èªããŸãã
次ã«ã䜿çšããŸã madvise()
hugepage ã䜿çšããå Žæãã«ãŒãã«ã«æ£ç¢ºã«æ瀺ããŸãã
#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)
ãã®ã¡ãœããã¯ãã¡ã¢ãªã®ç®¡çæ¹æ³ã«ã€ããŠã«ãŒãã«ã«ã¢ããã€ã¹ããã ãã§ããããšã«æ³šæããŠãã ããã ããã¯ãã«ãŒãã«ãç¹å®ã®ã¡ã¢ãªã«å¯ŸããŠèªåçã« hugepage ã䜿çšãããšããæå³ã§ã¯ãããŸããã
ããã¥ã¡ã³ããåç
§ããŠãã ãã madvise()
, ãã®ãããã¯ã®åŠç¿æ²ç·ã¯ä¿¡ããããªãã»ã©æ¥ã§ãã ãããã£ãŠãæ¬åœã«äžéãããå Žåã¯ãè¯å®çãªçµæãæåŸ
ã§ããåã«ãæ°é±éèªãã§ãã¹ãããæºåãããŠãã ããã
äœãèªãã¹ãã§ããïŒ
hugepage ã«é¢ãã IBM OpenStack ã®èšäº ééç㪠hugepage ãšéééç㪠hugepage ã®æ¯èŒ TLB ã«é¢ãããŠã£ãããã£ã¢ã®èšäº ééç㪠hugepage ã«é¢ãã Linux ã«ãŒãã«ã®ããã¥ã¡ã³ã StackOverflow: Hugepage ã¯ã¡ã¢ãªã®æçåãèµ·ããããã ä»®æ³ã¡ã¢ãªç®¡çã«é¢ãã Microsoft ã®èšäº
質åããããŸãïŒ ã³ã¡ã³ãã«æžããŠãã ããïŒ
åºæïŒ habr.com