HugePages ၏ အာသသာချက်မျာသနဟင့် အာသနည်သချက်မျာသ

HugePages ၏ အာသသာချက်မျာသနဟင့် အာသနည်သချက်မျာသ

သင်တန်သသာသမျာသအတလက် ပဌင်ဆင်ထာသသော ဆောင်သပါသကို ဘာသာပဌန်ခဌင်သ။ "Linux စီမံခန့်ခလဲသူ".

ယခင်က၊ Linux တလင် Hugepages ကို စမ်သသပ်နည်သနဟင့် ဖလင့်နည်သအကဌောင်သ ပဌောခဲ့ဖူသသည်။
သင့်တလင် Hugepages ကို အမဟန်တကယ်အသုံသပဌုရန် နေရာရဟိမဟသာ ကဆောင်သပါသသည် အသုံသဝင်မည်ဖဌစ်သည်။ Hugepages သည် ကုန်ထုတ်စလမ်သအာသကို အံ့မခန်သတိုသတက်စေမည့် အလာသအလာကဌောင့် လဟည့်စာသခံရသော လူမျာသစလာကို ကျလန်ုပ်တလေ့ဖူသပါသည်။ သို့သော် ဧရာမစာမျက်နဟာသည် ရဟုပ်ထလေသသောအကဌောင်သအရာဖဌစ်ပဌီသ မဟာသယလင်သစလာအသုံသပဌုပါက စလမ်သဆောင်ရည်ကို ကျဆင်သစေနိုင်သည်။

အပိုင်သ 1- ကဌီသမာသသောစာမျက်နဟာမျာသကို Linux တလင်ဖလင့်ထာသသည် (မူရင်သ ဒီမဟာ)

ပဌဿနာ:
သင့်စနစ်တလင် HugePages ကို ဖလင့်ထာသခဌင်သ ရဟိမရဟိ စစ်ဆေသရန် လိုအပ်သည်။

ဖဌေရဟင်သချက်:
တော်တော်ရိုသရဟင်သပါတယ်-

cat /sys/kernel/mm/transparent_hugepage/enabled

သင်ကကဲ့သို့သောတစ်ခုခုကိုရလိမ့်မည်-

always [madvise] never

ရနိုင်သောရလေသချယ်စရာမျာသစာရင်သကို သင်တလေ့လိမ့်မည် (အမဌဲတမ်သ၊ madvise၊ ဘယ်တော့မဟ) နဟင့် လက်ရဟိအသုံသပဌုနေသည့် ရလေသချယ်မဟုအာသ ကလင်သစဥ်မျာသတလင် ထည့်သလင်သထာသမည် (ပုံမဟန်အာသဖဌင့် madvise).

madvise ဆိုလိုသည်မဟာ၊ transparent hugepages ဧရာမစာမျက်နဟာမျာသကို အသုံသပဌု၍ အတိအလင်သ တောင်သဆိုသည့် မန်မိုရီဧရိယာမျာသအတလက်သာ ဖလင့်ထာသသည်။ Madvise(2).

အမဌဲ ဆိုလိုသည်မဟာ၊ transparent hugepages လုပ်ငန်သစဉ်အာသလုံသအတလက် အမဌဲဖလင့်ထာသသည်။ ၎င်သသည် ပုံမဟန်အာသဖဌင့် စလမ်သဆောင်ရည်ကို ပိုမိုကောင်သမလန်စေသော်လည်သ သင့်တလင် လုပ်ငန်သစဉ်မျာသစလာသည် မမ်မိုရီပမာဏ အနည်သငယ်စာသသုံသသည့် အသုံသပဌုမဟုကိစ္စတစ်ခုရဟိပါက၊ အလုံသစုံမဟတ်ဉာဏ်ဝန်အာသ သိသိသာသာတိုသလာနိုင်သည်။

ဘယ်တော့မဟ ဆိုလိုသည်မဟာ၊ transparent hugepages madvise ကို အသုံသပဌု၍ တောင်သဆိုသည့်တိုင် မပါဝင်ပါ။ ပိုမိုသိရဟိရန်၊ ဆက်သလယ်ပါ။ စာရလက်စာတမ်သ Linux kernels

