TASKSET 또는 sched_setaffinity()를 사용하여 CPUSET을 사용하여 격리된 프로세서 코어에 대한 프로세스 선호도를 설정합니다.

TASKSET 또는 sched_setaffinity()를 사용하여 CPUSET을 사용하여 격리된 프로세서 코어에 대한 프로세스 선호도를 설정합니다.

먼저, 제가 달성하려는 목표에 대한 배경 지식을 알려드리겠습니다. 시작 매개변수(isolcpu 및 nohz_full, 하우스키핑 하위 시스템 설정)를 사용하여 특정 CPU를 격리하는 방법을 알고 있습니다.

하지만 내 요구 사항에 따라 시스템 시작 후 CPU를 격리해야 합니다. 그래서 많은 기사에 이어 다음과 같은 하위 시스템을 사용하여 특정 CPU를 격리하려고 했습니다 cpuset.

내가 사용하는 하드웨어에는 16개의 CPU가 있습니다. (0-15). 그래서 CPU 0을 분리하기로 결정했습니다.

$ cd /cpusets
$ mkdir housekeeping
$ mkdir isolate
$ echo 1-15 > housekeeping/cpus
$ echo 0 > mems
$ echo 0 > isolated/cpus
$ echo 0 > isolated/mens
$ echo 0 > cpuset.sched_load_balance
$ echo 0 > isolated/sched_load_balance
$ while read P ; do echo $P > housekeeping/tasks ; done < tasks

이렇게 하면 0프로세서가 다른 모든 프로세서로부터 격리됩니다. 그러나 taskset다음을 사용하여 프로세스를 프로세서 0에 할당 하려고 하면 :

/******loop.c**********/
int main(){
    int i;
    for(i=0;;i++);
    return 0;
}
$ gcc -o loop.c loop
$ taskset -c 0 ./loop
taskset: failed to set pid 2755250's affinity: Invalid argument 

격리/작업에 pid를 에코하는 것 외에도 2755250격리 CPU에 대한 새 프로세스의 선호도를 설정할 수 있습니까 0?

내가 어디서 잘못됐나요?

답변1

taskset통지됩니다sched_setaffinity만약에

연결된 비트마스크 마스크에는 현재 시스템에 물리적으로 위치한 프로세서가 포함되지 않습니다.그리고 cpuset cgroups 또는 "cpuset" 메커니즘에 의해 부과될 수 있는 제한 사항을 기반으로 스레드 사용을 허용합니다.cpuset(7)에 설명되어 있습니다.


부팅 매개변수를 사용할 때 동작이 다른 이유는 isolcpus=커널 문서( Documentation/admin-guide/kernel-parameters.txt)에서 CPU 선호도 시스템 호출에 의해 런타임 시 무시될 수 있음을 참고하세요.

CPU 선호도 시스템 호출이나 cpuset을 통해 "격리된" CPU 안팎으로 프로세스를 이동할 수 있습니다.

반대로,인간 CPU 세트sched_setaffinity 설정이 충돌하면 cpuset 배치가 시행된다는 점을 알려줍니다.

CPUset은 커널의 sched_setaffinity(2) 스케줄링 선호도 메커니즘과 mbind(2) 및 set_mempolicy(2) 메모리 배치 메커니즘과 통합되어 있습니다.이러한 메커니즘 중 어느 것도 프로세스가 프로세스의 cpuset에서 허용하지 않는 CPU 또는 메모리 노드를 사용하는 것을 허용하지 않습니다.. 프로세스의 cpuset 배치 변경 사항이 이러한 다른 메커니즘과 충돌하는 경우, 이것이 다른 메커니즘을 재정의하는 경우에도 cpuset 배치가 시행됩니다. 커널은 이러한 다른 메커니즘에서 요청한 CPU 및 메모리 노드를 호출 프로세스의 cpuset에서 허용하는 노드로 자동으로 제한하여 이러한 재정의를 수행합니다. 이로 인해 이러한 다른 호출이 오류를 반환할 수 있습니다. 예를 들어 해당 호출이 빈 CPU 또는 메모리 노드 집합을 요청하게 되고 요청이 호출 프로세스의 cpuset으로 제한되는 경우가 있습니다.


참고: 또한 (커널 문서에서) isolcpus=부팅 매개변수는 더 이상 사용되지 않는다는 점을 참고하세요.

관련 정보