isolcpus의 다양한 코어에서 작업 세트가 작동하지 않음


13

서두를 위해 AMD64 칩셋에서 커널 3.2와 함께 Debian Wheezy를 사용하고 있습니다. 내 컴퓨터에는 두 개의 Xeon E5-2690 코어가 있습니다. 하나의 CPU에있는 모든 코어가 단일 프로세스에 전용되도록 부트 매개 변수를 설정했습니다. 이를 위해 grub에서 isolcpus = 8,9,10,11,12,13,14,15를 설정했습니다.

여태까지는 그런대로 잘됐다. 이제 주어진 명령에 대해 격리 된 CPU를 사용하고 싶다고 가정 해 봅시다. 단순한 무한 루프를 사용합니다.

$ taskset -c 8-15 bash -c '동안 true; echo hello> / dev / null을 수행하십시오. 완료 &

지금까지 최고는 코어 8이 최대 100 % 활용률로 회전 함을 보여줍니다. 이제 해당 명령을 다시 시작한다고 가정 해 보겠습니다.

$ taskset -c 8-15 bash -c '동안 true; echo hello> / dev / null을 수행하십시오. 완료 &

위의 내용은 코어 9-15가 유휴 상태이고 두 프로세스가 코어 8을 공유하고 있음을 보여줍니다.

$ taskset -c 8 bash -c '진실한; echo hello> / dev / null을 수행하십시오. 완료 &

$ taskset -c 9 bash -c '진실한; echo hello> / dev / null을 수행하십시오. 완료 &

코어 8과 9는 각각 100 % 활용도를 얻습니다. 코어 1-7을 가진 동일한 작업 세트가 관련 코어에 프로세스를 올바르게 분산시키기 때문에 이는 isolcpus에만 적용됩니다. 또한 "taskset -p"는 8-15 프로세스에 대한 선호도 마스크가 올바르게 설정되었음을 보여줍니다. 커널 스케줄러가 isolcpus 선호도 마스크에 지정된 최저 코어 이외의 것을 사용하지 않는 것 같습니다.

일반적으로 이것은 위의 예제와 크게 다르지 않으며 각 프로세스마다 개별 코어를 지정하십시오. 그러나 전용 CPU에서 매우 다중 스레드 응용 프로그램을 실행하고 싶습니다. 생성 된 각 개별 스레드에 대해 프로세서 선호도를 개별적으로 재설정하지 않고도 코어 세트를 지정하고 스레드 풀이 자동으로 사용되도록하고 싶습니다.

누구든지 스케줄러가 isolcpu 세트에서 둘 이상의 코어를 제공하도록하는 방법을 알고 있습니까?


멀티 스레드 프로그램을 사용해 볼 수 있습니까? 배쉬는 멀티 스레드되지 않습니다
c4f4t0r

1
그렇습니다. 그것이 원래 나를 알아 차게 한 이유입니다 (멀티 스레드 프로그램은 둘 이상의 코어를 사용하지 않았습니다). 많은 스레드를 작성하는 간단한 Python 스크립트가 isolcpus 세트에서 실행될 때 둘 이상의 코어를 사용하지 못합니다. 비 절연 코어에서 실행하면 사용 가능한 모든 8 코어를 사용합니다.
user79126

linuxtopia.org/online_books/linux_kernel/kernel_configuration/…을 읽으면 커널 스케줄러에서 cpus가 제외되지만 cpus를 제외하면 제외 된 cpus에서 프로세스를 실행하고 싶습니까?
c4f4t0r

1
프로세서 선호도 마스크에서 사용해야한다는 표시가 없으면 커널은 isolcpu에서 스레드 또는 프로세스를 예약하지 않습니다. 그렇지 않으면 isolcpus는 사용자가 지정한 이유로 코어를 예약하고 원치 않는 프로세스에서 코어를 사용하지 않도록 할 때 코어를 끄는 것과 같습니다. Taskset은 선호도 마스크가 8-15 범위의 모든 코어 (/ proc에서 체크인 할 때 올바르게 설정 됨)를 사용하도록 설정하므로 커널은 유휴 코어에서 프로세스를 예약해야합니다.
user79126

답변:


10

좌절의 하루 후에 나는 해결책을 결정했다. 이 동작은 기본 커널 스케줄러 알고리즘 (이 배포판 / 커널의 경우 SCHED_OTHER)의 인공물 인 것 같습니다. 프로세스를 다른 알고리즘으로 변경하면 문제가 해결되며 프로세스 / 스레드에서 isolcpus가 적절히 활용됩니다.

SCHED_RR을 사용했지만 결국 SCHED_FIFO와 SCHED_IDLE을 모두 테스트했습니다. chrt 유틸리티를 사용하여 대체 알고리즘으로 프로세스를 시작할 수 있습니다.

$ sudo chrt -r 1 [명령]

루트가 아닌 것으로 실행하려면 setcap 유틸리티를 사용하여 명령과 관련된 이진 파일에서 CAP_SYS_NICE를 활성화 할 수 있습니다.


1
코어 0,1에 친화력을 설정하는 작업이 있지만 Java 응용 프로그램은 첫 번째 코어 만 사용했습니다. 'sudo chrt -r 1 [command]'도 내 문제를 해결했습니다.
Barry NL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.