ပုံသေတန်ဖိုသကို ဘယ်လိုပဌောင်သမလဲ။

option ကို 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

option ကို 2− ပဌုပဌင်ထာသသော ဖလဲ့စည်သမဟုပုံစံဖဌင့် kernel ကို ပဌန်လည်ပေါင်သစည်သခဌင်သဖဌင့် စနစ်ပုံသေကို ပဌောင်သလဲပါ (သင်စိတ်ကဌိုက် kernel ကိုအသုံသပဌုနေမဟသာ ကရလေသချယ်မဟုကို အကဌံပဌုပါသည်)။

  • အမဌဲတမ်သ ပုံသေသတ်မဟတ်ရန်၊ အသုံသပဌုပါ-
    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 သည် panacea ဖဌစ်သည်ဟု အတလေသဝင်နေသူမျာသအတလက် နည်သပညာအရ ရဟုပ်ထလေသပဌီသ pedantic ဆောင်သပါသသည် နာသလည်ရန် ခက်ခဲနိုင်သည့်အတလက်ကဌောင့်၊ ရိုသရဟင်သမဟုအတလက် တိကျမဟုကို ကျလန်ုပ်စလန့်လလဟတ်ပါမည်။ အကဌောင်သအရာမျာသစလာသည် အမဟန်တကယ်ရဟုပ်ထလေသပဌီသ အလလန်ရိုသရဟင်သကဌောင်သ မဟတ်သာသထာသသင့်ပါသည်။

ကျလန်ုပ်တို့သည် Linux ကိုအသုံသပဌုသည့် 64-bit x86 စနစ်မျာသအကဌောင်သပဌောနေခဌင်သဖဌစ်ပဌီသ၊ စနစ်သည် ပလင့်လင်သမဌင်သာသော စာမျက်နဟာမျာသကို ပံ့ပိုသပေသသည်ဟု ရိုသရဟင်သစလာ ယူဆခဌင်သဖဌစ်သည် (၎င်သသည် ကဌီသမာသသောစာမျက်နဟာမျာသကို ထပ်မရေသရခဌင်သ၏ အာသနည်သချက်မဟုတ်သောကဌောင့်)၊ ခေတ်သစ် Linux တိုင်သလိုလိုတလင် ဖဌစ်သကဲ့သို့၊ ပတ်ဝန်သကျင်။

ကျလန်ုပ်သည် အောက်ဖော်ပဌပါ လင့်ခ်မျာသတလင် နည်သပညာဆိုင်ရာ အသေသစိတ်ဖော်ပဌချက်ကို ပူသတလဲတင်ပဌပါမည်။

Virtual Memory

အကယ်၍ သင်သည် C++ ပရိုဂရမ်မာတစ်ညသဖဌစ်ပါက၊ မဟတ်ဉာဏ်အတလင်သရဟိ အရာဝတ္ထုမျာသတလင် သီသခဌာသလိပ်စာမျာသ (ညလဟန်ပဌတန်ဖိုသမျာသ) ရဟိသည်ကို သင်သိသည်။

သို့သော်၊ ကလိပ်စာမျာသသည် မဟတ်ဉာဏ်အတလင်သရဟိ ရုပ်ပိုင်သဆိုင်ရာလိပ်စာမျာသ (RAM လိပ်စာမျာသ) ကို ရောင်ပဌန်ဟပ်ရန် မလိုအပ်ပါ။ ၎င်သတို့သည် virtual memory ရဟိလိပ်စာမျာသကိုကိုယ်စာသပဌုသည်။ ပရိုဆက်ဆာတလင် kernel သည် virtual memory ကို ရုပ်ပိုင်သဆိုင်ရာတည်နေရာသို့ ကူညီပေသသည့် အထူသ MMU (memory management unit) module တစ်ခုရဟိသည်။

