یکی از قابلیت های مهم و قدیمی مجازی سازی در محیط VMware vSphere، قابلیت Distributed Resource Scheduler یا همان DRS است.
این ویژگی به شما این امکان را میدهد که بار کاری ماشینهای مجازی را بین سرورهای داخل کلاستر توزیع کنید؛ این موضوع کمک خواهد کرد تا کارایی و اشتراک گذاری منابع در محیط مجازی شما افزایش یابد. توزیع بار کاری ماشینهای مجازی بین سرورهای کلاستر بر اساس 3 پارامتر Memory، CPU و Network انجام می شود که هر کدام جزئیات و تنظیمات پیشرفته مربوط به خود را دارند. اما در این مطلب موضوع بحث ما در ارتباط با یکی از تنظیمات پیشرفته Memory است.
DRS در محیط هایی که فاقد Memory Overcommitment هستند
در بسیاری از محیط های مجازی طراحی ما به صورتی است که ترجیح میدهیم همیشه مقدار حافظه کافی برای اجرا شدن تمام ماشین های مجازی وجود داشته باشد یا به عبارتی Memory Overcommitment نداشته باشیم. در چنین شرایطی بهتر است نکاتی را پیرامون عملکرد vSphere DRS مد نظر قرار دهیم.
همانطور که در شکل زیر مشاهده می کنید از vSphere 6.5 به بعد تنظیماتی در داخل GUI برای این منظور در نظر گرفته شده است؛ در نسخه های قبلی دسترسی به این تنظیمات فقط از طریق Advanced Option امکان پذیر بود.
در قسمت Cluster Setting بخش Additional Options گزینهای وجود دارد تحت این عنوان:
Memory Metric for Load Balancing – Load balance based on consumed memory of virtual machines rather than active memory
در ادامه بررسی خواهیم کرد که این گزینه چیست و فعال سازی آن چه تاثیری در عملکرد vSphere DRS خواهد داشت؟
تاثیر Memory Metric for Load Balancing روی عملکرد DRS
قبل از هر چیز لازم است مروری داشته باشیم بر 3 مفهوم اساسی زیر:
- Configured Memory
- Consumed Memory
- Active Memory
زمان ایجاد ماشین مجازی مقدار حافظه تعریف شده برای ماشین مجازی در قسمت Edit Settings را اصطلاحاً Configured Memory میگوییم. مقدار حافظهای که از زمان بوت شدن ماشین مجازی تا زمان حال مورد دسترسی قرار گرفته و استفاده شده است را Consumed Memory؛ و مقدار حافظهای که به صورت فعال و مدام مورد دسترسی قرار گرفته است را Active Memory میگوییم. واضح است که همواره رابطه زیر برقرار است:
Configured Memory ≤ Consumed Memory ≤ Active Memory
فرض کنید یک ماشین مجازی با 16GB حافظه ساخته ایم. این ماشین مجازی از زمان بوت شدن تا کنون به 75% حافظه تخصیص داده شده خود دسترسی داشته است، اما اخیراً تنها 35% حافظه تخصیص یافته به صورت مداوم مورد دسترسی قرار گرفته است. شکل زیر وضعیت حافظه این ماشین مجازی را به تصویر کشیده است.
به صورت پیش فرض رفتار DRS بر اساس Active Memory تنظیم می شود نه Configured Memory. توجه داشته باشیم که DRS همیشه بر این موضوع تمرکز میکند که در حال حاضر چه اتفاقی در حال رخ دادن است نه اینکه چه Configurationهایی برای ماشین مجازی انجام شده است؛ به عبارتی ملاک حال فعلی ماشین مجازی است نه تنظیمات پیش فرض اولیه ماشین مجازی!
به صورت پیش فرض در زمان عملیات Load Balancing، vSphere DRS شروع به محاسبه مجموع Active Memory ماشینهای مجازی داخل Cluster می کند. با این کار به صورت تقریبی مشخص میشود که کدام بخش حافظه هر سرور به صورت مدام مورد دسترسی قرار می گیرد (Active) و کدام بخش حافظه Idle است. اما این احتمال وجود دارد که در هر لحظه Workload یک ماشین مجازی افزایش داشته باشد و Page های بیشتری از حافظه Idle مورد دسترسی قرار گیرد و Active شوند. برای این منظور DRS، 25% از فضای Idle را به عنوان فضای Idle Consumed در نظر خواهد گرفت. از طرفی همانطور که میدانید هر ماشین مجازی یک Memory Overhead خواهد داشت؛ این عدد نیز با Idle Consumed جمع خواهد شد و حاصل جمع معیار اصلی برای DRS در عملیات Load Balancing حافظه خواهد بود.
همان ماشین مجازی مثال قبل را در نظر بگیرید در این سناریو؛
Configured Memory = 16384 MB
Consumed Memory = 75% * 16384 = 12288 MB
Active Memory = 35% * 16384 = 5734 MB
Idle Consumed Memory = Consumed Memory – Active Memory = 6554 MB
25% * Idle Consumed Memory = 1639 MB
Default Metric used for DRS = 25% * Idle Consumed Memory + Active Memory + Memory overhead = 1639 + 5734 + 90 = 7463 MB
در نهایت در صورت نیاز و برای ایجاد توازن، DRS سروری را برای این ماشین انتخاب خواهد کرد که 7463 MB حافظه خالی برای این ماشین مجازی داشته باشد (فرض کنید که مساله CPU و Network مطرح نیست!).
اما چنانچه طراحی شما به گونهای است که در کلاستر خود Memory Overcommitment ندارید، توصیه شده است که به جای Active Memory، Consumed Memory را معیار عملکرد vSphere DRS قرار دهید. برای این منظور کافی است گزینه Load balance based on consumed memory of virtual machines rather than active memory در بخش Memory Metric for Load Balancing را فعال کنید.
در صورت فعال سازی این گزینه، Consumed Memory + Memory overhead ملاک اصلی تصمیم گیری DRS خواهد بود.
به عنوان مثال در سناریو قبلی DRS بر اساس عدد 12376 MB تصمیم گیری خواهد کرد.
vSphere Client کمک میکند تصویر روشنتری از این شرایط داشته باشیم.
برای این منظور به قسمت Cluster -> Monitor -> vSphere DRS -> Memory Utilization رفته و Memory Metric را تغییر دهید.
همچنین در قسمت Cluster Summery در vSphere DRS Box (شکل زیر) میتوانید شرایط فعلی توازن در محیط کلاستر را مشاهده کنید.
برای اینکه بتوانید تاثیر فعال سازی گزینه Memory Metric for Load Balancing را بهتر درک کنید، به مثال زیر دقت کنید.
در شرایط فوق از نظر Active Memory، سرور esxi2 از سایر سرورها حافظه بیشتری را استفاده کرده است. اما از آنجاکه اختلاف Active Memory بین سرورها کمتر از 20% است و هر ماشین حافظه مورد نیاز خود را دریافت میکند، DRS نیازی به جابجایی ماشینهای مجازی و ایجاد توازن در کلاستر احساس نمیکند. به یاد داشته باشید که ایجاد توازن و جابجایی ماشین ها سرباری را به محیط مجازی تحمیل خواهد کرد، هرچند اندک! در مثال فوق جابجایی یک ماشین مجازی با هدف ایجاد توازن باعث می شود Compute Cycles و پهنای باند شبکه به هدر رود؛ در نتیجه vSphere DRS ترجیح خواهد داد توازن را در همین سطح فعلی حفظ کرده و اقدام به جابجایی ماشینهای مجازی نکند.
اما اگر Consumed Memory را ملاک قرار دهیم، شرایط متفاوت خواهد بود. تفاوت بین سرورها به مراتب بیشتر خواهد بود، بیشتر از 20%.
vSphere DRS به صورت پیش فرض در شرایط عدم توازن بیشتر از 20%، تصمیم به جابجایی و یا اعلام توصیه برای جابجایی ماشین های مجازی خواهد گرفت. این مکانیزم را اصطلاحاً Pair-Wise Balancing مینامند. در مثال فوق اگرvSphere DRS، Active Memory را ملاک قرار دهد، با توجه به اینکه اختلاف بین سرورها کمتر از 20% است، مکانیزم Pair-Wise Balancing فعال نخواهد شد. اما در صورتی که Consumed Memory مبنا باشد، DRS سعی می کند توازن را در کلاستر برقرار کند؛ با کمترین و بهینه ترین تعداد جابجایی.
نتیجه عملکرد DRS در حالتی که Memory Metric for Load Balancing فعال است در شکل زیر قابل مشاهده است.
در نهایت به شما توصیه می کنم در صورتی که شناخت کافی از طراحی محیط مجازی خود دارید و Memory Overcommitment نیز ندارید، حتماً Memory Metric for Load Balancing را فعال کنید. برای کاهش ریسکها توصیه میشود DRS را تا مدتی در وضعیت Manual قرار دهید.