Gholamhossein Tavasoli
Gholamhossein Tavasoli
خواندن ۴ دقیقه·۵ سال پیش

بررسی مقاله: Unikernels: The Next Stage of Linux’s Dominance

لینوکس یک سیستم‌عامل همه‌منظوره است. «درواقع برای رسیدن به این هدف هسته لینوکس به‌طور پیوسته در حال گسترش است تا بتواند از عملکردهای بیشتری پشتیبانی کند.» سؤالی که پیش می‌آید این است که «آیا یک kernel به‌تنهایی می‌تواند محدوده وسیعی از شرایط و موارد استفاده را به‌صورت بهینه هندل کند؟»

نکته جالب‌تر اینجاست که در حال حاضر برای برخی کاربردها، هسته لینوکس مشکل‌ساز می‌شود! برای نمونه در کاربردهایی که به I/O با کارایی بالا نیاز است از چارچوب‌هایی مثل DPDK و SPDK استفاده می‌شود. این چارچوب‌ها kernel را دور زده (bypass) و مستقیم به سخت‌افزار دسترسی پیدا می‌کنند!

از زاویه‌ای دیگر اگر به مسئله نگاه کنیم غالباً سرورهایی که راه می‌اندازیم، تک کاربردی هستند. به این معنی که سرور من فقط قرارِ وب سرور، سرور ایمیل، سرور FTP و … باشه. برای همین بر روی یک سرور اختصاصی چندین سرور مجازی بارگذاری می‌کنیم. (اصلاً یکی از دلایل به وجود آمدن Container ها همینه) به‌خصوص «در سیستم‌های ابری برای رعایت نکات امنیتی برنامه‌های کاربر در درون یک ماشین مجازی اختصاصی اجرا می‌شود» غالباً (و به‌طور روزافزون) این «برنامه‌ها به‌صورت تک پردازه‌ای و در عوض به‌صورت موازی در VMهای مجزا اجرا می‌شوند.»

در پاسخ به این مسائل پژوهش‌ها پیرامون ایده Library OS یا همان unikernelها از سر گرفته‌شده است. unikernel مدلی است که در آن برنامه کاربردیِ هدف با kernel ویژه‌ای لینک می‌شود و به‌طور مستقیم بر روی سخت‌افزار فیزیکی یا مجازی مستقر می‌شود. از مزایای unikernelها می‌توان به موارد زیر اشاره کرد:

  1. سرعت بوت بسیار بالا – بیشتر به دلیل حجم image بسیار پایین
  2. امنیت – به دلیل isolation ای که VM ها دارند
  3. بهره برداری از منابع
  4. کارایی بالا I/O – برای مثال دور زدن kernel و انجام I/O در فضای کاربر

مشخصات مقاله

نوع: کنفرانس (HotOS19)
نویسندگان: Ali Raza, Parul Sohal, James Cadden, Jonathan Appavoo, Ulrich Drepper, Richard Jones, Orran Krieger, Renato Mancuso, Larry Woodman
لینک دانلود مقاله: اینجا

مسئله

در حال حاضر ساخت یک unikernel به دو روش امکان‌پذیر است. در روش اول (clean slate) هسته از ابتدا ساخته می‌شود (مثل MirageOS) و در روش دوم (strip down) هسته موجود تکه‌تکه شده و عملکردهای اضافی آن حذف می‌شود (مثل RumpRun که نسخه بسیار کوچک‌شده NetBSD است). از طریق روش اول می‌توان به ماکزیمم بهینه‌سازی رسید ولی در سازگاری برنامه‌های کاربردی موجود با یک هسته سفارشی به مشکل می‌خوریم. در عوض مزیت روش دوم این است که انتقال برنامه‌های کاربردی موجود به unikernel راحت‌تر قابل انجام است. سؤال اینجاست که آیا می‌شود از لینوکس یک unikernel ساخت؟

نوآوری

اهداف در این کار عبارت است از:

  • اغلب برنامه ها و کتابخانه های سطح کاربر باید قابلیت لینک شدن به این unikernel را داشته باشد.
  • سربار ring transition (جابجایی میان لایه های حفاظت) حذف شود.
  • امکان بهینه سازی کد هسته و برنامه کاربردی به طور همزمان
  • حداقل تغییرات در کد منبع لینوکس ایجاد شود. (طبق چیزی که در مقاله ادعا شده برای تبدیل هسته لینوکس به unikernel تنها ۱۱ خط از کد هسته تغییر و ۲۰ خط جدید به آن اضافه شده است)

فرایند ساخت UKL (Unikernel Linux) شامل چهار گام است:

  1. کامپایل glibc برای بدست آوردن فایل های Object بدون لینک کردن (۲ دقیقه روی یک لپ تاپ معمولی)
  2. کامپایل برنامه کاربردی برای بدست آوردن فایل های Object بدون لینک کردن
  3. کامپایل کتابخانه UKL به فایل Object
  4. ساخت هسته لینوکس با انتخاب گزینه UKL در پیکربندی (با این کار کلیه Object های تولید شده با هم لینک می شوند.)

تحلیل

خوب به‌سلامتی لینوکس هم می‌تونیم به‌صورت Unikernel داشته باشیم! ظاهراً چالش‌هایی در رابطه با امنیت در مورد unikernel وجود دارد (نیاز به مطالعه بیشتر دارم) ولی حداقل الان می‌توانیم برنامه‌های کاربردی تحت Linux را به‌راحتی در قالب Unikernel ارائه کنیم.

هرچند هدف نویسنده مقاله تنها بهبود کارایی نبوده ولی در یک مورد آزمایشی که در مقاله بررسی‌شده (یک Echo Server ساده) ۵۰ درصد میانگین تأخیر پاسخگویی و ۴۱ درصد تأخیر انتهایی (Tail Latency – راجع بهش در پست دیگه ای صحبت می‌کنم) بهبودیافته است.

توزیع احتمال تجمعی برای یک Echo Server سطح کاربر و UKL
توزیع احتمال تجمعی برای یک Echo Server سطح کاربر و UKL

این مقاله دو روش برای رفع مشکل ring transition مطرح کرده است. یکی ترکیب برنامه با هسته به‌عنوان ماژول هسته (Kernel Module) و دیگری این‌که به برنامه کاربردی اجازه دهد در ring صفر کنار دست هسته اجرا شود. هر دو این روش‌ها بخصوص دومی نیاز به بررسی امنیتی و پایداری بیشتر دارد.

مقاله از هیچ‌کدام از این دو روش استفاده نکرده است و روش سومی ارائه داده که به نظرم خیلی بیشتر نیازمند توجه و بررسی امنیتی است. در این روش هسته به‌صورت ایستا به برنامه کاربردی لینک شده و تنها آن را اجرا می‌کند.

http://gtavasoli.com/programming/%d8%a8%d8%b1%d8%b1%d8%b3%db%8c-%d9%85%d9%82%d8%a7%d9%84%d9%87-%d9%84%db%8c%d9%86%d9%88%da%a9%d8%b3-unikernels-the-next-stage-of-linuxs-dominance/



linuxلینوکسسیستم عاملماشین مجازی
فعلا چیزی برای گفتن ندارم. ان شاء الله تا بعد...
شاید از این پست‌ها خوشتان بیاید