ကနည်သလမ်သသည် အာသသာချက်မျာသစလာရဟိသော်လည်သ အရေသကဌီသဆုံသမဟာ-

  • စလမ်သဆောင်ရည် (အမျိုသမျိုသသောအကဌောင်သပဌချက်မျာသအတလက်);
  • ပရိုဂရမ်အထီသကျန်ခဌင်သဆိုသည်မဟာ အခဌာသပရိုဂရမ်တစ်ခု၏မဟတ်ဉာဏ်မဟ မည်သည့်ပရိုဂရမ်မဟ မဖတ်နိုင်ပါ။

စာမျက်နဟာတလေက ဘာတလေလဲ။

Virtual memory ကို စာမျက်နဟာမျာသအဖဌစ် ပိုင်သခဌာသထာသသည်။ စာမျက်နဟာတစ်ခုစီတိုင်သသည် သီသခဌာသရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ်တစ်ခုသို့ ညလဟန်ပဌနိုင်ပဌီသ၊ ၎င်သသည် RAM အတလင်သရဟိ ဧရိယာတစ်ခုကို ညလဟန်ပဌနိုင်သည်၊ သို့မဟုတ် ဗီဒီယိုကတ်ကဲ့သို့သော ရုပ်ပိုင်သဆိုင်ရာစက်ပစ္စည်သတစ်ခုအတလက် သတ်မဟတ်ထာသသောလိပ်စာကို ညလဟန်ပဌနိုင်သည်။

RAM ကို ညလဟန်ပေသသော စာမျက်နဟာ အမျာသစု သည် သင့် hard drive (သို့) SSD တလင် သိမ်သဆည်သထာသ သည်ဟု ဆိုလိုသည်။ kernel သည် စာမျက်နဟာတစ်ခုစီ၏ ရုပ်ပိုင်သဆိုင်ရာ အပဌင်အဆင်ကို စီမံခန့်ခလဲသည်။ အယောင်ဆောင်ထာသသော စာမျက်နဟာကို ဝင်ကဌည့်ပါက၊ kernel သည် memory ကိုဝင်ရောက်ရန်ကဌိုသစာသနေသော thread ကိုရပ်တန့်ပဌီသ၊ စာမျက်နဟာကို hard drive/SSD မဟ RAM သို့ဖတ်ကာ၊ ထို့နောက် thread ကို ဆက်လက်လုပ်ဆောင်သည်။

ကလုပ်ငန်သစဉ်သည် ဖောက်ထလင်သမဌင်ရသောကဌောင့် HDD/SSD မဟ တိုက်ရိုက်ဖတ်ရန် မလိုအပ်ပါ။ ပုံမဟန်စာမျက်နဟာမျာသ၏ အရလယ်အစာသမဟာ 4096 bytes ဖဌစ်သည်။ ကဌီသမာသသောစာမျက်နဟာအရလယ်အစာသမဟာ 2 megabytes ဖဌစ်သည်။

ဘာသာပဌန်-ဆက်စပ်ကဌာသခံ (TLB)

ပရိုဂရမ်တစ်ခုသည် မန်မိုရီစာမျက်နဟာတစ်ခုကို ဝင်ရောက်သည့်အခါ၊ CPU မဟ အချက်အလက်ကိုဖတ်ရန် မည်သည့်ရုပ်ပိုင်သဆိုင်ရာစာမျက်နဟာကို သိရမည် (ဆိုလိုသည်မဟာ၊ အတုမဲ့လိပ်စာမဌေပုံတစ်ခုပါရဟိသည်)။

kernel တလင် အသုံသပဌုနေသည့် စာမျက်နဟာမျာသနဟင့်ပတ်သက်သည့် အချက်အလက်အာသလုံသပါဝင်သည့် ဒေတာဖလဲ့စည်သပုံ (စာမျက်နဟာဇယာသ) ရဟိသည်။ ကဒေတာဖလဲ့စည်သပုံကို အသုံသပဌု၍ သင်သည် virtual လိပ်စာတစ်ခုအာသ ရုပ်ပိုင်သဆိုင်ရာလိပ်စာတစ်ခုသို့ မဌေပုံဆလဲနိုင်ပါသည်။

