Ограничение процессов не должно превышать 10% загрузки ЦП.

32

Я использую систему Linux, в которой много пользователей, но иногда происходит злоупотребление; где пользователь может запустить один процесс, который использует более 80% ЦП / памяти.

Так есть ли способ предотвратить это, ограничив использование ЦП процессом (до 10%, например)? Я знаю об этом cpulimit, но, к сожалению, он применяет ограничение к процессам, которые я ему предписываю (например, к отдельным процессам). Поэтому мой вопрос: как я могу применить ограничение ко всем запущенным процессам и процессам, которые будут запущены в будущем, например, без необходимости указывать их идентификатор / путь?

Джованни Мунир
источник
У вас проблемы с производительностью? или вас просто беспокоят цифры?
Ctrl-Alt-Delor
@ Richard Проблемы с производительностью, поэтому я пытался убить / ограничить / положить конец процессам, которые, кажется, используют много ресурсов ЦП, но я уже сделал это, написав скрипт bash. Это также виртуальная машина, если это поможет
Джованни Мунир
2
Будьте осторожны с процессами уничтожения, которые могут быть на 100% за очень короткое время, а также с системными процессами. Рассмотрим cpulimitв сочетании с вашим поисковым скриптом. Разработайте политику и порекомендуйте использование cpulimit, затем найдите более 10%, а затем ограничьте до 5% (поэтому пользователям рекомендуется использовать cpulimit). Также убедитесь, что вы можете обнаружить несколько процессов, добавляя более 10% для одного пользователя.
Ctrl-Alt-Delor
@ Richard Спасибо Ричарду за все эти довольно полезные комментарии! Они очень помогли мне! Ваше предложение использовать cpulimitнамного лучше, чем просто убить процесс, так как он может быть перезапущен пользователем позже (как указано в одном из ваших комментариев). Спасибо!
Джованни Мунир
1
stackoverflow.com/questions/386945/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

20

Хотя это может быть злоупотреблением памятью, это не относится к процессору: когда процессор простаивает, запущенный процесс (под «выполнением» я имею в виду, что процесс не ожидает ввода-вывода или чего-то еще) 100% процессорного времени по умолчанию. И нет никаких причин для ограничения.

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

Кроме того, вы можете настроить виртуальные машины. На самом деле установка лимита на процесс не имеет особого смысла, так как пользователь может запустить много процессов, злоупотребляя системой. С виртуальной машиной все ограничения будут глобальными для виртуальной машины.

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

vinc17
источник
1
@GiovanniMounir Я имел в виду: одна виртуальная машина на пользователя.
vinc17
1
Я вижу, но, к сожалению, это будет ресурсоемким и не очень полезным для моих целей, так как пользователям может потребоваться использование некоторых распространенных пакетов разработки, и я не буду устанавливать это на каждой новой машине; Я думаю, что лучше оставить все как есть и выполнять мониторинг автоматически с помощью bash-скрипта.
Джованни Мунир
1
@GiovanniMounir Вы можете разделить раздел между несколькими виртуальными машинами.
vinc17
@GiovanniMounir Вы можете использовать LXC или Docker, чтобы снизить накладные расходы виртуализации почти до нуля. Также «симпатия» не является веской причиной. Например, я бы воспользовался вашим решением, если вы управляете общим хостом PHP, потому что для работы с LXC или виртуальными машинами потребуется перезапись лицензионного программного обеспечения стоимостью 15 долл. США, что является излишним.
Пооян Хосрави
Насколько я понимаю, приятно только устанавливает относительный процессор по сравнению с другими процессами. Если никакой другой процесс не использует ЦП, тогда ваш процесс будет использовать 100% ЦП, а не ограничиваться 10%.
Джонни, почему
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

RafaSashi
источник
5
Для тех, кто хочет установить жесткое ограничение на использование процессора, даже когда никакой другой процесс не работает, посмотрите на cpu.cfs_quota_usпараметр (см. Руководство )
Diego
cgroups проще в использовании благодаря директивам systemd ... создать единицу системы или пользователя для этой цели - лучший вариант
Ив Мартин
для бегущего процесса напр .:sudo cgclassify -g cpu:cpulimited 2315444
Aquarius Power
1
Насколько я понимаю, приятно только устанавливает относительный процессор по сравнению с другими процессами. Если никакой другой процесс не использует ЦП, тогда ваш процесс будет использовать 100% ЦП, а не ограничиваться 10%.
Джонни, почему
10

