به طور پیش فرض، Docker Containerها به تمام منابع RAM و CPU میزبان دسترسی دارند. این تنظیمات پیش فرض ممکن است منجر به مشکلات عملکردی شود. بدین معنی که اگر حافظه و مصرف CPU را در Docker محدود نکنید، Docker می‌تواند از تمام منابع سیستم استفاده کند.

در این آموزش، نحوه محدود کردن مصرف حافظه و CPU در Docker Container شرح داده شده است.

 

 

پیکربندی سیستم برای فعال کردن محدودیت منابع

قبل از اینکه بتوانید یک container را با منابع محدود اجرا نمایید، ابتدا بررسی کنید که آیا سیستم شما از این گزینه Docker پشتیبانی می‌کند یا خیر. این راهنما نحوه انجام این کار در اوبونتو و همچنین نحوه فعال کردن این ویژگی را به شما نشان می‌دهد.

1. ابتدا دستور زیر را اجرا نمایید:

sudo docker info

در صورت دریافت خروجی WARNING: No swap limit support، محدودیت منابع به طور پیش فرض فعال نشده است.

 

2. به منظور افزودن این گزینه، فایل پیکربندی grub را به صورت زیر ویرایش کنید (می‌توانید از هر ویرایشگری استفاده نمایید. در اینجا از دستور nano استفاده کرده‌ایم):

sudo nano /etc/default/grub

3. سپس، خط زیر را اضافه کنید:

GRUB_CMDLINE_LINUX="cdgroup_enable=memory swapaccount=1"

4. تغییرات را ذخیره کرده و از فایل خارج شوید.

5. سپس، پیکربندی grub را با دستور زیر به روز نمایید:

sudo update-grub

6. در نهایت، دستگاه خود را مجدداً راه‌اندازی کنید تا تغییرات اعمال شود.

7. به منظور بررسی موفقیت آمیز بودن فعال‌سازی ویژگی مورد نظر، مجدداً دستور docker info را اجرا نمایید.

 

محدود کردن دسترسی به حافظه Docker Container

چندین محدودیت RAM وجود دارد که شما می‌توانید برروی یک Docker Container تنظیم کنید. برخی از آن‌ها عبارتند از:

تنظیم حداکثر مقدار حافظه‌ای که یک contianer می‌تواند استفاده کند.

تعیین مقدار حافظه‌ای که یک Docker Container می‌تواند با دیسک swap نماید.

تعیین محدودیت soft برای مقدار حافظه اختصاص داده شده به یک container.

در ادامه، نحوه پیکربندی محدودیت‌های حافظه Docker نشان داده شده است.

 

تنظیم حداکثر دسترسی به حافظه

به منظور محدود کردن حداکثر میزان استفاده از حافظه برای یک container، گزینه memory-- را به دستور docker run اضافه کنید. شما می‌توانید از میانبر m- نیز استفاده نمایید.

در این دستور، مقدار حافظه مورد نظر برای container مشخص می‌شود.

ساختار این دستور به صورت زیر است:

sudo docker run -it --memory="[memory_limit]" [docker_image]

مقدار memory_limit باید یک عدد صحیح مثبت به همراه b ،k ،m یا g باشد (به ترتیب مخفف بایت، کیلوبایت، مگابایت یا گیگابایت). به عنوان مثال، برای محدود کردن container با 1 گیگابایت RAM، باید "memory = 1g--" را به دستور اضافه کنید.

به عنوان مثال، برای اجرای نمونه‌ای از یک container اوبونتو و تنظیم محدودیت حافظه روی 1 گیگابایت، دستور زیر را اجرا نمایید:

sudo docker run -it --memory="1g" ubuntu

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه عملکرد حافظه Swap در لینوکس

 

تنظیم Swap برای محدودیت حافظه دیسک

استفاده از گزینه swap به شما این امکان را می‌دهد که بتوانید حتی پس از اتمام کل RAM اختصاص یافته به container، داده‌ها را ذخیره نمایید. این کار را با نادیده گرفتن محدودیت حافظه و نوشتن مستقیم برروی دیسک انجام می‌دهد. اگرچه این یک ویژگی مفید است، با این حال توصیه نمی‌شود؛ زیرا عملکرد را کند می‌کند.

