تحديد استخدام وحدة المعالجة المركزية والذاكرة لأمر ما باستخدام مجموعات التحكم (cgroups) في أوبونتو

إذا تسبب أحد الأوامر في بطء سطح مكتب أوبونتو أو في نقص ذاكرة الخادم، فضع الأمر وعملياته الفرعية في مجموعة تحكم (cgroup) مُدارة بواسطة systemd مع تحديد حصة لوحدة المعالجة المركزية وسقف للذاكرة. في إصدارات أوبونتو الحالية، systemd-run --scopeيُعد هذا الحل الأسرع والأكثر عملية: حيث يبدأ الأمر في نطاق مؤقت، ويطبق systemd الحدود من خلال عناصر تحكم مجموعة التحكم.

يُحدد المثال أدناه حجم العمل بنصف سعة وحدة المعالجة المركزية و1 جيجابايت من الذاكرة. هذه حدود عامة تشمل العمليات الفرعية، ولا تضمن تشغيل البرنامج بسرعة محددة.

لماذا تحتاج العملية إلى حد لمجموعة التحكم (cgroup limit)؟

يمكن لعملية مشغولة أن تتنافس مع التطبيقات التفاعلية، بينما قد تدفع عملية تستهلك الكثير من الذاكرة الجهاز إلى استعادة الذاكرة أو إلى حالة نفاد الذاكرة. تقوم مجموعة التحكم (cgroup) بتجميع عملية مع عملياتها الفرعية حتى يتمكن نظام التشغيل من إدارة هذه المجموعة والتحكم بها. يوفر نظام systemd في أوبونتو واجهة سهلة الاستخدام لهذه الضوابط.

تختلف إعدادات وحدة المعالجة المركزية والذاكرة في طريقة عملها. CPUQuota=50%يحدد هذا الخيار وقت وحدة المعالجة المركزية بنصف سعة وحدة معالجة مركزية واحدة، محسوبًا كمعدل خلال فترة الجدولة. 200%تمثل القيمة 0 وقت وحدتي معالجة مركزية كحد أقصى عند توفرهما. هذا حد أقصى، وليس أولوية لوحدة المعالجة المركزية أو حجزًا لها. MemoryMax=1Gيحدد هذا الخيار حدًا أقصى ثابتًا للذاكرة المخصصة لمجموعة التحكم (cgroup)؛ إذا لم يتمكن عبء العمل من البقاء دونه، فقد تستعيد النواة الذاكرة أو تُنهي عمليةً ما في تلك المجموعة بسبب نفاد الذاكرة. اختر حدًا مع هامش كافٍ للتطبيق والعمليات الفرعية التابعة له.

1. تأكد من أن أوبونتو يستخدم الإصدار الثاني من cgroup

تستخدم أنظمة أوبونتو التي تعتمد على systemd عادةً التسلسل الهرمي الموحد لمجموعات التحكم v2. تأكد من الإعداد النشط قبل الاعتماد على المسارات الموضحة لاحقًا.

stat -fc %T /sys/fs/cgroup
systemctl --version | head -n 1

يجب أن يُظهر الأمر الأول cgroup2fsنوع نظام الملفات. إذا أظهر نوع نظام ملفات آخر، فلن تنطبق مسارات ملفات cgroup v2 المذكورة في هذه المقالة كما هي. قد تظل خصائص systemd مدعومة بتسلسل هرمي مختلف، ولكن استخدم وثائق التوزيعة المطابقة بدلاً من نسخ مسارات v2.

تحقق أيضًا من إصدار systemd الدقيق في حال رفض إحدى الخصائص. يصف دليل نوبل الخاص بنظام أوبونتو CPUQuota=هذه MemoryMax=الخاصية كإعدادات للتحكم في الموارد؛ وقد تتضمن إصدارات أوبونتو الأقدم إصدارات مختلفة من systemd.

2. ابدأ عبء العمل ضمن نطاق محدود

شغّل البرنامج باستخدام الأمر `npm run dev` systemd-run، مع استبدال الملف التنفيذي الحقيقي والوسائط. بالنسبة لأمر في المجلد الحالي، استخدم الأمر `npm run dev` ./ومرّر جميع الوسائط بعده --.

