Linux에서 CPU 선호도가 cgroup과 어떻게 상호 작용합니까?


10

격리 된 CPU 세트에서 멀티 스레드 벤치 마크를 실행하려고합니다. 긴 이야기를 짧게 줄이기 위해 처음에는 isolcpusand로 시도 taskset했지만 문제발생했습니다 . 이제 cgroups / csets를 가지고 놀고 있습니다.

"간단한" cset shield사용 사례가 잘 작동해야 한다고 생각합니다 . 코어가 4 개이므로 벤치마킹에 코어 1-3을 사용하고 싶습니다 (이러한 코어를 적응 형 틱 모드로 구성했습니다). 그러면 코어 0을 다른 모든 용도로 사용할 수 있습니다.

여기 의 자습서 따르면 다음과 같이 간단해야합니다.

$ sudo cset shield -c 1-3
cset: --> shielding modified with:
cset: "system" cpuset of CPUSPEC(0) with 105 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running

이제 "방패"가 격리되어 있으며 (사용자 cset) 코어 0은 다른 모든 것 (시스템 cset)을위한 것입니다.

좋아, 지금까지 좋아 보인다. 이제를 보자 htop. 프로세스는 모두 CPU 0으로 마이그레이션되어야합니다.

csets

응? 일부 프로세스는 차폐 코어에서 실행중인 것으로 표시됩니다. htop에 버그가있는 경우를 배제 taskset하기 위해 쉴드에있는 것으로 표시된 프로세스의 선호도 마스크를 검사하는 데 에도 노력했습니다 .

그 작업이 움직일 수 없었습니까? CPU3 (쉴드에 있어야 함)에서 실행되는 것으로 표시된 임의의 프로세스를 뽑아 htop시스템 cgroup에 다음과 같이 표시되는지 확인하십시오 cset.

$ cset shield -u -v | grep 864
   root       864     1 Soth [gmain]
   vext01    2412  2274 Soth grep 864 

그래,에 따라 시스템 cgroup에서 실행 중입니다 cset. 그래서 htopcset동의하지 않는다.

무슨 일이야? 누가 CPU 친화도 ( htop/ taskset)를 신뢰 cset합니까?

나는 당신 cset과 친밀감을 함께 사용해서는 안된다고 생각 합니다. 아마도 방패가 잘 작동하고 있기 때문에 선호도 마스크와 htop출력을 무시해야 합니다. 어느 쪽이든, 나는 혼란 스럽습니다. 누군가 빛을 비출 수 있습니까?


어떤 배포판을 사용하고 있습니까? OS와 버전에 따라 도구와 워크 플로가 다르기 때문에 묻습니다.
ewwhite

데비안 8 시스템입니다.
Edd Barrett

오 알았어 레드햇 세계에서, 우리가 numactl하고 cgconfig그리고 cgrules/ cgred당신이 무슨 일을하는지 간소화 할 수 있습니다. 이것들 약간의 작업으로 데비안 에서 사용할 수 있습니다 .
ewwhite

답변:


5

로부터 CPUSETS 문서 :

sched_setaffinity에 대한 호출은 해당 작업의 cpuset에 허용 된 CPU로만 필터링됩니다.

이는 CPU 선호도 마스크가 프로세스가 속한 cgroup의 cpus와 교차 함을 의미합니다.

예를 들어 프로세스의 선호도 마스크에 코어 {0, 1, 3}이 포함되어 있고 프로세스가 시스템 cgroup에서 실행되고 코어 {1, 2}로 제한된 경우 프로세스는 코어 1에서 강제로 실행됩니다.

나는 htopcgroup이 생성 된 후 프로세스가 깨어나지 않았고 디스플레이가 프로세스가 실행 된 마지막 코어를 표시한다는 사실에 대해 출력이 "잘못된" 것이라고 99 % 확신합니다 .

방패를 만들기 전에 vim을 시작하면 vim이 두 번 포크되고 (어떤 이유로 든) 가장 깊은 자식이 코어 2에서 실행되고 있습니다. 그런 다음 방패를 만들고 vim을 잠자기 (ctrl + z)하고 깨우면 두 프로세스 모두 이것이 코어 0으로 이동했습니다. 이것이 htop오래된 정보를 보여주는 가설을 확인시켜 준다고 생각합니다 .

필드를 검사 /proc/<pid>/status하고 볼 수도 cpus_allowed_*있습니다.

예를 들어 console-kit-daemon코어 3에서 실행되는 것으로 htop에 표시 되는 프로세스 (pid 857)가 있지만 다음과 /proc/857/status같습니다.

Cpus_allowed:   1
Cpus_allowed_list:      0

이것은 선호도 마스크가 0x1이며 cgroup으로 인해 코어 1에서만 실행될 수 있다고 생각합니다. 즉 intersect ({0,1,2,3}, {0}) = {0}.

가능하다면 질문을 잠시 열어두고 더 나은 답변이 나오는지 확인하십시오.

이 문제를 해결하는 데 도움을 주신 @davmac에게 감사합니다 (irc).


1
맞습니다. HTOP에 표시된 정보는 현재 프로세스가 진행중인 코어가 아니라 마지막으로 예약 된 코어입니다 (정보 수집을 위해 동일한 인터페이스를 사용하는 모든 것이 동일).
Austin Hemmelgarn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.