سؤال

تحدث المشكلة التالية على جهاز يعمل على تشغيل Ubuntu 10.04 باستخدام kernel 2.6.32-22-generic: لا يبدو أن تحديد حد لحجم مجموعة المقيمين (RSS) لعملية ما له أي تأثير. أقوم حاليًا بتعيين الحد الأقصى في Python مع الكود التالي:

import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000   # this should fail

القائمة ، الذاكرة _sink ، تنجح في كل مرة. عندما أتحقق من استخدام RSS مع TOP ، يمكنني بسهولة الحصول على العملية لاستخدام 1 جيجابايت من ذاكرة الوصول العشوائي ، مما يعني أن الحد لا يعمل. هل لا تعمل حدود RSS مع هذه النواة أو التوزيع؟ إذا كان ذلك مفيدًا ، فإن Resource.rlimit_nproc (حد عملية المستخدم) يعمل.

هل كانت مفيدة؟

المحلول

تشكيل manpage getRlimit:

RLIMIT_RSS
Specifies the limit (in pages) of  the  process's  resident  set
(the  number of virtual pages resident in RAM).  This limit only
has effect in Linux 2.4.x, x < 30, and there only affects  calls
to madvise(2) specifying MADV_WILLNEED.

يبدو أن هذا غير مدعوم على Linux kernel 2.6.

نصائح أخرى

يمكنك إنجاز هذا باستخدام Cgroups. النسخة الطويلة على بلدي مقالات, ، لكن النسخة القصيرة (التي تم اختبارها على Ubuntu 11.04) هي:

  • تحميل هذا cgroup-bin حزمة.

  • يحرر /etc/cgconfig.config وإنشاء مجموعة مع ذاكرة محدودة. على سبيل المثال ، أضفت:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • يجري

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

لقد لاحظت عملي مع RSS من 93M عندما طلبت منها استخدام 50 مترًا فقط ، لكن هذه لم تكن مشكلة بالنسبة لي ، لأن هدفي كان مجرد الحصول على البرنامج إلى الصفحة.

cgclassify يتيح لك إرفاق قيود على عملية تشغيل أيضًا. ملاحظة بالنسبة لـ RSS ، ينطبق هذا فقط على الذاكرة المخصصة بعد أن يدخل التقييد حيز التنفيذ.

الحد الأقصى ذي الصلة - الذاكرة الظاهرية أو مساحة العنوان (RLIMIT_AS) - يعمل. هذا يسمح بالحد من عملية بيثون وذاكرة العمليات الفرعية بدون أدوات خارجية.

>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

من صفحة الرجل:

rlimit_as. الحد الأقصى لحجم الذاكرة الافتراضية للعملية (مساحة العنوان) بالبايت.

فيما يلي تفسير جيد للفرق بين مجموعة المقيمين وحجم VM - ما هو RSS و VSZ في إدارة ذاكرة Linux.

لقد قمت بإنشاء برنامج نصي للحد من استخدام الذاكرة باستخدام Cgroups و Cgroup Manager ، وهو قابل للاستخدام للأوامر المخصصة وعدم الحاجة إلى امتيازات الجذر. نرى https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-total-ferces-of-a-process-and-its-children/174894#174894

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top