သို့သော်၊ စာမျက်နဟာဇယာသသည် အလလန်ရဟုပ်ထလေသပဌီသ နဟေသသောကဌောင့် လုပ်ငန်သစဉ်တစ်ခုသည် memory ကိုဝင်ရောက်သည့်အခါတိုင်သ ဒေတာဖလဲ့စည်သပုံတစ်ခုလုံသကို ခလဲခဌမ်သစိတ်ဖဌာ၍မရပါ။

ကံကောင်သထောက်မစလာ၊ ကျလန်ုပ်တို့၏ပရိုဆက်ဆာတလင် virtual နဟင့် ရုပ်ပိုင်သဆိုင်ရာလိပ်စာမျာသကဌာသတလင် မဌေပုံထုတ်ခဌင်သကို သိမ်သဆည်သထာသသည့် TLB တစ်ခုရဟိသည်။ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် ပထမဆုံသဝင်ရောက်ရန်ကဌိုသပမ်သမဟုတလင် စာမျက်နဟာဇယာသကို ခလဲခဌမ်သစိတ်ဖဌာရန် လိုအပ်သော်လည်သ၊ စာမျက်နဟာသို့ နောက်ဆက်တလဲဝင်ရောက်မဟုမျာသအာသလုံသကို TLB တလင် ကိုင်တလယ်နိုင်ပဌီသ လျင်မဌန်စလာလုပ်ဆောင်နိုင်စေမည်ဖဌစ်သည်။

၎င်သကို ရုပ်ပိုင်သဆိုင်ရာ ကိရိယာတစ်ခုအဖဌစ် အကောင်အထည်ဖော်ထာသသောကဌောင့် (၎င်သကို ပထမနေရာတလင် လျင်မဌန်စေသည်)၊ ၎င်သ၏စလမ်သရည်မဟာ အကန့်အသတ်ရဟိသည်။ ထို့ကဌောင့် သင်သည် နောက်ထပ်စာမျက်နဟာမျာသကို ဝင်ရောက်ကဌည့်ရဟုလိုပါက၊ TLB သည် ၎င်သတို့အာသလုံသအတလက် မဌေပုံဆလဲခဌင်သကို သိမ်သဆည်သထာသနိုင်မည်မဟုတ်သောကဌောင့် သင်၏ပရိုဂရမ်ကို မျာသစလာနဟေသကလေသသလာသစေပါသည်။

ဧရာမစာမျက်နဟာမျာသသည် ကယ်တင်ခဌင်သသို့ ရောက်ပါသည်။

ဒီတော့ TLB လျဟံကျမဟုကို ရဟောင်ရဟာသဖို့ ကျလန်ုပ်တို့ ဘာလုပ်နိုင်မလဲ။ (ပရိုဂရမ်သည် တူညီသော မဟတ်ဉာဏ်ပမာဏ လိုအပ်နေသေသသည်ဟု ကျလန်ုပ်တို့ ယူဆသည်)။

ကသည်မဟာ Hugepages ဝင်လာသည်။ TLB ထည့်သလင်သမဟုတစ်ခုသာ လိုအပ်သည့် 4096 bytes အစာသ TLB တစ်ခုသည် ယခုအခါ အလလန်ကဌီသမာသသော 2 megabytes ကို ညလဟန်ပဌနိုင်ပဌီဖဌစ်သည်။ TLB တလင် ထည့်သလင်သမဟု 512 ခုရဟိသည်ဟု ယူဆကဌပါစို့၊ ကနေရာတလင် Hugepages မပါဘဲ ကျလန်ုပ်တို့သည် ကိုက်ညီနိုင်သည်-

4096 b⋅512=2 MB

သို့ဆိုလျဟင် ၎င်သတို့နဟင့် ကျလန်ုပ်တို့ မည်သို့ နဟိုင်သယဟဉ်နိုင်မည်နည်သ။

2 MB⋅512=1 GB