به منظور پیکربندی این فضای RAM اضافی، مقدار کل حافظه swap را تعیین نمایید. قبل از انجام این کار، شما باید حداکثر حافظه (memory--) مربوط به مجموعه حافظه non-swap را داشته باشید. swap شامل کل مقدار حافظه non-swap به اضافه مقدار حافظه swap ذخیره شده به عنوان پشتیبانی می‌باشد.

به عنوان مثال، اگر مقدار memory-- را روی 1 گیگابایت تنظیم کنید؛ مانند مثال بالا، مقدار حافظه swap باید بیشتر از آن باشد. به منظور اجرای یک container با 1 گیگابایت حافظه swap اضافی، حافظه swap را روی 2 گیگابایت تنظیم نمایید.

ساختار اجرای یک container با حافظه محدود و حافظه swap اضافی به شرح زیر است:

sudo docker run -it --memory="[memory_limit]" --memory-swap="[memory_limit]" [docker_image]

به عنوان مثال، به منظور اجرای یک container از image اوبونتو با 1 گیگابایت RAM برای استفاده container و رزرو 1 گیگابایت RAM برای حافظه swap، دستور زیر را تایپ کنید:

sudo docker run -it --memory="1g" --memory-swap="2g" ubuntu

توجه: اگر نمی‌خواهید از حافظه swap استفاده نمایید، مقادیر memory-- و memory-swap-- را یکسان قرار دهید.

 

تنظیم محدودیت Soft برروی حافظه Container

محدود سازی مصرف حافظه در یک container با memory-- در اصل تعیین یک محدودیت hard است که نمی‌توان از آن تجاوز کرد. علاوه‌براین، شما می‌توانید با memory-reservation-- نیز یک محدودیت soft تعیین کنید که هنگامی‌که container به نزدیک حد حافظه تعیین شده خود می‌رسد، بدون متوقف کردن هیچ یک از سرویس‌ها، هشدار می‌دهد.

اگر محدودیت‌های memory-- تعیین نشده باشد، تنظیم محدودیت soft با memory-reservation--، فضای container را بطور کامل محدود نمی‌کند. اگر هر دو ویژگی را فعال کرده باشید، محدودیت soft همیشه کمتر از حداکثر ظرفیت فضا است.

به عنوان مثال، برای تعیین رزرو حافظه اوبونتو برروی مقدار 750 مگابایت و تعیین حداکثر ظرفیت RAM برروی مقدار 1BG، از دستور زیر استفاده کنید:

sudo docker run -it --memory="1g" --memory-reservation="750m" ubuntu

 

این مطلب نیز ممکن است برای شما مفید باشد: تنظیم محدودیت استفاده از حافظه و CPU در Docker

 

محدودسازی مصرف CPU برای Docker Container

درست مانند مصرف RAM، هیچ محدودیت پیش فرضی در Docker container برای مصرف CPU میزبان وجود ندارند. اجازه مصرف نامحدود از CPU به container می‌تواند منجر به مشکل شود.

چندین روش برای تعیین میزان اختصاص منابع CPU ماشین میزبان برای containerها وجود دارد.

به عنوان مثال، اگر یک میزبان با 2هسته CPU دارید و می‌خواهید به یک container دسترسی به یکی از آن‌ها را بدهید، از گزینه "cpus=1.0--" استفاده کنید. دستور اجرای یک container اوبونتو با دسترسی به 1 هسته CPU به شرح زیر است:

sudo docker run -it --cpus="1.0" ubuntu

علاوه بر این، شما می‌توانید از گزینه cpu-share-- نیز استفاده نمایید تا بتوانید مقدار بیشتر یا کمتری از چرخه‌های CPU را به container بدهید. به طور پیش فرض، این عدد روی 1024 تنظیم شده است.

به منظور اجرای یک container با دسترسی به کمتر از 1 هسته CPU، دستور زیر را اجرا کنید:

sudo docker run -it --cpus-shares="700" ubuntu

به منظور یافتن گزینه‌های بیشتر برای محدود کردن مصرف CPU، به اسناد رسمی Docker مراجعه نمایید.

 

 

 

منبع:

phoenixnap