Вы смотрели на cgroups? Есть некоторая информация о Arch Wiki о них. Прочтите раздел о том cpu.shares, что он делает то, что вам нужно, и он может работать на уровне пользователя, поэтому вы можете ограничить все пользовательские процессы одновременно.

Павел Щиска
источник
CGroups это путь, хотя. Я также использую (много) серверов общего компьютера, и мы используем cgroups для ограничения максимального количества ядер, которое может использовать весь сеанс входа в систему . Таким образом, если человек продолжает запускать новые процессы, каждый получает меньший срез. То же самое для использования памяти. Вы можете автоматически добавлять пользователей в cgroup с помощью pam_cgroups и службы cgrulesengd. Вы можете использовать шаблон в файле cgconfig, чтобы поместить каждого пользователя в свою собственную группу. cgrulesengd действует как ваш скрипт, за исключением того, что он не убивает процессы, а просто проверяет, что каждый процесс находится в правильной группе.
jsbillings
Даже если вы не используете cgroups для ограничения использования ресурсов, вы можете использовать его для оценки того, сколько ресурсов использует отдельный человек, посмотрев файл «stat» для каждого ресурса, а затем используйте эту информацию для своего 5-минутного сценария.
jsbillings
3

Что касается памяти, то, что вы ищете ulimit -v. Обратите внимание, что ulimitон наследуется дочерними процессами, поэтому, если вы примените его к оболочке входа пользователя во время входа в систему, он будет применяться ко всем его процессам.

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

ulimit -vH 1000000

Опция Hгарантирует, что это жесткое ограничение, то есть пользователь не может установить его позже. Конечно, пользователь все еще может заполнить память, запустив достаточно много процессов одновременно.

Для других оболочек вам нужно выяснить, какие файлы инициализации они читают вместо (и какие другие команды вместо ulimitних используют).

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

celtschk
источник
Спасибо за предложение памяти! Есть ли шанс, что вы можете показать мне пример, чтобы применить это к оболочке входа пользователя во время входа в систему? Я не совсем уверен, как это сделать. Я также извиняюсь за то, что не достаточно ясно; то, что я пытаюсь сделать, это не позволить любому процессу использовать более 10% процессорного времени. Так ты думаешь, это niceбудет достаточно хорошо, чтобы сделать это? Если да, то можете ли вы показать мне пример для достижения этой цели?
Джованни Мунир
Я до сих пор не понимаю, как долго поддерживать процессор на 90%, когда запущен только один процесс.
celtschk
1
Если в настоящее время одновременно запущено менее 10 процессов (и я имею в виду, что они действительно работают, а не просто ожидают ввода данных пользователем или дискового ввода / вывода), то фактически гарантируется, что один из них будет иметь более 10% процессорного времени. В противном случае процессор будет практически на холостом ходу. И если вы просто убьете любой процесс, который идет выше 10%, я уверен, что у вас будет много пользователей, которые захотят вас убить . Или, по крайней мере, попытается заменить вас кем-то, кто имеет представление о том, что означают эти цифры, потому что вы, похоже, этого не делаете.
celtschk
В отличие от комментария @celtschk, если запущено 11 или более процессов (связанных с процессором), то они будут на уровне менее 9,09%. Так что, если я являюсь пользователем системы, которая использует более 10% процессоров, я могу запустить 11 или более процессов и скрыться под радаром.
Ctrl-Alt-Delor
@ Richard Вы правы, возможно, было бы лучше, если бы сценарий суммировал общий объем памяти / ЦП, использованный пользователем, а затем завершил бы все процессы этого пользователя, когда процент достигнет определенного количества (так же запишет его out)
Джованни Мунир
3

Поскольку вы заявляете, что cpulimit не будет практичным в вашем случае, то я предлагаю вам взглянуть на nice , renice и набор задач , которые могут приблизиться к тому, чего вы хотите достичь, хотя набор задач позволяет установить привязку ЦП процессов, поэтому может быть не сразу полезным в вашем случае.

RJ
источник
1
niceа renice? Это мило! Я просмотрел их справочные страницы, но я все еще не думаю, что они могут помочь с этим, так как вам все еще нужно установить идентификатор процесса. Однако, если бы вы могли привести пример использования этих пакетов для ограничения всех запущенных процессов / будущих процессов, это было бы здорово!
Джованни Мунир
1

Так как ваши теги есть centos, вы можете использовать systemd.

Например, если вы хотите ограничить пользователя с ID 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'
Эдуард Флоринеску
источник