Как можно ограничить количество ядер процессора, которые может использовать каждый пользователь?

У нас есть компьютер, ЦП которого имеет 32 ядра, и это будет используемым для того, чтобы запустить программы нескольких различных пользователей. Там какой-либо путь состоит в том, чтобы ограничить количество ядер, которые каждый пользователь может использовать когда-либо так, чтобы один пользователь не монополизировал всю мощность ЦП?

17
задан 9 January 2019 в 06:50

2 ответа

В то время как это возможно, это сложно и почти наверняка плохая идея. Если только один пользователь использует машину в данный момент, ограничивание их к ядрам 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 ресурсами (и никто не принесет сервер к его коленям).

Обратите внимание, что высокое хорошее значение означает низкий приоритет. Это - мера того, насколько хороший мы должны быть и чем более хороши мы, тем больше мы совместно используем.

Также обратите внимание, что это не поможет справиться с выделением памяти, оно только влияет на планирование ЦП. Таким образом, если многочисленные пользователи запустят несколько интенсивно использующих память процессов, то у Вас все еще будет проблема. Если это - проблема, необходимо изучить надлежащие системы массового обслуживания, такие как крутящий момент.

16
ответ дан 23 November 2019 в 02:20

TL; DR: От краткого исследования кажется, что возможно ограничить команды определенным количеством ядер, однако во всех случаях, необходимо использовать команду, которая на самом деле осуществляет ограничение.

cgroups

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

taskset

Связанный вопрос на Спрашивает 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 файл.

См. также

13
ответ дан 23 November 2019 в 02:20

Другие вопросы по тегам:

Похожие вопросы: