Обмеження процесів не більше 10% від використання процесора


32

Я працюю в системі Linux, яка має багато користувачів, але іноді трапляються зловживання; де користувач може запустити єдиний процес, який використовує більше 80% процесора / пам'яті.

То чи існує спосіб запобігти цьому, обмеживши кількість використання процесора, який може використовувати процес (наприклад, до 10%)? Я знаю cpulimit, але це, на жаль, застосовує обмеження до тих процесів, які я доручаю обмежувати (наприклад, поодинокі процеси). Отже, моє запитання полягає в тому, як я можу застосувати обмеження до всіх запущених процесів і процесів, які будуть виконуватися в майбутньому, не потребуючи, наприклад, надання їх id / path?


У вас виникають проблеми з продуктивністю? чи це просто цифри, які вас турбують?
ctrl-alt-delor

Проблеми @richard Performance, тому я намагався вбити / обмежити / покласти край процесам, які, здається, використовують багато процесора, але я вже це зробив, написавши bash-скрипт. Це також віртуальна машина, якщо це допомагає
Джованні Мунір

2
Будьте уважні до вбивства процесів, які можуть бути на 100% протягом дуже короткого часу, також системних процесів. Розглянемо cpulimitразом із пошуковим сценарієм. Складіть політику та рекомендуйте використовувати cpulimit, а потім шукайте понад 10%, а потім обмежте до 5% (тому користувачі рекомендують використовувати cpulimit). Також переконайтесь, що ви можете виявити кілька процесів, додаючи до 10% для одного користувача.
ctrl-alt-delor

@richard Дякую Річард за всі ці досить корисні коментарі! Вони мені дуже допомогли! Ваша пропозиція використовувати cpulimitнабагато краще, ніж просто вбити процес, оскільки він може бути перезапущений користувачем пізніше (як зазначено в одному з ваших коментарів). Дякую!
Джованні Мунір

Відповіді:


20

Хоча це може бути зловживанням для пам’яті, це не для процесора: коли процесор простоює, запущений процес (маючи на увазі, що «процес не чекає вводу / виводу або чогось іншого)» 100% час процесора за замовчуванням. І немає ніяких підстав застосовувати ліміт.

Тепер ви можете встановити пріоритети завдяки nice. Якщо ви хочете, щоб вони застосовувались до всіх процесів для певного користувача, вам просто потрібно переконатися, що запускається його оболонка для входу nice: дочірні процеси успадкують niceзначення. Це залежить від того, як користувачі входять у систему. Наприклад, див. Пріоритет для ssh логінів (приємних) .

Крім того, ви можете налаштувати віртуальні машини. Дійсно, встановлення ліміту на кожен процес не має особливого сенсу, оскільки користувач може запускати багато процесів, зловживаючи системою. З віртуальною машиною всі обмеження будуть глобальними для віртуальної машини.

Ще одне рішення - встановити /etc/security/limits.confмежі; перегляньте сторінку чоловіка limit.conf (5). Наприклад, ви можете встановити максимальний час процесора на вхід та / або максимальну кількість процесів на вхід. Ви також можете встановити maxlogins1 для кожного користувача.


1
@GiovanniMounir Я мав на увазі: одна віртуальна машина на користувача.
vinc17

1
Я бачу, але, на жаль, це буде трудомістким і не дуже корисним для моєї мети, оскільки користувачі можуть вимагати використання деяких загальних пакетів розробок, і я не буду встановлювати це на кожній новій машині; Я думаю, що краще залишити це таким чином і зробити моніторинг автоматично за допомогою скрипта bash.
Джованні Мунір

1
@GiovanniMounir Ви можете поділити розділ між кількома віртуальними машинами.
vinc17

@GiovanniMounir Ви можете використовувати LXC або Docker, щоб зменшити віртуалізацію накладних витрат майже до нуля. Також "симпатія" не є вагомою причиною. Наприклад, я б підійшов до вашого рішення, якщо ви керуєте спільним хостом PHP, оскільки для роботи з LXC або віртуальними машинами потрібно буде переписати ліцензійне програмне забезпечення на суму 15 доларів США / 5 доларів, яке є надмірним.
Пуян Хосраві

моє розуміння полягає в тому, що добре лише встановлює відносний процесор порівняно з іншими процесами. Якщо жоден інший процес не використовує процесор, то ваш процес використовуватиме 100% процесора, не обмежуючи 10%.
johny чому

25

приємно / renice

nice є прекрасним інструментом для "одноразових" підключень до системи.

 nice COMMAND

cpulimit

cpulimit якщо вам потрібно зайняти інтенсивну роботу процесора і вільний час процесора є важливим для чуйності системи.

cpulimit -l 50 COMMAND

групи

cgroups застосовувати обмеження до набору процесів, а не лише до одного

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

Ресурси

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
Для тих, хто хоче встановити жорсткий ліміт на використання процесора, навіть якщо жоден інший процес не працює, подивіться на cpu.cfs_quota_usпараметр (див. Посібник )
Diego

cgroups легше використовувати завдяки директивам systemd ... створити підрозділ або систему, або користувача, для цього найкращий варіант
Ів Мартін,

для запущеного процесу напр .:sudo cgclassify -g cpu:cpulimited 2315444
Водолій Сила

1
моє розуміння полягає в тому, що добре лише встановлює відносний процесор порівняно з іншими процесами. Якщо жоден інший процес не використовує процесор, то ваш процес використовуватиме 100% процесора, не обмежуючи 10%.
johny чому

10

Ви подивилися на групи? У Arch Wiki є деякі відомості про них. Прочитайте розділ про те cpu.shares, схоже, він робить те, що вам потрібно, і вони можуть працювати на рівні користувача, так що ви можете обмежити всі користувацькі процеси одразу.


Хоча CGroups - це шлях. Я також запускаю (багато) спільних комп'ютерних серверів, і ми використовуємо групи, щоб обмежити максимальну кількість ядер, якими може користуватися весь сеанс входу . Таким чином, якщо людина продовжує починати нові процеси, кожен отримує менший шматочок. Те саме для використання пам'яті. Користувачі можуть автоматично включати в групу з пам_cgroups та службою cgrulesengd. Ви можете використовувати "шаблон" у файлі cgconfig, щоб поставити кожного користувача у свою власну групу. cgrulesengd діє як ваш сценарій, за винятком того, що замість того, щоб знищувати процеси, він просто гарантує, що кожен процес знаходиться у потрібній групі.
jsbillings

Навіть якщо ви не використовуєте групи для обмеження використання ресурсів, ви можете використовувати їх для того, щоб оцінити, скільки ресурсів використовує людина, переглянувши файл "stat" для кожного ресурсу, а потім використати цю інформацію для 5-хвилинного сценарію.
jsbillings

3

Для пам’яті те, що ви шукаєте ulimit -v. Зауважте, що ulimitце успадковується дочірніми процесами, тому якщо ви застосовуєте його до оболонки входу користувача під час входу, це стосується всіх його процесів.

Якщо ваші користувачі використовують bashоболонку входу, введення наступного рядка /etc/profileповинно спричинити жорсткий ліміт усіх гігабайт в 1 гігабайт (точніше, мільйон кілобайт):

ulimit -vH 1000000

Цей параметр Hгарантує, що це жорсткий ліміт, тобто користувач не може його потім створити назад. Звичайно, користувач все ще може заповнити пам'ять, запустивши достатньо багатьох процесів одночасно.

Для інших оболонок вам доведеться з’ясувати, які файли ініціалізації вони читають натомість (та яку іншу команду замість ulimitних використовують).

Для процесора те, що ви хочете, для мене, здається, не має сенсу. У чому полягає користь використання 90% ЦП, коли не використовується лише один процес? Я думаю, що те, що ти насправді хочеш, це nice(і можливо ionice). Зауважте, що, як-от ulimit, niceзначення успадковуються дочірніми процесами, тому достатньо застосовувати його до оболонки входу під час входу. Я думаю, що це стосується, ioniceале я не впевнений.


Дякуємо за пропозицію пам'яті! Чи є якийсь шанс, що ви можете показати мені приклад застосувати це до оболонки входу користувача під час входу? Я не дуже впевнений, як це зробити. Мені також шкода, що я недостатньо зрозуміла; те, що я намагаюся зробити, це не дозволяти жодному процесу використовувати більше 10% ЦП. То ви вважаєте, що niceце буде досить приємно для цього? Якщо так, чи вважаєте ви, що ви можете показати мені приклад для досягнення цього?
Джованні Мунір

Я все ще не можу підтримувати процесор на 90% в режимі очікування, коли працює лише один процес.
celtschk

1
Якщо наразі працює менше 10 процесів, які одночасно працюють (і я маю на увазі дійсно запущений, а не просто очікування введення користувача або дискового вводу / виводу), то практично гарантується, що один з них матиме більше 10% процесора. Інакше процесор практично не працює. І якщо ви просто вбите будь-який процес, який перевищує 10%, я впевнений, що у вас буде багато користувачів, які захочуть вас вбити . Або, принаймні, спробують змусити вас замінити когось, хто має поняття про те, що означають ці цифри, тому що ви цього не здаєтеся.
celtschk

На відміну від коментаря @celtschk, якщо працює 11 і більше процесів (пов'язаний з процесором), вони становитимуть менше 9,09%. Тож якщо я користувач системи, яка забороняє використовувати більше 10% процесорних процесорів, я можу запустити 11 і більше процесів і ховатися під радаром.
ctrl-alt-delor

@richard Ви маєте рацію, можливо, було б краще, якщо скрипт підсумував би загальну кількість пам’яті / процесора, який використовує користувач, а потім припинить усі процеси цього користувача, коли відсоток досягне певного обсягу (так би його також зареєструвати вихід)
Джованні Мунір

3

Так як ви заявляєте , що CPULimit НЕ буде практичною в вашому випадку, то я пропоную вам подивитися на славному , Renice і набір завдань , які можуть наблизитися до того , що ви хочете досягти, хоча набір завдання дозволяє встановлювати ПРОЦЕСИ своєї близькість процесора, так це може бути не відразу корисним у вашому випадку.


1
niceі renice? Це мило! Я переглянув їхні сторінки керівництва, але я все ще не думаю, що вони можуть допомогти у цьому, оскільки ви все ще повинні встановити ідентифікатор процесу. Якщо ви могли б надати мені приклад, який передбачає, що ці пакети застосовують ліміт на всі запущені процеси / майбутні процеси, які були б приголомшливими!
Джованні Мунір

1

Оскільки ваші теги є centos, ви можете використовувати systemd.

Наприклад, якщо ви хочете обмежити користувача ідентифікатором 1234:

sudo systemctl edit --force user-1234.slice

Потім введіть і збережіть це:

[Slice] CPUQuota=10%

Наступного разу, коли користувач увійде в систему, це вплине.

Людина сторінки: systemctl, systemd.slice, systemd.resource-control...


0

Якщо ви хочете обмежити вже запущені процеси, вам доведеться це робити один за одним за допомогою PID, але ви можете мати пакетний сценарій для цього, як описаний нижче:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

У моєму випадку pypdfocrзапускає жадібну tesseract.

Також у деяких випадках ваш процесор був досить гарним, ви можете просто використовувати reniceтакий:

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.