الشهر الماضي تحدثت في ApacheCon عن Cgroups. يبدو أن عددًا قليلاً جدًا من مستخدمي Linux (بمن فيهم كاتب هذه السطور حتى وقت ليس ببعيد) على دراية بـ Cgroups وقوتها. هذا أمر مؤسف، لأن Cgroups قوية جداً، وتتيح لك تخصيص الموارد على خوادمك بطريقة أكثر دقة بكثير من أي أداة أخرى متاحة في مجموعة أدوات Linux. علاوة على ذلك، فهي مدمجة مباشرة في النواة وتأتي جاهزة للاستخدام مع معظم توزيعات Linux.
في هذه المقالة سأغطي كيفية استخدام Cgroups مع Docker كمتابعة لحديث آخر ألقيته في Docker Meetup في أوستن، تكساس.
تتطلب هذه المقالة بعض الفهم الأساسي لـ Cgroups. إذا كنت جديداً تماماً على Cgroups، فإنني أوصيك بالاطلاع على عرض الشرائح الخاص بي من ApacheCon بالإضافة إلى الموارد الموجودة في النهاية. لا تقلق، فلن نتعمق كثيراً. إذا قمت فقط بإلقاء نظرة سريعة على عرض الشرائح، فستتمكن من استيعاب المفاهيم الأساسية.
Docker و Cgroups
يأتي Docker مع برنامجين تشغيليين مختلفين: LXC و libcontainer. برنامج التشغيل LXC هو البرنامج القديم، و libcontainer هو البرنامج الجديد والافتراضي. في معظم الحالات، يفضل استخدام libcontainer، حيث يحدث الابتكار هناك (على سبيل المثال docker exec لا يعمل مع برنامج تشغيل LXC).
ومع ذلك، من المهم ملاحظة أن هناك برنامجين تشغيليين مختلفين، حيث لم يتم نقل جميع إمكانيات Cgroup إلى libcontainer بعد (أو على الأقل لم يتم توفيرها لـ Docker). عند استخدام برنامج تشغيل LXC، فإنك ببساطة تمرر وسيطات LXC مباشرة، بينما مع libcontainer هناك وسيطات سياسة Cgroup صريحة مكشوفة لـ Docker. ستحتاج إلى تعيين برنامج التشغيل صراحةً عند تشغيل daemon الخاص بـ Docker، لذا لا يمكنك تشغيل البرنامجين في نفس الوقت.
إليك مثال على كيفية التحقق:
[bash light=”true”] # مع برنامج تشغيل LXC$ docker run -d –name=’lxc_test’ \
–lxc-conf="lxc.cgroup.cpu.shares=50" \
busybox
# مع برنامج تشغيل libcontainer
$ docker run -d –name=’libcontainer_test’ \
–cpu-shares=50 \
busybox
[/bash]
إليك نظرة عامة على بعض ميزات Cgroup وكيفية توافقها بين برنامجي التشغيل:
| الميزة | Libcontainer | LXC |
|---|---|---|
| حصة وحدة المعالجة المركزية النسبية | -c, –cpu-shares | –lxc-conf=”lxc.cgroup.cpu.shares” |
| القفل على نواة وحدة معالجة مركزية | –cpuset-cpus | –lxc-conf=”lxc.cgroup.cpuset.cpus” |
| تحديد الذاكرة | -m, –memory | –lxc-conf=”lxc.cgroup.cpuset.mems” |
LXC
إذا كنت ترغب في استخدام برنامج تشغيل LXC لـ Docker، فستحتاج أولاً إلى تمكينه. تختلف طريقة القيام بذلك اعتماداً على توزيعة Linux الخاصة بك، ولكن إليك الإرشادات حول كيفية تمكين برنامج تشغيل LXC على Ubuntu 14.04.
كما ذكرنا أعلاه، فإنك تتخلى عن عدد من الميزات عند القيام بذلك. وبالتالي، ما لم تكن بحاجة فعلاً إلى وظيفة لم يتم كشفها بعد في Docker باستخدام libcontainer، فيجب عليك حقاً الالتزام ببرنامج التشغيل الافتراضي.
تتضمن بعض سياسات Cgroup المفيدة التي لم يتم كشفها بعد في libcontainer تحديد معدل الإدخال/الإخراج (I/O throttling) (المغطى في عرض التقديم)، والذي يمكن أن يكون مفيداً جداً لبعض التطبيقات.
إذا قررت استخدام برنامج تشغيل LXC، فإن إضافة الوسيطات أمر مباشر وسهل. كل ما عليك فعله هو إضافة الوسيطة --lxc-conf وتمرير سياسة Cgroup التي ترغب في تعيينها.
Libcontainer
كما ترى في الجدول أعلاه، فإن سياسات Cgroup الأساسية مكشوفة بالفعل في الإصدار الحالي من Docker (1.6 حتى وقت كتابة هذا التقرير).
استخدام هذه السياسات بسيط للغاية. إذا كنت تريد على سبيل المثال قفل حاوية Docker على نواة وحدة المعالجة المركزية الأولى، فستقوم بإضافة --cpuset-cpus=0 إلى أمر docker run الخاص بك.
يمكنك أيضاً استخدام وسيطة --cgroup-parent مع libcontainer وتعيين قيود موارد أكثر دقة يدويًا. ستقوم بعد ذلك بربطها بتلك المجموعة باستخدام الوسيطة.
عرض توضيحي: Docker مع Cgroups
في تسجيل الشاشة أدناه، سنستخدم حاويتي Docker (‘low_prio’ و ‘high_prio’). نستخدم حاوية الأساس ‘busybox’ ونقوم بتشغيل md5sum /dev/urandom لمحاكاة عملية تستهلك الكثير من موارد المعالج (CPU). بشكل افتراضي، سيؤدي هذا إلى استهلاك جميع موارد المعالج المتاحة. ومع ذلك، سنقوم بتطبيق سياستين من سياسات Cgroup لإدارة الموارد. أولاً، نستخدم ‘cpuset.cpus’ لقفل الحاويات على نفس نواة المعالج (النواة 0).
بعد ذلك، نستخدم ‘cpu.shares’ لتعيين حصة نسبية من المعالج (CPU). نعطي الحاوية ‘low_prio’ القيمة 20 والحاوية ‘high_prio’ القيمة 80. وهذا يعني أنه سيتم تخصيص 20% من المعالج للحاوية ‘low_prio’، وسيتم تخصيص 80% من المعالج للحاوية ‘high_prio’. يرجى ملاحظة أن الحصة النسبية هي مقياس عشوائي (كان بإمكاننا أيضاً استخدام القيمتين 2 و 8).
بعد أن أثبتنا أن إدارة الموارد تعمل بالفعل، سنقوم بتشغيل نفس المجموعة من الحاويات دون أي سياسات Cgroup لنرى كيف تتصرف.
كمرجع، إليك الأوامر المستخدمة لتشغيل الحاويات.
[bash light=”true”] $ docker run -d \–name=’low_prio’ \
–cpuset-cpus=0 \
–cpu-shares=20 \
busybox md5sum /dev/urandom
$ docker run -d \
–name=’high_prio’ \
–cpuset-cpus=0 \
–cpu-shares=80 \
busybox md5sum /dev/urandom
[/bash]
ملخص
إذا كنت تدير حاويات Docker متعددة على نفس المضيف، فإن استخدام Cgroups لإدارة الموارد بين الحاويات أمر منطقي للغاية. على سبيل المثال، ربما يكون لديك بعض مهام المعالجة الخلفية التي تعمل في حاوية واحدة، وحاوية أخرى تقدم محتوى للمستخدمين. في هذه الحالة، يمكنك استخدام معرفتك المكتسبة حديثاً لضمان إعطاء الأولوية للحاويات التي تواجه المستخدم قبل المهام الخلفية.
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.