Calm Hill My Random Thoughts

MySQL Memory Management

MySQL ဆိုတာ Install လုပ်ပြီးတာနဲ့ သုံးလို့ရပြီလို အတော်များများ ပြောလေ့ရှိတယ် တကယ်တမ်းက သာမန်အခြေအနေမှာ မသိသာပေမယ့် တကယ်တမ်းသုံးရင်တော့ Default Setting တွေဟာ ပြဿနာရှိပါတယ်။ Default Setting နဲ့ဆိုရင်တော့ Specification မြင့်တဲ့ Server ပေါ်မှာ Run နေပါစေ Performance က ထူးခြားမလာတာတွေ့ရလိမ့်မယ်။ Resource နည်းနည်းပဲရှိတဲ့ Server ပေါ်မှာတင်ထားပြီး Default နဲ့ Run နေရင်လည်း Resource မလောက်လို့ Server ရပ်သွားတာလည်းရှိတယ်။

Database Structure မဟုတ်ပဲ Server Setting တွေကို Optimize လုပ်မယ်ဆိုရင် Processing ကို Manage လုပ်လို့ရတာ အခွင့်အလမ်းနည်းပါတယ် Memory နဲ့ Storage ကိုပဲ Optimize လုပ်လို့အများဆုံးရတယ်။ Memory Management ဆိုရင် Server ပေါ်ကရနိင်တဲ့ Memory ပမာဏကို အကောင်းဆုံးဖြစ်အောင် စနစ်တကျသုံးနိုင်ဖို့လိုတယ်။

MySQL သုံးမယ့် Memory က Global သုံးမယ့် Memory နဲ့ Client တစ်ခုချင်းသုံးမယ့် Memory ဆိုပြီးနှစ်မျိုးခွဲလို့ရတယ်။ query_cache_size, key_buffer_size လို Variable တွေဟာ သတ်မှတ်ပေးလိုက်တဲ့ Memory ကို Connection အားလုံး Share လုပ်မှာဖြစ်တဲ့အတွက် Global လို့ပြောလို့ရတယ်။ sort_buffer_size, read_buffer_size, read_rnd_buffer_size လို Variables တွေကတော့ Connection တစ်ခုချင်းနဲ့ သက်ဆိုင်တယ်။ Maximum Memory Usage ဆိုရင် အောက်မှာပြထားတဲ့ Formula နဲ့တွက်လို့ရလိမ့်မယ်။

Equation

Maximum Memory Usage = Global memory + ( Per Client memory) * max_connections

Example

Global Buffer

key_buffer_size = 64M key_cache_block_size = 4096 query_cache_size = 64M

Per Client

sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 1M

Other

max_connections = 50

Memory Usage

Maximum Memory Usage = (key_buffer_size + query_cache_size) + (sort_buffer_size + read_buffer_size + read_rnd_buffer_size) * max_connections
Maximum Memory Usage = (64M + 64M) + (1M + 1M + 1M) * 50 = 278M

အပေါ်မှာပြထားတဲ့ Example နဲ့ဆိုရင် Maximum Memory Usage က 278M ရတယ်။ အတိအကျသုံးတယ်လို့တော့ တွက်လို့မရဘူးပေါ့လေ တစ်ချို့ Cache တွေက Query အပေါ်မူတည်ပြီး Allocate လုပ်ဖို့လိုမှလုပ်တာပါ။ အဲဒီတော့ ဒီလို Configuration နဲ့ RAM 20GB လောက်ရှိတဲ့ Server ပေါ်မှာ Run နေရင်တော့ Resource တွေအလကားပိုနေလိမ့်မယ်။ Connection ၅ ခုလောက်တက်ရင် Memory 512M လောက်သုံးတဲ့ Configuration နဲ့ RAM 1GB ပဲရှိတဲ့စက်မှာ Run ရင်တော့ မကြာခဏပဲ Ram မလောက်လို့ Server Down ပါလိမ့်မယ်။ နမူနာပြထားတဲ့ Variables တွေက MySQL အတွက်နဲ့ MyISAM အတွက်ပဲနမူနာပါတယ် InnoDB သုံးရင် innodb_buffer_pool_size လို Variables တွေလည်း ထည့်တွက်ရလိမ့်မယ်။

Memory Usage မဟုတ်ပေမယ့် Management လို့ပြောရမယ့် key_cache_block_size လို Variable တွေရှိတယ် MyISAM ရဲ့ Cache block size ကိုဘယ်လောက်ထားမလဲ ဆိုတဲ့နေရာမှာ စဉ်းစားစရာအများကြီးရှိတယ်။ Document မှာရေးထားတာက OS မှာသုံးတဲ့ Page Size နဲ့တူရင် ကောင်းတယ်လို့ဆိုတယ် ဘာလို့လဲဆိုတော့ ဘယ်လောက်ပဲသတ်မှတ်သတ်မှတ် တကယ်တမ်း Physically Allocate လုပ်ရင်တော့ OS ကလုပ်တာဖြစ်လို့OS သုံးတဲ့ Page Size ထက်နည်းရင်ပဲဖြစ်ဖြစ် များရင်ပဲဖြစ်ဖြစ် Performance ပြဿနာရှိတယ်။ တူရင်ရောတကယ် ကောင်းမလားဆိုတော့ Data တစ်ခါဖတ်ရင် Page တစ်ခုပမာဏ အနည်းဆုံးဖတ်ရတော့ ကိုယ်သုံးတဲ့ Database ဟာ ဖတ်တာကိုပဲအဓိကသုံးရင် ကောင်းပေမယ့် ရေးတာပြင်တာများတဲ့ Database ဆိုရင်တော့ မလိုအပ်ပဲ Page အကြီးကြီးဖတ်ရတာက ပိုအချိန်ကုန်လိမ့်မယ်။

Database တစ်ခုကို ဘယ်လို Administrate လုပ်မလဲဆိုတာက Product Specific အလုပ်ပါ MySQL မှာ Optimize လုပ်ပုံလုပ်နည်းနဲ့ Oracle မှာလုပ်ပုံလုပ်နည်း ဘယ်လိုမှမတူနိုင်ဘူး ဒါပေမယ့် Option တစ်ခုပြောင်းဖို့ ဆုံးဖြတ်တာကတော့ Product Specific မဟုတ်သလို Subject Specific လည်းမဟုတ်ဘူး တစ်ခါတစ်ရံ Operating System တွေဘယ်လို အလုပ်လုပ်သလဲအပေါ်အခြေခံပြီး ဆုံးဖြတ်ရတာရှိသလို တစ်ခါတစ်ရံ Network Administration Knowledge အပေါ်အခြေခံတယ် Database Logical Structure အပေါ် အခြေခံတာလည်းရှိတယ်။ Skill တစ်ခုထဲ လိုအပ်တာမဟုတ်တဲ့အတွက် Qualify ဖြစ်တဲ့ DBA တွေနည်းနည်းသွားပြီး Install & Backup လုပ်တဲ့အလုပ်ကို DBA လို့ခေါ်ရတဲ့အခြေအနေ တစ်ဖြည်းဖြည်း ရောက်လာတော့တာပါပဲ။