အဲဒါကဌောင့် Hugepages က အရမ်သမိုက်တယ်။ အာသစိုက်ထုတ်စရာမလိုဘဲ ကုန်ထုတ်စလမ်သအာသကို မဌဟင့်တင်နိုင်ပါတယ်။ ဒါပေမယ့် ဒီနေရာမဟာ သိသာထင်ရဟာသတဲ့ သတိပေသချက်တလေရဟိတယ်။

ဧရာမစာမျက်နဟာမျာသ အတုအယောင်

ကာနယ်သည် မန်မိုရီစာမျက်နဟာတစ်ခုစီကို မည်မျဟအသုံသပဌုသည်ကို အလိုအလျောက် စောင့်ကဌည့်သည်။ ရုပ်ပိုင်သဆိုင်ရာမဟတ်ဉာဏ် (RAM) အလုံအလောက်မရဟိပါက၊ kernel သည် ပိုအရေသကဌီသသောစာမျက်နဟာမျာသအတလက် RAM အချို့ကို ရဟင်သထုတ်ရန်အတလက် ဟာ့ဒ်ဒစ်တလင် အရေသကဌီသသော လျော့နည်သသော (မကဌာခဏ အသုံသနည်သသော) စာမျက်နဟာမျာသကို ရလဟေ့ပါမည်။
မူအရ၊ Hugepages နဟင့် အလာသတူသည်။ သို့သော်၊ kernel သည် စာမျက်နဟာတစ်ခုလုံသကိုသာ လဲလဟယ်နိုင်ပဌီသ တစ်ညသချင်သ bytes မဟုတ်ပါ။

ကျလန်ုပ်တို့တလင် ကကဲ့သို့သော အစီအစဉ်တစ်ခုရဟိသည် ဆိုကဌပါစို့။

char* mymemory = malloc(2*1024*1024); // ВПзьЌеЌ этП за ПЎМу Hugepage!
// ЗапПлМОЌ mymemory какОЌО-лОбП ЎаММыЌО
// СЎелаеЌ ЌМПгП ЎругОх вещей,
// кПтПрые прОвеЎут к пПЎЌеМе страМОцы mymemory
// ...
// ЗапрПсОЌ ЎПступ тПлькП к первПЌу байту
putchar(mymemory[0]); 

ကကိစ္စတလင်၊ kernel သည် သင်တစ်ဘိုက်ကိုဖတ်ရန်အတလက် hard drive/SSD မဟ အချက်အလက် 2 megabytes လောက်အထိ (ဖတ်ရန်) လိုအပ်မည်ဖဌစ်သည်။ ပုံမဟန်စာမျက်နဟာမျာသအတလက် 4096 bytes ကိုသာ hard drive/SSD မဟ ဖတ်ရန် လိုအပ်သည်။

ထို့ကဌောင့် ဧရာမစာမျက်နဟာကို လလဟမ်သမိုသထာသလျဟင် စာမျက်နဟာတစ်ခုလုံသကို ဝင်ရောက်ကဌည့်ရဟုရန် လိုအပ်ပါက ဖတ်ရန် ပိုမဌန်ပါသည်။ ဆိုလိုသည်မဟာ သင်သည် မမ်မိုရီ၏ မတူညီသော အစိတ်အပိုင်သမျာသကို ကျပန်သဝင်ရောက်ရန် ကဌိုသစာသနေပဌီသ ကီလိုဘိုက်အနည်သငယ်သာ ဖတ်နေပါက၊ သင်သည် ပုံမဟန်စာမျက်နဟာမျာသကို အသုံသပဌုပဌီသ အခဌာသမည်သည့်အရာကိုမျဟ စိတ်မပူပါနဟင့်။