systemd-run --scope \
  -p CPUQuota=50% \
  -p MemoryMax=1G \
  -- ./my-program --input data.csv
طرفية أوبونتو التي تعمل بنظام systemd-run مع ضبط حصة وحدة المعالجة المركزية على 50 بالمائة والحد الأقصى للذاكرة على 1 جيجابايت لأمر ما
قم بتشغيل أمر داخل نطاق systemd مؤقت مع حدود لوحدة المعالجة المركزية والذاكرة.

بالنسبة للأوامر التي يملكها المستخدم، جرّب تشغيلها بدون صلاحيات المستخدم sudoأولاً. إذا أبلغ نظام systemd بأن وحدة التحكم أو الخاصية المطلوبة غير متوفرة، فقد لا يملك مدير المستخدمين صلاحية تفويضها؛ قد يكون إعادة المحاولة بصلاحيات المستخدم الجذر مناسبًا لأحمال العمل على مستوى النظام، ولكنه يُغيّر سياق أمان الأمر. لا تُشغّل برنامجًا غير موثوق به بصلاحيات المستخدم الجذر بشكل عشوائي. إذا كان استخدام مدير النظام بصلاحيات المستخدم الجذر ضروريًا، فاستخدمه sudo systemd-run --scope ...فقط بعد مراعاة هذا التغيير.

تبقى نافذة الطرفية متصلة بالنطاق أثناء تنفيذ الأمر. Ctrl+Cيؤدي الضغط على زر معين إلى مقاطعة العملية الأمامية. النطاق مؤقت ويختفي عادةً بعد انتهاء العمليات. تُعد هذه طريقة ملائمة لبدء أمر ضمن حدود معينة، بدلاً من اعتمادها كسياسة دائمة لعمليات التشغيل اللاحقة.

3. حدد النطاق وافحص حدوده

systemd-runيطبع اسم الوحدة التي ينشئها، وعادةً ما يكون شيئًا مثل run-….scope. أثناء تشغيل الأمر، اعرض شجرة cgroup:

systemd-cgls

حدد نطاق التحكم المؤقت وتأكد من ظهور البرنامج المستهدف والبرامج الفرعية التابعة له ضمنه. هذا مهم لأن البرنامج الفرعي الذي يعمل خارج النطاق لن يكون مشمولاً بنفس حد التحكم (cgroup).

شجرة مجموعة التحكم الطرفية التي تعرض نطاق تشغيل مؤقت يحتوي على برنامج وعمليتين عاملتين
استخدم شجرة cgroup للتأكد من أن البرنامج والعاملين التابعين له مجمعون ضمن النطاق العابر.

استخدم اسم النطاق المطبوع في الأمر التالي. استبدله run-abc.scopeبالاسم الفعلي:

systemctl show run-abc.scope \
  -p ControlGroup -p CPUQuotaPerSecUSec -p MemoryMax

CPUQuotaPerSecUSec=50000يتوافق هذا مع حصة 50% عندما تكون فترة حصة systemd هي 100 مللي ثانية؛ MemoryMax=1073741824أي ما يعادل 1 جيجابايت بالبايت. تُعدّ القيم الفعلية أكثر فائدة من افتراض أن كل مضيف سيقبل كل طلب دون تغيير، لأن مجموعات التحكم الرئيسية ووحدات التحكم المتاحة قد تُقيّد النتيجة الفعلية.

يُظهر الأمر systemctl show قيم ControlGroup وحصة وحدة المعالجة المركزية والحد الأقصى للذاكرة لنطاق مؤقت.
تحقق من مجموعة التحكم المُبلغ عنها في النطاق وحدود وحدة المعالجة المركزية والذاكرة المُكوّنة.

4. تحقق من ملفات مجموعة التحكم في النواة وقم بضبطها بأمان

تُحدد هذه ControlGroupالخاصية مسار مجموعة التحكم (cgroup) بالنسبة إلى /sys/fs/cgroup. قم بتخزينها في متغير shell حتى تتبع الأوامر المسار المُعين فعليًا على جهازك:

UNIT=run-abc.scope
CG=$(systemctl show "$UNIT" -p ControlGroup --value)
printf 'Group: %s\n' "$CG"
cat "/sys/fs/cgroup$CG/cpu.max"
cat "/sys/fs/cgroup$CG/memory.max"

في الإصدار الثاني من cgroup، cpu.maxيحتوي على حصة وفترة زمنية بالمايكروثانية. على سبيل المثال، 50000 100000يعني ذلك 50 مللي ثانية من وقت وحدة المعالجة المركزية في كل فترة 100 مللي ثانية. memory.maxيُظهر الحد الأقصى للذاكرة بالبايت. إذا كانت الملفات مفقودة، فتأكد من أن النطاق لا يزال نشطًا وأن النواة تستخدم الإصدار الثاني من cgroup.

يقوم الطرفية بقراءة قيمتي cpu.max و memory.max من نطاق systemd ضمن مجموعة التحكم sysfs cgroup v2
اقرأ ملفات cgroup v2 الخاصة بالنواة للتحقق من الحصة المحددة وسقف الذاكرة.

إذا قمت بتشغيل وحدة طويلة الأمد مُسماة وتحتاج إلى تعديل حدودها، فإن systemd يدعم تغيير خصائص الموارد على وحدة نشطة، على سبيل المثال sudo systemctl set-property --runtime my-worker.service CPUQuota=50% MemoryMax=1G. ينطبق هذا على مجموعة التحكم (cgroup) الخاصة بتلك الخدمة ويتطلب امتيازات مناسبة. لا يقوم النظام بربط أي عملية قيد التشغيل لمجرد معرفة مُعرّف العملية (PID)؛ بالنسبة للعمليات التي تُنفذ لمرة واحدة، أوقفها بشكل صحيح وأعد تشغيلها من خلال النطاق المحدود. أما بالنسبة للخدمات المستمرة، فقم بتكوين الخصائص في وحدة الخدمة أو في إضافة systemd، ثم أعد تشغيلها خلال فترة صيانة مناسبة.

تحقق من النتيجة

أبقِ عبء العمل نشطًا أثناء فحصه. تأكد من أن systemd-cglsالعملية وفروعها تقع ضمن النطاق المقصود، وأن systemctl showالبرنامج يُبلغ عن الخصائص المطلوبة، وأن الملفات المقابلة cpu.maxموجودة memory.maxبقيم محددة. عند انتهاء العملية، يُزال النطاق المؤقت، لذا قد تختفي ملفات مجموعة التحكم الخاصة بها.

يُحدد نظام الحصص وقت استخدام وحدة المعالجة المركزية، ولكنه لا يضمن نسبة ثابتة على شاشة سطح المكتب، وقد يتسبب حد الذاكرة الأقصى في حدوث أعطال إذا احتاج التطبيق إلى أكثر من هذا الحد. في حال أصبح عبء العمل غير مستقر، أوقفه وارفع الحد إلى قيمة آمنة مُقاسة، أو استخدم MemoryHigh=عتبة ضغط أقل مع حد أعلى MemoryMax=. للاطلاع على السلوك الدقيق، راجع وثائق systemd ونواة النظام المُثبتة لديك؛ المراجع الموثوقة هي دليل تشغيل systemd في أوبونتو ، ودليل التحكم في موارد systemd في أوبونتو ، ووثائق cgroup v2 لنواة لينكس .

اترك تعليقاً

كيفية تحويل الجهد والتيار ثلاثي الأطوار، و kW، و kVA، ومعامل القدرة

كيفية تحويل الجهد والتيار ثلاثي الأطوار، و kW، و kVA، ومعامل القدرة

تعلم صيغ التيار ثلاثي الأطوار المتوازنة وقم بتحويل جهد الخط والتيار و kW و kVA ومعامل القدرة خطوة بخطوة، مع مثال عملي وحدود للتحقق منها.

تحديد استخدام وحدة المعالجة المركزية والذاكرة لأمر ما باستخدام مجموعات التحكم (cgroups) في أوبونتو

