У нас есть компьютер, процессор которого имеет 32 ядра, и он будет использоваться для запуска программ несколькими разными пользователями. Есть ли способ ограничить количество ядер, которые каждый пользователь может использовать в любое время, чтобы один пользователь не монополизировал всю мощность процессора?
18
Ответы:
Хотя это возможно , это сложно и почти наверняка плохая идея. Если в данный момент машиной пользуется только один пользователь, ограничение его до N ядер - пустая трата ресурсов. Гораздо лучшим подходом было бы запустить все с
nice
:Это отличный инструмент, который устанавливает приоритет процесса. Таким образом, если только один пользователь запускает что-то, он получит столько процессорного времени, сколько ему нужно, но если кто-то еще запустит свою собственную (также полезную) работу, он будет хорош и поделится друг с другом. Таким образом, если все ваши пользователи запускают команды
nice 10 command
, никто не будет загружать ресурсы (и никто не поставит сервер на колени).Обратите внимание, что высокое значение nice означает низкий приоритет. Это мера того , насколько хорошо мы должны быть и лучше , мы, тем больше мы разделяем.
Также обратите внимание, что это не поможет управлять распределением памяти, а только влияет на планирование ЦП. Поэтому, если несколько пользователей запускают несколько процессов, интенсивно использующих память, у вас все равно будет проблема. Если это проблема, вы должны посмотреть на правильные системы очередей, такие как крутящий момент .
источник
nice
, судя по тому , что вы описываете, это почти то, что вам нужно.TL; DR : из краткого исследования выясняется, что можно ограничить команды определенным количеством ядер, однако во всех случаях вы должны использовать команду, которая фактически обеспечивает ограничение.
контрольные группы
Linux имеет то,
cgroups
что часто используется именно с целью ограничения ресурсов, доступных процессам. Из очень короткого исследования вы можете найти пример в Arch Wiki с конфигурацией Matlab (научное программное обеспечение), установленной в/etc/cgconfig.conf
:Чтобы такой конфиг вступил в силу, вы должны запустить процесс с помощью
cgexec
команды, например, с той же вики-страницы:набор задач
Связанный с ним вопрос о проси Ubuntu и как ограничить процесс до одного ядра процессора в Linux? [duplicate] на сайте Unix & Linux показывает пример использования
taskset
для ограничения процессорных ресурсов для процесса. В первом вопросе это достигается путем анализа всех процессов для конкретного пользователя.Во втором вопросе процесс запускается через
taskset
себя:Вывод
Хотя, конечно, можно ограничивать процессы, кажется, не так просто добиться этого для конкретных пользователей. Пример в связанном посте Ask Ubuntu потребует согласованного сканирования процессов, принадлежащих каждому пользователю и использующих
taskset
каждый новый. Гораздо более разумный подход - выборочно запускать приложения, интенсивно использующие процессор, либо через,cgexec
либоtaskset
; также не имеет смысла ограничивать все процессы определенным количеством CPUS, особенно для тех, которые фактически используют параллелизм и параллелизм для более быстрого выполнения своих задач - ограничение их до определенного числа процессоров может привести к замедлению обработки. Кроме того, как отметил ответ Тердона, это пустая трата ресурсовЗапуск избранных приложений через
taskset
илиcgexec
требует общения с пользователями, чтобы они знали, какие приложения они могут запускать, или создание сценариев-обёрток, которые запускают выбранные приложения черезtasksel
илиcgexec
.Кроме того, рассмотрите возможность установки количества процессов, которые может порождать пользователь или группа, вместо ограничения количества процессоров. Это может быть достигнуто с помощью
/etc/security/limits.conf
файла .Смотрите также
источник
sched_setaffinity(2)
говорит , что маска сродства сохраняется черезexecve(2)
, и что ребенок наследует это наfork(2)
. Таким образом, если вы задаете командную оболочку для пользователя (или его графическую оболочку для сеанса X), все, что они запускают из этой оболочки, по умолчанию будет использовать ту же маску сходства.