각 사용자가 사용할 수있는 CPU 코어 수를 어떻게 제한 할 수 있습니까?


18

CPU가 32 개의 코어를 가진 컴퓨터가 있으며 몇 명의 다른 사용자가 프로그램을 실행하는 데 사용될 것입니다. 한 명의 사용자가 모든 CPU 전력을 독점하지 않도록 각 사용자가 언제든지 사용할 수있는 코어 수를 제한 할 수있는 방법이 있습니까?


5
답이 아니라 아이디어 일뿐입니다. 여러 가상 머신을 설정하려고 할 수 있습니다. 각각은 제한된 양의 CPU 만 가질 수 있습니다. 각 사용자는 가상 머신 중 하나에 만 있고 해당 VM의 사용자는 CPU 사용량이 제한됩니다. 일부 가상화 소프트웨어에는이를 지원하기위한 도구가있을 수 있습니다.
ghellquist

1
@ ghellquist 당신은 그 대답을해야합니다
slebetman

@ ghellquist : 다른 사용자가 일부 CPU 만 보길 원한다면 Linux 컨테이너와 같이 가능한 한 가벼운 것을 원할 것입니다. (예를 들어 OpenMP 또는 코어를 보는 것만 큼 많은 스레드를 시작하는 다른 프로그램을 시작할 때 각 사용자가 실제로 사용할 수 있도록 코어 수에 따라 적절한 수를 시작합니다). KVM과 같은 전체 가상화는 VT-X 또는 AMD-V와 같은 하드웨어 지원으로도 VM 종료를 피할 때에도 추가 페이지 테이블 수준에서 많은 메모리를 건 드리면 TLB가 누락되는 코드에서 성능 비용이 발생합니다.
Peter Cordes 2019 년

미안하지만 이것도 필요합니까? 다중 사용자 시스템 인 Linux는 기본적으로 선점 형 멀티 태스킹을 이미 구현하므로 악의적이지 않은 단일 사용자가 전체 시스템을 호 그만 두는 상황이 발생하지 않아야합니다.
큐빅

답변:


16

이것이 가능 하지만 복잡하고 거의 확실하지 않습니다. 현재 한 명의 사용자 만 기계를 사용하는 경우 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 스케줄링에만 영향을 미칩니다. 따라서 여러 사용자가 메모리를 많이 사용하는 여러 프로세스를 시작해도 여전히 문제가 있습니다. 이것이 문제라면, 토크 와 같은 적절한 큐잉 시스템을 조사해야합니다 .


답변 주셔서 감사합니다. SLURM과 같은 일부 "워크로드 관리자"가 있지만 여러 노드가있는 컴퓨터를위한 것입니다. 사람들이 단일 노드 컴퓨터를 위해 유사한 응용 프로그램을 개발하지 않은 것이 의미가 있다고 생각합니다.
Reza

@Reza는 nice당신이 묘사 한 것에서 필요한 것입니다.
terdon

3
@Reza : OS가 이미 그렇게하기 때문입니다. 필요에 따라 사용 가능한 CPU를 스레드 / 프로세스에 자동으로 시간 공유합니다.
BlueRaja-대니 Pflughoeft

13

TL; DR : 간단한 연구를 통해 명령을 특정 수의 코어로 제한 할 수 있지만 모든 경우에 실제로 제한을 적용하는 명령을 사용해야합니다.

cgroups

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.conffile 을 통해 달성 할 수 있습니다 .

또한보십시오


1
물론,이 cgrulesengdcgrules.conf 자동으로 대신 cgexec와의 프로세스를 실행하는 사용자에 의존 사용자 / 그룹에 따라 적절한 cgroup에로 프로세스를 이동합니다. 그러나 우분투에서 이것을 설정하는 것은 다소 사소한 것 같습니다.
Hans-Jakob

@ Hans-Jakob 다소 복잡해 보이며 GRUB에 커널 플래그를 추가해야합니다. 아마도 많은 사용자가 있고 시스템이 충돌하는 것을 원하지 않는 엔터프라이즈 수준의 컴퓨터에는 아마도 가치가 있지만 데스크톱에는 너무 많은 작업 일 것입니다. 연결해 주셔서 감사합니다.
Sergiy Kolodyazhnyy

2
sched_setaffinity(2)선호도 마스크가 건너 유지하고 있다고 execve(2), 그리고 자식 상속 거기에 있음 fork(2). 따라서 사용자의 셸 (또는 X 세션의 그래픽 셸)을 작업 세트하면 해당 셸에서 시작하는 모든 항목은 기본적으로 동일한 선호도 마스크를 사용합니다.
Peter Cordes 2019 년

1
한 가지 가능한 단점은 시작할 스레드 수를 결정할 때 시스템에 몇 개의 CPU가 있는지 확인하는 프로그램입니다. 실제로 예약 할 코어 수에 비해 너무 많은 스레드가 있습니다. cgroups가 그것에 대해 무엇을 할 수 있는지 알아 냈습니까?
Peter Cordes

@PeterCordes 스폰 쉘 아이디어가 흥미롭게 들린다. 나는 그것을 조사해야 할 것이다. 감사 ! 두 번째 의견에 관해서는 아니오, 현재로서는 cgroup을 충분히 연구하지 않았습니다.
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.