عند الحديث عن مجموعات cgroups ، غالبًا ما يطرح مستخدمو Red Hat نفس السؤال: "لدي تطبيق واحد حساس جدًا من حيث التأخيرات. هل من الممكن استخدام مجموعات cg لعزل هذا التطبيق عن الباقي من خلال ربطه ببعض نوى المعالج؟ "

بالطبع يمكنك ذلك. خلاف ذلك ، لن نختار هذه المشكلة كموضوع لمقال اليوم.
غالبًا ما قيل لنا في مرحلة الطفولة أن المشاركة جيدة وصحيحة. بشكل عام ، كما هي. لكن هناك استثناءات.
كما كتبنا في المنشور
الأول من هذه السلسلة ، افتراضيًا ، تتصرف Red Hat Enterprise Linux 7 مثل الجدة الكروية اللطيفة. بمعنى أنها تحاول توزيع موارد النظام إلى حد ما بين جميع الذين يطلبونها. ومع ذلك ، في الواقع ، لدى الجدات حيوانات أليفة تحصل على المزيد. تترجم إلى مسؤول النظام ، وهذا يعني أن هناك مواقف تكون فيها بعض التطبيقات أو الخدمات أكثر أهمية من غيرها ، لذلك يجب أن تحظى بكل الاهتمام الممكن حتى تكون مستجيبة قدر الإمكان.
تقوم Red Hat Enterprise Linux 7 بهذا في خطوتين:
- نحن نعزل جزءًا من نوى المعالج من أجل نقلها للاستخدام الحصري لمثل هذا التطبيق.
- نقوم بإنشاء مجموعات cgroups وملفات الوحدات التي تربط هذا التطبيق بنوى معزولة.
انحراف صغير عن الأمثلة من هذه الوظائف
لقد غيّر Hat Enterprise Linux 7.4 كيفية عمل الشرائح قصيرة العمر ، مثل جلسات المستخدم. ونتيجة لذلك ، لم يعد بإمكانهم تغيير إعدادات cgroup على الطاير ، أو إجراء تغييرات دائمة على التكوين ، أو إنشاء ملفات منسدلة باستخدام الأمر systemctl set-property. نعم ، إنه عار ، لكن مجتمع تطوير Linux قرر ذلك. الخبر السار هو أن هذه التغييرات لم تؤثر على الخدمة. أي أنه إذا كانت التطبيقات تبدأ وتتوقف من خلال ملفات الوحدة (تعمل كظهور) ، فإن جميع الأمثلة تعمل. بالإضافة إلى ذلك ، يظل من الممكن إنشاء مجموعاتك الخاصة باستخدام الأدوات القديمة مثل cgcreate و cgset ، ثم وضع جلسات المستخدم والعمليات في هذه المجموعات لاستخدام كرات وحدة المعالجة المركزية وعناصر التحكم الأخرى. في الحياة ، كل شيء يتغير ، لذلك يمكننا فقط التكيف وابتكار تقنيات جديدة. والآن ننتقل إلى موضوع اليوم.
بناء الانفصالية بالعزلة
أحد أهم المكونات في نواة لينكس هو مجدول العملية. إذا كان أعمق قليلاً ، فإن العملية هي رمز قابل للتنفيذ يشكل جزءًا من تطبيق أو خدمة. في الواقع ، تتكون العملية من سلسلة من التعليمات التي يقوم بها الكمبيوتر ، أو القيام بهذا العمل أو ذاك ، سواء كان النظر إلى الأختام أو شيء أكثر خطورة.
تتم معالجة هذه التعليمات بواسطة المعالج المركزي ، المعروف أيضًا باسم CPU. على أجهزة الكمبيوتر الحديثة ، تتكون وحدة المعالجة المركزية عادة من عدة معالجات تسمى النوى.
بشكل افتراضي ، يعتبر المجدول كل نواة معالج كواحدة من الوحدات التنفيذية التي يعين لها عمليات جديدة كما تظهر. في هذه الحالة ، يحاول المجدول توزيع العمليات الناشئة بشكل متساوٍ تقريبًا بين النوى ، مع مراعاة الحمل. لسوء الحظ ، لا يمكن إخبار المجدول بأن هذه العملية المحددة ستؤدي في النهاية إلى مجموعة كاملة من العمليات ، وستحتاج هذه المجموعة إلى التنفيذ بمعزل عن العمليات الأخرى ، بمعنى أنه لا يجب أن يكون لديهم نوى معالج مشتركة.
لذلك ، نحتاج إلى إخبار المخطط بطريقة أو بأخرى حتى لا يلمس جزءًا من نوى المعالج ، أي لا يمنحهم أي عمليات تضرب. ثم نحن أنفسنا (أو بمساعدة بعض العمليات الأخرى) سنضع بالقوة تلك العمليات التي نعتبرها ضرورية لعزلها عن مجدول النواة. يمكن القيام بذلك باستخدام معلمة المعزول في سطر تمهيد kernel في ملف تكوين grub. في المثال أدناه ، لدينا جهاز يحتوي على أربعة نواة يوجد عليها ملفان grub: أحدهما يكمن في / etc / default ويسمى grub.noiso (هذا هو النسخ الاحتياطي الافتراضي للتكوين) ، والثاني يكمن هناك ويسمى ببساطة grub بحيث التقطت grub2-mkconfig. تم تحرير هذا الملف الثاني لعزل kernels 1-3 من مجدول العملية.
تحذير: على Red Hat Enterprise Linux 7 ، لن تحتاج أبدًا إلى تعديل ملف grub.conf يدويًا في المجلد / boot. بدلاً من ذلك ، قم بإجراء التغييرات اللازمة على / etc / default / grub ثم أعد إنشاء ملف grub.conf باستخدام الأداة المساعدة المناسبة ، على سبيل المثال ، مثل:
عند استخدام معلمة المعزول ، من الضروري سرد نوى المعالج المحررة مفصولة بفواصل ، يبدأ الترقيم من 0. بعد إعادة تمهيد النظام ، لن يستخدم جدولة العملية هذه النوى لأي شيء ، باستثناء بعض العمليات على مستوى النظام التي يجب أن تكون على كل قلب. للتحقق من نجاح طريقتنا ، سنبدأ عدة عمليات تحميل ثم سننظر في تحميل كل نواة عن طريق الأمر العلوي.
كما ترى ، جلست جميع عمليات التحميل على CPU 0 ، بدلاً من توزيعها بالتساوي عبر النوى الأربعة. لذلك ، سجلنا معلمة التمهيد بشكل صحيح.
ربط العمليات بالنواة باستخدام cpuset
ننتقل الآن إلى الأشياء
التي من الأفضل عدم القيام بها إذا كنت لا تفهم سبب قيامك بذلك ، والتي من الأفضل نشرها في الإنتاج فقط بعد إجراء اختبار شامل .
ما هي هذه التحذيرات؟ إلى حقيقة أننا سنفعل ، بشكل عام ، أشياء بسيطة باستخدام مجموعة أدوات libcgroup ، والتي تم كتابتها حولها في منشور سابق. إذا كنت تتذكر ، فهذه مجرد مجموعة من الأوامر لإنشاء مجموعات cg وتعديلها وتدميرها. في الواقع ، إنها جزء من Red Hat Enterprise Linux 6 ، ولكن يمكن تثبيتها أيضًا على Red Hat Enterprise Linux 7 ، على الرغم من أنه من المحتمل أن تختفي هذه الإمكانية في المستقبل. تذكر بإيجاز التوصيات الرئيسية لاستخدام libcgroup:
- استخدم systemd للتحكم في وحدات تحكم cgroup التي تقع تحت سيطرة systemd نفسها (هذه هي وحدة المعالجة المركزية والذاكرة وحظر الإدخال / الإخراج).
- استخدم أدوات libcgroup لإدارة جميع وحدات تحكم cgroup الأخرى.
- كن حذرًا جدًا بشأن العواقب غير المخطط لها لأفعالك.
كل شيء بسيط مع مفهوم cpuset - هذه قائمة بنوى المعالج (الترقيم ، الاستدعاء ، يبدأ من 0) ، والتي تقبل المهام التي سيتم تنفيذها فقط على هذه النوى. هذه هي نوى المعالج الأكثر شيوعًا ، ويمكن التحكم فيها إما عن طريق جدولة عملية (هذه هي الطريقة التي يتم بها تكوين النظام بشكل افتراضي) ، أو ، على العكس ، يمكن عزلها عن المجدول (كما فعلنا في المثال أعلاه).
دعونا نتحقق من نظام الملفات الدليل / sys / fs / cgroup على النظام من مثالنا. كما ترى ، دليل cpuset موجود بالفعل ، لأن وحدة التحكم هذه جزء من kernel (على الرغم من أنها ليست تحت سيطرة systemd). ومع ذلك ، فإنه لا يحتوي على مجموعات cg حتى الآن ، لذلك لا نرى سوى الإعدادات الافتراضية في هذا الدليل.
تحقق من تثبيت مجموعة أدوات libcgroup على أجهزتنا:
إذا لم يتم التثبيت ، فيمكن إصلاح ذلك بسهولة باستخدام الأمر yum install libcgroup ، حتى لا يلزم إعادة التشغيل.
الآن إنشاء cpuset. للقيام بذلك ، سنستخدم الأوامر التالية لإنشاء مجموعة cgroup جديدة لـ cpuset وتسجيل خصائصها:
ينشئ الأمر Cgcreate مجموعة cg تدعى testet ويضعها داخل وحدة تحكم cpuset. ثم نقوم بتعيين النواة الثالثة من VM الخاص بنا لهذه cpuset الجديدة وتخصيص منطقة NUMA 0 لها. حتى إذا كان نظامك لا يستخدم NUMA (ونظامنا لا يستخدمه فقط) ، فأنت لا تزال بحاجة إلى تسجيل المنطقة ، وإلا فلن تتمكن من تعيين المهام لمجموعة cgroup . تحقق الآن من إنشاء دليل مجموعة الاختبارات على نظام الملفات وشاهد ما بداخله.
كما ترون ، فإن تغييراتنا قائمة ، ولكن حتى الآن لم يتم تنفيذ أي عملية على هذا cpuset. كيف تزرع بعض العمليات هنا؟
هناك عدة طرق للقيام بذلك:
- يمكنك دفع PID لعملية موجودة في ملف المهام. إنه يعمل ، ولكن ليس جميلًا جدًا.
- يمكنك استخدام cgexec وتحديد المجموعة عند بدء العملية. يعمل هذا إذا لم يكن التطبيق خفي ؛ بالإضافة إلى ذلك ، يمكن كتابة كل هذا بشكل جميل في البرنامج النصي لبدء تشغيل التطبيق.
- بالنسبة للتطبيق الذي يتم تشغيله كبرنامج خفي يعمل بنظام d ، يمكنك إنشاء ملف خدمة.
دعونا نرى خيار cgexec.
أطلقنا foo.exe ، بدوره ، أطلق عملية فرعية ، والتي لا تؤدي إلا إلى تحميل المعالج بشكل نشط. يقول خيار - sticky في أمر cgexec أن "أي عملية تابعة يجب أن تبقى في نفس المجموعة cg مثل العملية الأصل". لذا فإن هذا خيار مهم ويجب تذكره. نرى الآن أن عمليتين تدوران في المجموعة ، ونعرف معرفاتهما. نلقي نظرة على القمة:
كما ترى ، تم تحميل CPU 3 الآن إلى مقل العيون ، والباقي يبرد.
وإليك ما يبدو عليه ملف الوحدة لتشغيل نفس التطبيق كخدمة systemd:
هناك ثلاثة أوامر ExecStartPre في ملف الوحدة تقوم بتنفيذ الإعدادات التي تمكنا بالفعل من القيام بها بأيدينا. ثم يأتي الأمر ExecStart الذي يقوم بتشغيل التطبيق. وعندما يتوقف التطبيق ، ينظف أمر ExecStopPost بعده ، ويزيل cgroup.
كما ترى ، في المثال الأخير ، أنشأنا مجموعة cgroup جديدة تسمى set1. قمنا بذلك لإظهار أنه يمكنك الحصول على العديد من مجموعات cg النشطة التي تشترك في نفس وحدة المعالجة المركزية. لمن قد يبدو مفيدا ، ولكن على العكس من ذلك الخلط بين شخص ما.
حسنًا ، هل تعمل؟ يبدو ذلك!
والآن سنكمل عمل خدمتنا ونتحقق من تدمير cgroup:
تنبيه: لا يتم حفظ مجموعات cgroup التي تم إنشاؤها باستخدام cgcreate بعد إعادة التشغيل. لذلك ، يجب وصف إنشاء مثل هذه المجموعات في البرامج النصية لبدء التشغيل وملفات الوحدة.
حتى الآن في ترسانة الخاص بك هناك المزيد من الأدوات للعمل مع المجموعات. نأمل أن يكونوا في متناول اليد!
منشورات مجموعات أخرى من سلسلة Resource Resource لدينا متوفرة على: