Як обмежити використання пам'яті програми?


10

Я витратив 2 години на читання запитань з цього приводу, і все ж є непорозуміння.

У мене цей процес:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Це показує, що він використовує 19.3Mbсистемну пам'ять резидентів (у мене немає файлу підкачки), навколо 1.8%всієї 1GBсистемної пам'яті. Віртуальний розмір 1.39GB?!?. Я читав, що ulimit -mне працює. Люди використовують, ulimit -vнаприклад, налаштування віртуальної пам’яті для цього процесу. Чи є ця віртуальна пам'ять однією з перелічених VSZ ps? Яке значення я повинен встановити, якщо хочу обмежити цей процес, щоб використовувати 100MBмаксимум системну пам'ять. Я прочитав документацію, setrlimitі це здається законним:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Але для інших версій документації цей RLIMIT_ASпараметр встановлює розмір віртуальної пам'яті. Що таке правда?


Зверніть увагу на форматування публікацій.
rozcietrzewiacz

Відповіді:


6

Так, VSZ - це віртуальна пам'ять. Щодо RLIMIT_AS, де ви знайшли параметр, процитований вище? Оскільки setrlimit (2) - це системний виклик Linux, я не бачу, як це могло б контролювати malloc (3), функцію бібліотеки. Натомість він може працювати лише з brk (2), sbrk (2) та mmap (2) - про це також пропонує його сторінка (перевірена науковим Linux). Однак загальний об'єм пам'яті, що вимагається за допомогою цих функцій, - це віртуальна пам'ять, тому RLIMIT_AS дійсно обмежує віртуальну пам'ять. (Це знову ж таки, відповідно до встановленої сторінки setrlimit (2).)

На жаль, ви не можете обмежувати RSS під Linux (це було б ulimit -m). Можна спробувати ulimit -d(RLIMIT_DATA), але це ігнорує mmap (2), зазвичай використовується для великих виділень. Іншою можливістю буде обмеження віртуальної пам’яті, але при такій великій різниці між RSS та VSZ це може бути важко.


Спасибі за вашу відповідь. Абзац із setrlimitсторінки man IEEE/The Open Group 2003 GETRLIMIT(3P)Як я psможу показати мені RSS, але ядро ​​не може застосувати обмеження на нього?
Драгомир Іванов

6
На думку Алана Кокса, це має історичні причини: обчислювати RSS раніше було дорого, тому примусовий контроль обмеження може поставити велике навантаження на ядро; джерело: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . Дивіться також stackoverflow.com/questions/3043709 / ...
Ansgar Esztermann

Розумію. Я думаю, я б пішов з ulimit -dтоді. Програма написана мною, і я не користувався mmap().
Драгомир Іванов

2
Ні, ви зазвичай не (ні sbrk ()), але malloc () може.
Ansgar Esztermann

Розумію. Це дуже прикро. Тож рішенням цього питання тоді є або групи, або опитування використання пам'яті з якоюсь мовою сценарію.
Драгомир Іванов

3

Багато процесів поділяють частину своєї пам’яті з іншими процесами, наприклад, libc використовується майже в кожному процесі, але лише відображається в пам'яті один раз, але він зараховується до використання віртуальної пам'яті кожного процесу. Обмеження використання пам'яті, яке використовується лише певним процесом (в основному RSS), можна здійснити за допомогою груп. Дивіться відповіді про те, як обмежити загальні ресурси (пам'ять) процесу та його дітей, як це зробити. Це обмежить загальну пам'ять процесу та його дітей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.