CPU가 32 개의 코어를 가진 컴퓨터가 있으며 몇 명의 다른 사용자가 프로그램을 실행하는 데 사용될 것입니다. 한 명의 사용자가 모든 CPU 전력을 독점하지 않도록 각 사용자가 언제든지 사용할 수있는 코어 수를 제한 할 수있는 방법이 있습니까?
CPU가 32 개의 코어를 가진 컴퓨터가 있으며 몇 명의 다른 사용자가 프로그램을 실행하는 데 사용될 것입니다. 한 명의 사용자가 모든 CPU 전력을 독점하지 않도록 각 사용자가 언제든지 사용할 수있는 코어 수를 제한 할 수있는 방법이 있습니까?
답변:
이것이 가능 하지만 복잡하고 거의 확실하지 않습니다. 현재 한 명의 사용자 만 기계를 사용하는 경우 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).
이것은 프로세스의 우선 순위를 설정하는 훌륭한 도구입니다. 따라서 한 명의 사용자 만 무언가를 실행하는 경우 필요한만큼의 CPU 시간을 얻을 수 있지만 다른 사람이 자신의 작업을 시작하면 서로 친절하게 공유 할 수 있습니다. 이렇게하면 사용자가 모두로 명령을 실행 nice 10 command
하면 아무도 리소스를 낭비하지 않습니다 (아무도 서버를 무릎 꿇지 않습니다).
좋은 값은 높은 우선 순위를 의미합니다. 이것은 우리가 얼마나 멋지고 좋은지에 대한 척도입니다 .
또한 이것은 메모리 할당 관리에 도움이되지 않으며 CPU 스케줄링에만 영향을 미칩니다. 따라서 여러 사용자가 메모리를 많이 사용하는 여러 프로세스를 시작해도 여전히 문제가 있습니다. 이것이 문제라면, 토크 와 같은 적절한 큐잉 시스템을 조사해야합니다 .
nice
당신이 묘사 한 것에서 필요한 것입니다.
TL; DR : 간단한 연구를 통해 명령을 특정 수의 코어로 제한 할 수 있지만 모든 경우에 실제로 제한을 적용하는 명령을 사용해야합니다.
Linux는 cgroups
프로세스에 사용 가능한 리소스를 제한하기 위해 정확하게 사용되는 경우가 많습니다. 매우 간단한 연구를 통해 다음 과 같이 Matlab (과학 소프트웨어) 구성이 설정된 Arch Wiki에서 예제를 찾을 수 있습니다 /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
하려면 동일한 위키 페이지에서 명령을 통해 프로세스를 실행해야 합니다.
$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop
Ask Ubuntu 및 Linux에서 프로세스를 하나의 CPU 코어로 제한하는 방법 에 대한 관련 질문이 있습니까? Unix & Linux 사이트의 [duplicate]taskset
는 프로세스의 CPU를 제한하기 위해 사용하는 예를 보여줍니다 . 첫 번째 질문에서는 특정 사용자에 대한 모든 프로세스를 파싱하여 달성합니다.
$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001
다른 질문에서 프로세스는 taskset
자체 를 통해 시작 됩니다.
$ taskset -c 0 mycommand --option # start a command with the given affinity
프로세스를 제한하는 것은 확실히 가능하지만 특정 사용자에게는 프로세스를 달성하는 것이 그렇게 간단하지 않은 것 같습니다. 링크 된 우분투 게시물 게시물의 예는 각 사용자에게 속한 프로세스와 taskset
새로운 각 프로세스에 대한 일관된 스캔이 필요합니다 . 훨씬 더 합리적인 접근 방법은 선택적으로 실행하는 CPU를 통해 하나 집약적 인 애플리케이션, 것 cgexec
또는 taskset
; 또한 모든 프로세스를 특정 수의 CPU로 제한하는 것은 의미가 없으며, 특히 병렬 처리와 동시성을 사용하여 작업을 더 빠르게 실행하는 프로세스의 경우에는 특정 수의 CPU로 제한하면 처리 속도가 느려질 수 있습니다. 또한 terdon의 답변에서 언급했듯이 자원 낭비입니다.
를 통해 선택 응용 프로그램을 실행 taskset
하거나 cgexec
그들이 실행할 수있는 응용 프로그램을 알려 사용자와의 통신이 필요합니다, 또는를 통해 선택 응용 프로그램을 실행합니다 스크립트 랩퍼 만들 tasksel
거나 cgexec
.
또한 CPU 수에 대한 제한을 설정하는 대신 사용자 또는 그룹이 생성 할 수있는 프로세스 수를 설정하십시오. 이것은 /etc/security/limits.conf
file 을 통해 달성 할 수 있습니다 .
sched_setaffinity(2)
선호도 마스크가 건너 유지하고 있다고 execve(2)
, 그리고 자식 상속 거기에 있음 fork(2)
. 따라서 사용자의 셸 (또는 X 세션의 그래픽 셸)을 작업 세트하면 해당 셸에서 시작하는 모든 항목은 기본적으로 동일한 선호도 마스크를 사용합니다.