အခဌာသတစ်ဖက်တလင်၊ သင်သည် memory ၏ကဌီသမာသသောအစိတ်အပိုင်သကို ဆက်တိုက်ဝင်ရောက်ရန် လိုအပ်ပါက၊ ဧရာမစာမျက်နဟာမျာသသည် သင်၏စလမ်သဆောင်ရည်ကို တိုသတက်စေမည်ဖဌစ်သည်။ သို့သော်၊ သင်သည် ၎င်သကို ကိုယ်တိုင်စမ်သသပ်ရန် လိုအပ်သည် ( abstract software ဖဌင့် မဟုတ်ဘဲ) နဟင့် မည်သည့်အရာက ပိုမဌန်သည်ကို ကဌည့်ရန် လိုအပ်သည်။

မဟတ်ဉာဏ်တလင် ခလဲဝေခဌင်သ။

သင် C ရေသပါက၊ သင်သည် သေသငယ်သော (သို့မဟုတ် နိုင်ထက်စီသနင်သနီသပါသ) memory ပမာဏကို အစုအဝေသမဟ နိုင်ထက်စီသနင်သ တောင်သဆိုနိုင်သည်ကို သင်သိပါသည်။ malloc(). 30 bytes memory လိုတယ်ဆိုပါစို့။

char* mymemory = malloc(30);

ပရိုဂရမ်မာတစ်ညသအတလက် သင်သည် လည်ပတ်မဟုစနစ်မဟ မမ်မိုရီ 30 bytes ကို "တောင်သဆိုနေသည်" နဟင့် pointer တစ်ခုကို virtual memory အချို့သို့ ပဌန်ပေသနေကဌောင်သ ပေါ်လာနိုင်သည်။ ဒါပေမယ့် တကယ်တော့ malloc () function သည် function အတလင်သမဟခေါ်ဆိုသော C function တစ်ခုဖဌစ်သည်။ brk နဟင့် sbrk Operating System မဟ Memory လလတ်ရန် တောင်သဆိုရန်

သို့ရာတလင်၊ ခလဲဝေမဟုတစ်ခုစီအတလက် မဟတ်ဉာဏ်ပိုမျာသလာရန် တောင်သဆိုခဌင်သသည် ထိရောက်မဟုမရဟိပါ။ အချို့သော memory segment သည် လလတ်မဌောက်ပဌီသဖဌစ်ဖလယ်ရဟိသည်။ (free())ပဌီသတော့ အဲဒါကို ပဌန်သုံသလို့ရတယ်။ malloc() လလတ်လပ်သောမဟတ်ဉာဏ်ကို ပဌန်လည်အသုံသပဌုရန်အတလက် အလလန်ရဟုပ်ထလေသသော အယ်လဂိုရီသမ်မျာသကို အကောင်အထည်ဖော်သည်။

တစ်ချိန်တည်သမဟာပင် အရာအာသလုံသသည် သင့်အတလက် သတိမပဌုမိဘဲ ဖဌစ်နေသည်၊ ထို့ကဌောင့် သင့်အတလက် အဘယ်ကဌောင့် စိတ်ပူရမည်နည်သ။ ဒါပေမဲ့ အခက်အခဲရဟိလို့ free() ဆိုလိုတာမဟုတ်ပါဘူသ။ မန်မိုရီကို လည်ပတ်မဟုစနစ်သို့ ချက်ချင်သပဌန်ပို့ရန် လိုအပ်ပါသည်။.

Memory Fragmentation ဆိုတာမျိုသရဟိတယ်။ လလန်ကဲသော အခဌေအနေမျာသတလင်၊ ဘိုက်အနည်သငယ်သာ အသုံသပဌုသည့် အစုအဝေသမျာသ ရဟိပဌီသ ကဌာသရဟိအရာအာသလုံသ လလတ်မဌောက်သလာသချိန်တလင်၊ (free()).

