نواصل دراسة مجموعات التحكم (Cgroups) في Red Hat Enterprise Linux 7. لنهتم بالذاكرة.
تتذكر أن هناك تعديلين لتخصيص وقت المعالج: CPUShares لتعيين المشاركات النسبية و CPUQuota من أجل تحديد المستخدم أو الخدمة أو الجهاز الظاهري (VM) في القيم المطلقة (النسبة المئوية) من وقت المعالج. علاوة على ذلك ، يمكن استخدام كل من هذه التعديلات في وقت واحد. على سبيل المثال ، إذا كان لدى المستخدم حصة وحدة المعالجة المركزية بنسبة 50٪ ، فسيتم أخذ كرة وحدة المعالجة المركزية الخاصة به في الاعتبار حتى يحدد حصته بالكامل في 50٪ من وقت المعالج.

أما بالنسبة لذاكرة الوصول العشوائي ، يوفر systemd طريقة واحدة فقط للتكيف ، وهي ...
مقدار الذاكرة التي يمكن تخصيصها لمستخدم أو خدمة. لنفترض أننا نريد قصر المستخدم على 200 ميغابايت من ذاكرة الوصول العشوائي. إذا كنت تتذكر ، فإن UID الخاص به هو 1000 ، لذلك نقوم بإدخال الأمر التالي:
تعيين الخاصية systemctl user-1000.slice MemoryLimit = 200M
يريد mrichter الآن التحقق من حدوده ويطلق ضغط أداة اختبار الضغط ، والذي يبدأ في استهلاك الذاكرة بشكل مكثف. والتوتر ينتج خطأ سريعًا:
وفقًا لسجل النظام ، تم إيقاف الضغط ببساطة بواسطة OOM (Out Of Memory) Killer.
هنا من المهم الانتباه إلى ذلك: بشكل افتراضي ، ينطبق حد ذاكرة الوصول العشوائي (RAM) على الذاكرة المقيمة فقط. أي أنه إذا كانت العملية يمكن أن تذهب إلى ملف المبادلة ("مبادلة") ، فستتجاوز الحد المقرر. في مثالنا ، تحطم الإجهاد لأنه تجاوز الحد المسموح به على الذاكرة المقيمة.
وإذا كنا لا نريد أن يندمج البرنامج في مبادلة؟
هذا ، بشكل عام ، من السهل حظره. حسنًا ، أو سهل نسبيًا ... بشكل عام ، عليك الصعود إلى مكان ما.
هناك إعدادات cgroup التي لا يمكن الوصول إليها إما من خلال الأمر systemctl أو من خلال ملفات الوحدة. ومع ذلك ، يمكن تغيير هذه الإعدادات بسرعة من خلال الملفات الموجودة في المجلد / sys / fs / cgroup /. إليك ما يبدو ، على سبيل المثال ، صرخة المستخدم في الذاكرة:
يسمى الملف المسؤول عن مقدار الذاكرة التي يمكن أن تدخل في عملية التبادل بشكل واضح تمامًا memory.swappiness. دعونا نرى ما بالداخل:
إذا كنت تلعب مع إعدادات kernel والنظام الفرعي للتبديل ، فسترى هنا على الفور القيمة الافتراضية الافتراضية للتبديل. إذا قمت بتغييره إلى الصفر ، فإن وحدة التحكم في ذاكرة الوصول العشوائي للمستخدم ستمنعه عمومًا من استخدام المبادلة.
بالمناسبة ، هنا يمكنك إلقاء نظرة على إحصائيات الذاكرة للمستخدم mrichter:
قيمة المعلمة hierarchical_memory_limit هي نفس MemoryLimit التي حددناها باستخدام الأمر systemctl. تمثل المعلمة hierarchical_memsw_limit الحد الإجمالي (الذاكرة المقيمة والذاكرة في ملف الملف). لقد منعنا المستخدم من استخدام ملف الصفحة ، لذا فإن قيمة هذه المعلمة غريبة جدًا.
الآن عن مشاكل النهج الموصوفة للتو:
- يمكنك فقط إجراء تغييرات على هذه الملفات عندما يقوم المستخدم بتسجيل الدخول إلى النظام. حتى تسجيل الدخول ، ستكون مجموعته غير نشطة.
- لا يتم حفظ هذه الإعدادات بعد إعادة التشغيل. علاوة على ذلك ، سيتم فقدها إذا تحرك المبتكر.
سيساعد البرنامج النصي pam_exec على التعامل مع هذه المشاكل (انظر
access.redhat.com/solutions/46199 للحصول على التفاصيل ).
هذا هو النص البرمجي الذي سننشئه في مجلد / usr / local / bin:
ثم أضف نداءها إلى السطر الأخير من /etc/pam.d/sshd. ونتيجة لذلك ، سيتم تشغيل هذا البرنامج النصي في كل مرة يقوم فيها المستخدم بتسجيل الدخول عبر ssh. هذا هو السبب في أننا نتحقق في البرنامج النصي من أن هذا هو المستخدم ، قبل تغيير الإعدادات.
لذلك ، قمنا بقطع اختصار المستخدم من ملف الصفحة.
بالطبع ، يمكنك الذهاب إلى أبعد من ذلك وتغيير ملفات التكوين الخاصة بالمجموعة النشطة النشطة ، ولكن في الوقت الحالي سنؤجل هذا العمل الخطر. ومع ذلك ، فإن الطريقة العامة لتغيير إعدادات المستخدم هي شيء اكتشفته.
ومع الخدمات ، لا يزال الأمر أسهل. في ملف وحدة الخدمة ، يمكنك استخدام ExecStartPost = التوجيه لتشغيل برنامج نصي يغير الإعدادات. على سبيل المثال ، إليك كيفية تغيير ملف وحدة خدمة foo لإيقاف التبديل:
تشغيل foo - وعدم التبديل:
حسنًا ، اليوم ، ربما ، هذه الشامانية كافية لنا.
ولكن قبل أن ننتهي ، دعنا نتناول وثائق cgroup ، حيث يمكنك العثور على معلومات حول جميع إعدادات المنظم المخفية هذه. يمكنك تثبيت حزمة kernel-doc على جهاز الكمبيوتر الخاص بك ، كما فعلت من خلال تنزيلها من مستودع rhel-7-server-rpms.
بعد التثبيت ، افتح مجلد / usr / share / docs الذي يتوافق مع kernel الخاص بك وانتقل إلى مجلد cgroups ، الذي يحتوي على أحدث المعلومات حول جميع الهيئات التنظيمية.
في المرة القادمة سنتحدث عن I / O. وبالمناسبة ، لقد توصلنا تقريبًا إلى معرفة كيف أدت مجموعات cgg إلى ظهور الحاويات (في الواقع ، تعتبر مجموعات cgroups مكونًا رئيسيًا للحاويات في Red Hat Enterprise Linux و Red Hat OpenShift Platform Platform).