cgroups, cpuset이 일부 프로세스의 cpuset을 변경하지 못했습니다.

cgroups, cpuset이 일부 프로세스의 cpuset을 변경하지 못했습니다.

성능 측정을 위해 CPU에 코어를 "예약"하려고 합니다. 나는 cpuset cgroups vfs를 설치했습니다. 다음과 같이 두 개의 하위 그룹을 만들었습니다.

/cpuset.cpu_exclusive    1
/cpuset.cpus             0-3
/cpuset.mems             0

# Everything on the PC except what I want to measure
/All/cpuset.cpu_exclusive    1
/All/cpuset.cpus             1-3
/All/cpuset.mems             0

# The measurement processes only (i.e. the shell + a binary to test)
/Timing/cpuset.cpu_exclusive    1
/Timing/cpuset.cpus             0
/Timing/cpuset.mems             0

많은 프로세스를 "모든" 그룹으로 이동할 수 있었지만 일부(커널 프로세스처럼 보이는 프로세스)에서는 그렇게 할 수 없었습니다. 예를 들어 ksoftirqd의 pid는 3입니다.

[root@Io:/vfsroot]# echo 3 > All/tasks 
echo: write error: invalid argument

또한 일부 프로세스의 경우 All/Tasks에서 볼 수 있지만 여전히 잘못된 CPU(여기서는 CPU #0, 셸 사용)에서 실행됩니다.

[root@Io:/vfsroot]# echo 28362 > All/tasks 
[root@Io:/vfsroot]# ps -eo pid,psr | grep "0$"
...
28362   0

그 사람들을 위해 이것이 내가 그들의 cpuset을 변경한 이후로 그들이 깨어나지 않았고 ps가 그들이 실행 중이던 마지막 CPU를 보여주기 때문인지 궁금합니다...

현재 쉘 CPU를 매우 효율적으로 변경할 수 있습니다. (/Timing/tasks에서 나타나고 사라지도록 하고 ps를 사용하여 CPU가 변경되는지 확인하세요)

필요한 경우 최신 버전의 Ubuntu를 사용하고 apt-get을 사용하여 cgroup을 설치했습니다.

답변1

맨페이지 cset-shield에는 다음과 같은 설명이 있습니다.

선택 사항인 --kthread=on 옵션이 Shield 명령에 제공되면 모든 커널 스레드(CPU별 인터럽트 커널 스레드 제외)도 시스템 세트로 이동됩니다.

나는 이것을 "(일부) 인터럽트 커널 스레드가 CPU에 바인딩되어 있습니다"라고 해석합니다. 이름으로 판단하면 ksoftirqd(Kernel Soft IRQ Daemon)이 ​​가능한 후보인 것 같습니다! (그런데, 나는 이러한 커널 스레드가 성능 측정에 영향을 미치지 않는다고 생각합니다.)

관련 정보