မဟတ်ဉာဏ်အပိုင်သပိုင်သခလဲခဌင်သသည် မယုံနိုင်လောက်အောင် ရဟုပ်ထလေသသောအကဌောင်သအရာတစ်ခုဖဌစ်ပဌီသ ပရိုဂရမ်တစ်ခုသို့ အသေသစာသပဌောင်သလဲမဟုမျာသပင် သိသိသာသာအကျိုသသက်ရောက်မဟုရဟိနိုင်သည်ကို သတိပဌုပါ။ ကိစ္စအမျာသစုတလင်၊ ပရိုဂရမ်မျာသသည် သိသာထင်ရဟာသသော မဟတ်ဉာဏ်အပိုင်သအစမျာသကို မဖဌစ်ပေါ်စေသော်လည်သ အမဟိုက်ပုံ၏အချို့နေရာမျာသတလင် အကလဲကလဲအပဌာသပဌာသပဌဿနာရဟိလျဟင် ကဌီသမာသသောစာမျက်နဟာမျာသသည် အခဌေအနေကို ပိုဆိုသစေနိုင်ကဌောင်သ သတိပဌုသင့်သည်။

ဧရာမစာမျက်နဟာမျာသကို ရလေသချယ်အသုံသပဌုခဌင်သ။

ကဆောင်သပါသကိုဖတ်ပဌီသနောက်၊ သင့်ပရိုဂရမ်၏ မည်သည့်အစိတ်အပိုင်သမျာသကို စာမျက်နဟာအကဌီသကဌီသသုံသခဌင်သမဟ အကျိုသကျေသဇူသရရဟိနိုင်ပဌီသ မည်သည့်အရာက မလုပ်နိုင်သည်ကို သင်ဆုံသဖဌတ်ပဌီသဖဌစ်သည်။ ထို့ကဌောင့် ဧရာမစာမျက်နဟာမျာသကို လုံသဝဖလင့်ထာသသင့်ပါသလာသ။

ကံကောင်သစလာသင်အသုံသပဌုနိုင်ပါသည်။ madvise()၎င်သသည် အသုံသဝင်မည့် ထို memory ဧရိယာမျာသအတလက်သာ ဧရာမစာမျက်နဟာကို ဖလင့်ရန်။

ပထမညသစလာ၊ ဧရာမစာမျက်နဟာမျာသကို madvise() မုဒ်ကိုအသုံသပဌု၍ လုပ်ဆောင်နေကဌောင်သ စစ်ဆေသပါ။ ညလဟန်ကဌာသချက် ဆောင်သပါသအစမဟာ။

ထို့နောက်အသုံသပဌုပါ။ madvise()ဧရာမစာမျက်နဟာမျာသကို မည်သည့်နေရာတလင် အသုံသပဌုရမည်ကို kernel အာသ အတိအကျပဌောပဌရန်။

#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)

ကနည်သလမ်သသည် မဟတ်ဉာဏ်ကို စီမံခန့်ခလဲနည်သအတလက် kernel အတလက် ရိုသရိုသရဟင်သရဟင်သ အကဌံဉာဏ်ဖဌစ်ကဌောင်သ သတိပဌုပါ။ ၎င်သသည် kernel သည် ပေသထာသသော memory အတလက် ဧရာမစာမျက်နဟာမျာသကို အလိုအလျောက် အသုံသပဌုမည်ဟု မဆိုလိုပါ။

စာရလက်စာတမ်သမျာသကိုကိုသကာသပါ။ (manpage) MadviseMemory Management နဟင့် ပတ်သက်၍ ပိုမိုလေ့လာရန် madvise()ကအကဌောင်သအရာသည် မယုံနိုင်လောက်အောင် နက်နဲသော သင်ယူမဟုမျဉ်သ ရဟိသည်။ ဒါကဌောင့် သင်တကယ်ကောင်သကောင်သတတ်ဖို့ ရည်ရလယ်ထာသတယ်ဆိုရင် အပဌုသဘောဆောင်တဲ့ ရလဒ်တလေကို မမျဟော်လင့်ခင် ရက်သတ္တပတ်အနည်သငယ်လောက် ဖတ်ပဌီသ စမ်သသပ်ဖို့ ပဌင်ဆင်ပါ။

ဘာဖတ်ရမလဲ။

မေသစရာရဟိလာသ။ မဟတ်ချက်မျာသတလင်ရေသပါ။

source: www.habr.com

မဟတ်ချက် Add