vMotion چیست؟ ویژگی VMware vSphere vMotion یکی از مهمترین قابلیتها در زیرساختهای مجازی امروز است. از زمان ایجاد این راهکار در سال 2002 و انتشار آن در سال 2003، به کاربران توانایی انتقال وضعیت فعال ماشینهای مجازی را از یک ESXi Host فیزیکی به دیگری داده است. امروزه، توانایی انتقال آسان ماشینهای مجازی بخشی اساسی از تقریباً هر پیادهسازی مجازیسازی می باشد. قابلیت پورتال بودن Workload زیربنایی برای تجربهی Hybrid Cloud حقیقی است، زیرا میتوان با استفاده از VMware Hybrid Cloud Extension یا HCX ،Workloadها را بین Cloudهای On-Premises و عمومی جابهجا نمود. vSphere vMotion هنوز یکی از بااهمیتترین عوامل در صنعت IT است و همواره همینقدر مهم خواهد بود. در طول سالها توسعههای زیادی در موارد داخلی vMotion برای پشتیبانی از تکنولوژیهای جدید، رخ داده است.
در این مقاله روی انتقالهای محدود به رایانش تمرکز خواهد شد که در آنها vMotion استاندارد، وضعیت رایانش Active را از یک ESXi host منبع به مقصد انتقال میدهد. همچنین میتوان یک Storage vMotion را انجام داد که وقتی با vMotion رایانش ترکیب شود، یک XvMotion محسوب میگردد. از انواع دیگر vMotion میتوان به Long Distance vMotion و Cross vCenter vMotion اشاره کرد که هر دو عملیاتِ vCenter Server هستند که در سمت ESXi از فرایند vMotion رخ میدهند. مطالعهی این مقاله به کاربران درک بهتری از «جادویی» میدهد که در پسزمینهی انتقال یک ماشین مجازی اتفاق میافتد.
فرایند vMotion
وقتی انتقال یک ماشین مجازی آغاز میشود، VCenter Server Instance یک Task انتقال که long-running نام دارد را اجرا میکند. اولین مرحله، انجام بررسی تطبیقپذیری است. آیا ممکن است که ماشین مجازی روی Host مقصد اجرا شود؟ ممکن است محدودیتهایی جلوی انتقالبدون خاموشی سرور و یا Live Migration را بگیرند. سپس باید به ESXi Hostهای مبدأ و مقصد گفت که چه اتفاقی در حال رخ دادن است. مشخصات انتقال که حاوی اطلاعات زیر است، ایجاد میگردد:
- ماشین مجازی که در حال منتقل شدن بهصورت Live Migration است.
- تنظیم آن ماشین مجازی (سختافزار مجازی، گزینههای VM، غیره.)
- ESXi Host مبدأ
- ESXi Host مقصد
- جزئیات شبکهی vMotion
ویدیوهای بیشتر در باره vMotion
مشخصات انتقال توسط vCenter Server Instance با ESXi Hostهای مبدأ و مقصد به اشتراک گذاشته میشود و اطمینان حاصل میگردد که تمام اطلاعات ضروری جابهجا شدهاند تا فرایند انتقال آغاز گردد. vCenter Server با استفاده از Virtual Provisioning X Daemon یا VPXD با ESXi Hostها ارتباط برقرار میکند که Virtual Provisioning X Agent یا VPXA را که ESXi Hostها را اجرا مینماید، فرا میخواند. VPXA به پیامهایی که از سوی VPXD میآید گوش میدهد، مشخصات انتقال را دریافت میکند و آنها را از طریق Hostd به فرایند VMX منتقل مینماید. Host Daemon یا همان Hostd اطلاعات و دسترسی مخصوص Host برای مدیریت را که شامل Telemetry ماشین مجازی مثل VMstate است حفظ میکند. وقتی که انتقالی شروع میشود، Hostd ماشین مجازی را در یک وضعیت متوسط قرار میدهد تا تنظیم ماشین مجازی را نتوان در طول انتقال تغییر داد.
فرایند Virtual Machine Monitor یا VMM مسئول مدیریت حافظهی ماشین مجازی است و درخواستهای I/O شبکه و Storage ماشین مجازی را به VMkernel منتقل میکند. درخواستهای I/O دیگر که برای عملکرد حیاتی نیستند توسط VMM به VMX، Forward میشوند. فرایند Virtual Machine Extension یا VMX در VMkernel اجرا میشود و مسئول رسیدگی I/O برای دستگاههایی است که برای عملکرد حیاتی نیستند. باید توجه داشت که VMM تنها در ESXi Hostهای مبدأ در طول انتقال مورد استفاده قرار میگیرد، زیرا حافظهی فعال ماشین مجازی در آنجا قرار دارد.
پس از انجام این کار، ماژول انتقال VMkernel روی ESXi مبدأ، Socketهایی را روی شبکهی دارای vMotion فعال باز میکند تا ارتباط با ESXi Host مقصد تنظیم گردد.
بیشتر بخوانید: رفع آسیب پذیری Use-After-Free در ESXi Hypervisor
مرحلهی آمادهسازی به مرحلهی پیش از کپی
تا اینجا تمام فرایندها و مسیرهای ارتباطی برای شروع Live Migration آماده هستند. مرحلهی آمادهسازی یعنی اطمینان حاصل کردن از اینکه ESXi Host مقصد از قبل منابع رایانش را برای ماشین مجازی که قرار است منتقل شود، تخصیص میدهد. همچنین ماشین مجازی روی ESXi Host مقصد ایجاد میشود، تمام اطلاعات در مورد تنظیم ماشین مجازی از قبل مشخص میباشد، زیرا در مشخصات انتقال گنجانده شده است.
با انجام شدن مرحلهی آمادهسازی، فرایند به مرحلهی پیش از کپی میرسد که در آن حافظه از ESXi Host مبدأ به ESXi Host مقصد منتقل میگردد. نیازی برای ردیابی تمام صفحات حافظهی ماشین مجازی روی ESXi Host مبدأ وجود دارد. با انجام این کار، فرایند vMotion متوجه میشود که کدام صفحات از حافظه در طول انتقال Overwritten شدهاند که تحت عنوان Dirty Pageها شناخته میشوند، زیرا این صفحات حافظه باید به Host مقصد ارسال شوند.
ردیابی صفحه در طول فرایند کپی
در طول فرایند پیش از کپی، vCPUهای مورد استفاده توسط ماشین مجازی موقتاً متوقف میشوند تا ردیابهای صفحه نصب گردند. اکنون ماژول انتقال VMkernel از VMM میخواهد که ردیابی صفحه را شروع کند، زیرا VMM صاحب وضعیت جدول صفحهی ماشین مجازی است. جدول زیر نشان میدهد که وقتی سیستم عامل Guest در طول یک vMotion دادهها را در حافظه مینویسد چه اتفاقی رخ میدهد:
حافظهی تکراری پیش از کپی
ردیابی صفحه یک چرخهی مداوم است، این ردیابی با استفاده از چندین تکرار به سمت همگرایی پیش از کپی حافظه حرکت میکند. اولین تکرار (مرحلهی 1- پیش از کپی)، تمام صفحات حافظهی ماشین مجازی را کپی میکند. تکرارهای بعدی (مرحلهی 0 تا n پیش از کپی) روی کپی کردن Dirty Pageهای حافظهی کار میکند. برای مثال وقتی ما یک ماشین مجازی را با 24GB حافظه بهصورت Live Migration میدهیم، تکرارها چنین شکلی خواهند داشت:
مرحله 1-: کپی کردن 24GB از حافظهی ماشین مجازی و صفحات ردیابی. وقتی حافظه را ارسال میکنیم.
مرحله 0: انتقال مجدد 8GB به Dirty Pageها. در این فرایند، حافظه 3GB دیگر را نیز Dirty میکند.
مرحله 1: ارسال 3GB. در حین انجام شدن انتقال، ماشین مجازی 1GB را Dirty میکند.
مرحله 2: ارسال باقی 1GB.
درحالیکه صفحات حافظه از ESXi Host مبدأ به مقصد کپی میشود، باید مشخص شود که کل حافظه چه زمانی به مقصد کپی خواهد شد. VMM از VMkernel میپرسد که آیا ممکن است فرایند پیش از کپی پس از هر تکرار قطع شود. این امر تنها زمانی ممکن است که تمام تغییرات حافظه (صفحات کثیف) به Host مقصد کپی شوند. بخشی از الگوریتم پیش از کپی حافظهی تکراری این است که تمام صفحات حافظهی مقصد با مبدأ تطابق پیدا کند. با شروع از صفحهی صفر تا حداکثر یا آخرین شمارهی صفحهی حافظه، تمام صفحات حافظه به ترتیب چک میشوند تا مشخص گردد که آیا صفحات مقصد با صفحات مبدأ هماهنگ هستند یا خیر.
برای مشخص شدن اینکه آیا میتوان مرحلهی پیش از کپی را حذف کرد، باید بررسی گردد که آیا میتوان آخرین صفحهی حافظه را در پنجرهی کمتر از 500ms کامل کرد یا خیر. میتوان با استفاده از اطلاعاتی در Tax انتقال این را حساب کرد:
- نرخ انتقال؛ اینکه با چه سرعتی GbEدادههای حافظه بین Hostها کپی میشوند؟
- نرخ صفحهی Dirty (GB/s)؛ اینکه چند صفحهی حافظه توسط سیستم عامل Guest بازنویسی (Over-Write) میگردد؟
- چند صفحه باقی مانده است که باید به Host مقصد منتقل گردد؟
اگر هیچ صفحهای نمانده باشد، تکرار بعدی اتفاق میافتد. اگر نتیجه بله باشد، ماژول انتقال VMkernel فرایند پیش از کپی را قطع میکند.
اکنون اگر نرخ Dirty Page بالاتر از نرخ انتقال باشد، چه اتفاقی میافتد؟ در این صورت، هیچ دلیلی ندارد که تکرار دیگری انجام شود زیرا هرگز نمیتوانیم به همگرایی پیش از کپی حافظه برسیم و انتقال متوقف خواهد شد. به همین دلیل است که در vSphere 5.0، ویژگی Stun During Page Send یا SDPS معرفی شد. SDPS راهی است که VMkernel بتواند به VMM بگوید دستورالعملهای برنامهریزیشده را اجرا نکند، بلکه یک «خواب» خیلی کوتاه را شروع کند. ممکن است به نظر برسد که این امر روی عملکرد Workload تأثیر میگذارد، اما این امر در سطحی جزئی رخ میدهد. این خواب در چند میکروثانیه انجام میشود و به دلیل همین بازههای زمانی خیلی کوتاه است که میتوانیم همگرایی را انجام دهیم و فرایند vMotion با موفقیت کامل میگردد.
اگر نرخ Dirty Pageها بیشتر از نرخ انتقال باشد، SDPS با هر تکرار اجرا میشود. تکرارهای بعدی فقط صفحات حافظهی کثیف را که درطول تکرارهای قبلی اصلاح شده بودند، کپی میکنند. مدت کوتاهتر تکرارها به سیستم عامل Guest فرصت کمتری برای اصلاح کردن یا Dirtyکردن صفحات حافظهی خود میدهد و بدین وسیله تکرار پیش از کپی بعدی را کوتاهتر میکند. بااینکه نوعی هزینهی عملکرد وجود دارد، SDPS معمولاً برای بار کاری قابل تشخیص نیست. هدف همیشه این است که سیستم عامل Guest از انتقال در حال انجام آگاه نباشد.
با قطع شدن انتقال پیش از کپی حافظه توسط فرایند VMM، تمام صفحات حافظه روی ESXi Host مقصد قرار میگیرند. اکنون VMM یک Remote Procedure Call یا RPC را به VMX میفرستد که میگوید VMM میتواند ماشین مجازی مبدأ را به تعلیق درآورد. VMX وارد مرحلهی Checkpoint میشود و در آن ماشین مجازی را به تعلیق درمیآورد و دادههای Checkpoint را به ESXi Host مقصد میفرستد.
در این فرایند، ماشین مجازی روی ESXi Host مقصد De-Mask میشود و با استفاده از دادههای Checkpoint وضعیت بازیابی میگردد. اتفاقی که میافتد این است که ماشین مجازی در مقصد روشن میشود، اما فرایند Boot قطع شده و به سمت صفحات حافظهای که از ESXi Host مبدأ منتقل شدهاند، هدایت میشود. تمام این اتفاقات در 100 تا 200ms رخ میدهد. این زمان، همان Stuntimeی است که ماشین مجازی در حالت اجرا قرار ندارد. مدت این Stuntime به چندین فاکتور مثل سختافزار Host و بارهای کاری Guest پویا بستگی دارد.