الحد الأقصى لمجموعة المقيمين (RSS) ليس له تأثير
سؤال
تحدث المشكلة التالية على جهاز يعمل على تشغيل 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