تحديد استخدام وحدة المعالجة المركزية والذاكرة لأمر ما باستخدام مجموعات التحكم (cgroups) في أوبونتو

قم بتشغيل حمل عمل داخل نطاق systemd مع CPUQuota و MemoryMax، ثم تحقق من الحدود من خلال cgroup v2.

تشفير نظام أسماء النطاقات (DNS) الخاص بـ Pi-hole على خادم Ubuntu 24.04

تشفير نظام أسماء النطاقات (DNS) الخاص بـ Pi-hole على خادم Ubuntu 24.04

قم بإعداد dnscrypt-proxy كجسر DoH محلي لـ Pi-hole على Ubuntu 24.04، مع مستمع محلي فقط، واختيار محلل، وعمليات فحص قبل تبديل DNS.

تفعيل إيماءات لوحة اللمس في أوبونتو 24.04 على وايلاند

تفعيل إيماءات لوحة اللمس في أوبونتو 24.04 على وايلاند

تحقق من إعدادات لوحة اللمس في أوبونتو، وتأكد من تثبيت Wayland، واختبر خاصية التمرير المدمجة في GNOME قبل استكشاف أخطاء التطبيقات أو الأجهزة وإصلاحها.

قم بإنشاء مرآة RAID 1 لنظام Debian 12 باستخدام mdadm

قم بإنشاء مرآة RAID 1 لنظام Debian 12 باستخدام mdadm

قم بإنشاء مصفوفة بيانات Debian 12 RAID 1 ثنائية الأقراص والتحقق منها، وقم بتهيئتها بأمان، وقم بتكوينها للتجميع والتركيب بعد إعادة التشغيل.

تشفير ملف التبديل في دبيان 12 باستخدام مفتاح جديد عند كل عملية تشغيل

تشفير ملف التبديل في دبيان 12 باستخدام مفتاح جديد عند كل عملية تشغيل

قم بإعداد تشفير المفتاح العشوائي لقسم التبديل الحالي في Debian 12، وتحقق من تعيين dm-crypt النشط، وافهم المفاضلة المتعلقة بالسبات.

كيفية تقييد مستخدمي SSH بمجلدات محددة على نظام Ubuntu 24.04 (دليل SFTP Chroot)

كيفية تقييد مستخدمي SSH بمجلدات محددة على نظام Ubuntu 24.04 (دليل SFTP Chroot)

تقييد حسابات SSH في Ubuntu 24.04 إلى مجلدات SFTP المحددة باستخدام chroot والأذونات المناسبة وقواعد المطابقة والاختبارات الآمنة - دون منح الوصول إلى shell.

قم بإلغاء قفل APT الخاص بنظام Ubuntu بأمان وأكمل التحديث

قم بإلغاء قفل APT الخاص بنظام Ubuntu بأمان وأكمل التحديث

ابحث عن العملية التي تمتلك قفل واجهة dpkg الأمامية في Ubuntu، ودع عمل الحزمة يكتمل، وقم بإصلاح عمليات التثبيت المتقطعة دون حذف ملفات القفل.

كيفية إعداد لقطات Btrfs تلقائية على سطح مكتب أوبونتو

كيفية إعداد لقطات Btrfs تلقائية على سطح مكتب أوبونتو

قم بإعداد لقطات نظام Btrfs المجدولة على سطح مكتب Ubuntu باستخدام Timeshift، وتحقق من تخطيط وحدة التخزين الفرعية في Ubuntu، واختر فترة الاحتفاظ، وافهم ما لا يمكن للقطات حمايته.

كيفية ترحيل دبيان 12 إلى الإصدار التجريبي دون الإخلال بالتبعيات

كيفية ترحيل دبيان 12 إلى الإصدار التجريبي دون الإخلال بالتبعيات

خطط لعملية ترحيل أكثر أمانًا من Debian 12 إلى Testing: قم بالترقية من خلال Stable، وقم بعمل نسخة احتياطية، ونظف مصادر APT، وقم بمحاكاة تغييرات التبعية، وتحقق مما تغير.