У нас есть компьютер, ЦП которого имеет 32 ядра, и это будет используемым для того, чтобы запустить программы нескольких различных пользователей. Там какой-либо путь состоит в том, чтобы ограничить количество ядер, которые каждый пользователь может использовать когда-либо так, чтобы один пользователь не монополизировал всю мощность ЦП?
В то время как это возможно, это сложно и почти наверняка плохая идея. Если только один пользователь использует машину в данный момент, ограничивание их к ядрам N является тратой ресурсов. Намного лучший подход должен был бы выполнить все с nice
:
NAME
nice - run a program with modified scheduling priority
SYNOPSIS
nice [OPTION] [COMMAND [ARG]...]
DESCRIPTION
Run COMMAND with an adjusted niceness, which affects process scheduling. With
no COMMAND, print the current niceness. Niceness values range from -20 (most
favorable to the process) to 19 (least favorable to the process).
Это - большой инструмент, который устанавливает приоритет процесса. Таким образом, если только один пользователь выполнит что-то, то они получат столько процессорного времени, сколько им нужно, но если кто-то еще запустит их собственное (также niced) задание, то они будут хороши и совместно используют друг с другом. Тот путь, если Ваши пользователи весь запуск управляет с nice 10 command
, никто не будет hogging ресурсами (и никто не принесет сервер к его коленям).
Обратите внимание, что высокое хорошее значение означает низкий приоритет. Это - мера того, насколько хороший мы должны быть и чем более хороши мы, тем больше мы совместно используем.
Также обратите внимание, что это не поможет справиться с выделением памяти, оно только влияет на планирование ЦП. Таким образом, если многочисленные пользователи запустят несколько интенсивно использующих память процессов, то у Вас все еще будет проблема. Если это - проблема, необходимо изучить надлежащие системы массового обслуживания, такие как крутящий момент.
TL; DR: От краткого исследования кажется, что возможно ограничить команды определенным количеством ядер, однако во всех случаях, необходимо использовать команду, которая на самом деле осуществляет ограничение.
Linux имеет cgroups
который часто используется точно в целях ограничения ресурсов, доступных процессам. От очень краткого исследования можно найти пример в Дуге Wiki с Matlab (научное программное обеспечение) конфигурация модели в /etc/cgconfig.conf
:
group matlab {
perm {
admin {
uid = username;
}
task {
uid = username;
}
}
cpuset {
cpuset.mems="0";
cpuset.cpus="0-5";
}
memory {
memory.limit_in_bytes = 5000000000;
}
}
Для такой конфигурации для вступления в силу необходимо выполнить процесс через cgexec
команда, например, от той же страницы Wiki:
$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop
Связанный вопрос на Спрашивает Ubuntu и Как ограничить процесс одним ядром процессора в Linux? [дубликат] на сайте Unix&Linux показывает пример использования taskset
ограничить центральные процессоры для процесса. В первом вопросе это достигается посредством парсинга всех процессов для конкретного пользователя
$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001
В другой вопрос, процесс запускается через taskset
самостоятельно:
$ taskset -c 0 mycommand --option # start a command with the given affinity
В то время как, конечно, возможно ограничить процессы, кажется, что не столь просто достигнуть этого для конкретных пользователей. Пример в связанном Просит, чтобы сообщение Ubuntu потребовало бы последовательного сканирования для процессов, принадлежащих каждому пользователю и использованию taskset
на каждом новый. Намного более разумный подход должен был бы выборочно выполнить ЦП интенсивные приложения, любой через cgexec
или taskset
; также не имеет никакого смысла ограничивать все процессы определенным количеством CPU, специально для тех, которые на самом деле используют параллелизм и параллелизм для выполнения их задач быстрее - ограничение их к определенному количеству центральных процессоров может иметь эффект замедления обработки. Кроме того, поскольку ответ terdon упомянул, что это - трата ресурсов
Запуск избранных приложений через taskset
или cgexec
требует, чтобы общение с Вашими пользователями сообщило им, какие приложения они могут запустить, или сценарии обертки создания, которые запустят избранные приложения через tasksel
или cgexec
.
Кроме того, рассмотрите определяющий номер процессов, которые пользователь или группа могут породить вместо того, чтобы установить предел для количества центральных процессоров. Это может быть достигнуто через /etc/security/limits.conf
файл.