성능 측정을 위해 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)이 가능한 후보인 것 같습니다! (그런데, 나는 이러한 커널 스레드가 성능 측정에 영향을 미치지 않는다고 생각합니다.)