Я использую систему Linux, в которой много пользователей, но иногда происходит злоупотребление; где пользователь может запустить один процесс, который использует более 80% ЦП / памяти.
Так есть ли способ предотвратить это, ограничив использование ЦП процессом (до 10%, например)? Я знаю об этом cpulimit
, но, к сожалению, он применяет ограничение к процессам, которые я ему предписываю (например, к отдельным процессам). Поэтому мой вопрос: как я могу применить ограничение ко всем запущенным процессам и процессам, которые будут запущены в будущем, например, без необходимости указывать их идентификатор / путь?
centos
command-line
cpu
limit
Джованни Мунир
источник
источник
cpulimit
в сочетании с вашим поисковым скриптом. Разработайте политику и порекомендуйте использованиеcpulimit
, затем найдите более 10%, а затем ограничьте до 5% (поэтому пользователям рекомендуется использоватьcpulimit
). Также убедитесь, что вы можете обнаружить несколько процессов, добавляя более 10% для одного пользователя.cpulimit
намного лучше, чем просто убить процесс, так как он может быть перезапущен пользователем позже (как указано в одном из ваших комментариев). Спасибо!Ответы:
Хотя это может быть злоупотреблением памятью, это не относится к процессору: когда процессор простаивает, запущенный процесс (под «выполнением» я имею в виду, что процесс не ожидает ввода-вывода или чего-то еще) 100% процессорного времени по умолчанию. И нет никаких причин для ограничения.
Теперь вы можете установить приоритеты благодаря
nice
. Если вы хотите, чтобы они применялись ко всем процессам для данного пользователя, вам просто нужно убедиться, что его оболочка входа в систему запущенаnice
: дочерние процессы унаследуютnice
значение. Это зависит от того, как пользователи входят в систему. См., Например, Приоритет ssh (хороший) .Кроме того, вы можете настроить виртуальные машины. На самом деле установка лимита на процесс не имеет особого смысла, так как пользователь может запустить много процессов, злоупотребляя системой. С виртуальной машиной все ограничения будут глобальными для виртуальной машины.
Другое решение состоит в том, чтобы установить
/etc/security/limits.conf
пределы; см. справочную страницу limit.conf (5). Например, вы можете установить максимальное время процессора для входа в систему и / или максимальное количество процессов для входа в систему. Вы также можете установитьmaxlogins
1 для каждого пользователя.источник
хороший / renice
nice
это отличный инструмент для «однократной» настройки системы.CPULimit
cpulimit
Если вам нужно выполнить работу с интенсивным использованием ЦП, и наличие свободного времени ЦП имеет важное значение для быстродействия системы.контрольные группы
cgroups
применять ограничения к набору процессов, а не только к одномуРесурсы
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
источник
cpu.cfs_quota_us
параметр (см. Руководство )sudo cgclassify -g cpu:cpulimited 2315444
Вы смотрели на cgroups? Есть некоторая информация о Arch Wiki о них. Прочтите раздел о том
cpu.shares
, что он делает то, что вам нужно, и он может работать на уровне пользователя, поэтому вы можете ограничить все пользовательские процессы одновременно.источник
Что касается памяти, то, что вы ищете
ulimit -v
. Обратите внимание, чтоulimit
он наследуется дочерними процессами, поэтому, если вы примените его к оболочке входа пользователя во время входа в систему, он будет применяться ко всем его процессам.Если все ваши пользователи используют в
bash
качестве оболочки входа в систему, добавление следующей строки/etc/profile
должно привести к тому, что для всех пользовательских процессов будет установлен жесткий предел в 1 гигабайт (точнее, один миллион килобайт):Опция
H
гарантирует, что это жесткое ограничение, то есть пользователь не может установить его позже. Конечно, пользователь все еще может заполнить память, запустив достаточно много процессов одновременно.Для других оболочек вам нужно выяснить, какие файлы инициализации они читают вместо (и какие другие команды вместо
ulimit
них используют).Для процессора то, что вы хотите, кажется, не имеет смысла для меня. Какой смысл оставлять 90% ЦП неиспользуемым, когда запущен только один процесс? Я думаю, что вы действительно хотите
nice
(и, возможно,ionice
). Обратите внимание, что, какulimit
иnice
значения, они наследуются дочерними процессами, поэтому достаточно применить их к оболочке входа в систему во время входа в систему. Я думаю, это также относится к,ionice
но я не уверен.источник
nice
будет достаточно хорошо, чтобы сделать это? Если да, то можете ли вы показать мне пример для достижения этой цели?Поскольку вы заявляете, что cpulimit не будет практичным в вашем случае, то я предлагаю вам взглянуть на nice , renice и набор задач , которые могут приблизиться к тому, чего вы хотите достичь, хотя набор задач позволяет установить привязку ЦП процессов, поэтому может быть не сразу полезным в вашем случае.
источник
nice
аrenice
? Это мило! Я просмотрел их справочные страницы, но я все еще не думаю, что они могут помочь с этим, так как вам все еще нужно установить идентификатор процесса. Однако, если бы вы могли привести пример использования этих пакетов для ограничения всех запущенных процессов / будущих процессов, это было бы здорово!Так как ваши теги есть
centos
, вы можете использоватьsystemd
.Например, если вы хотите ограничить пользователя с ID
1234
:sudo systemctl edit --force user-1234.slice
Затем введите и сохраните это:
[Slice] CPUQuota=10%
В следующий раз, когда пользователь войдет в систему, это повлияет.
Человек страницы:
systemctl
,systemd.slice
,systemd.resource-control
...источник
Если вы хотите ограничить процессы, которые уже запущены, вам придется делать это один за другим по PID, но у вас может быть пакетный скрипт для этого, как показано ниже:
В моем случае
pypdfocr
запускает жадныйtesseract
.Также в некоторых случаях, если ваш процессор довольно хорош, вы можете просто использовать
renice
вот так:источник