내 로컬 컴퓨터에는 여러 개의 CPU가 있고 각각 여러 개의 코어가 있으며 각각 여러 스레드를 지원할 수 있습니다. 단일 스레드에서만 강제로 실행하려는 멀티스레딩 프로세스가 있습니다. 나는 numactrl
그렇게 할 수 있다는 것을 이해합니다.
numactl
프로세스가 단일 스레드에서만 실행되도록 하려면 어떻게 해야 합니까 ? 아니면 이를 수행할 수 있는 더 간단한 내장 유틸리티가 있습니까?
답변1
numactl --physcpubind=+1 /path/to/your/executable
이렇게 하면 칩셋(색인 1)에 할당된 두 번째 코어/CPU에서 프로세스가 실행됩니다. 자세한 내용은 매뉴얼 페이지의 예제 섹션을 참조하십시오. http://linux.die.net/man/8/numactl
편집: 이는 프로그램이 최대 하나의 스레드를 동시에 실행한다는 것을 의미하지만 전체 프로세스가 단 하나의 스레드로 구성된다는 의미는 아닙니다. 프로그램이 새 스레드를 생성하도록 작성된 경우 그렇게 되지만 나머지 프로세스와 동일한 코어/CPU에서 실행됩니다. 미묘한 차이이지만 그럼에도 불구하고 잠재적으로 중요합니다.
답변2
프로그램을 하나의 CPU 하드웨어 코어/스레드로 제한하려면 다음을 사용할 수도 있습니다.taskset 1 prog [args]
추신
프로그램이 가질 수 있는 프로세스(스레드) 수를 제한하는 프로그램은 입니다 prlimit --nproc=1 prog [args]
. 나는 그것을 사용하려고 시도했고 rsync
"포크를 사용할 수 없습니다...IPC에서 오류가 발생했습니다"라는 메시지가 표시되고 끝은 rsync
하나의 스레드로 작동하지 않도록 작성되었습니다.
strace prlimit --nproc=1 rsync
실행은 호출 strace
의 반환 값 아래 SO 링크에 설명된 대로 표시됩니다 .clone
-1 EAGAIN (resource temporary unavailable).
PS 아이디어는 다음에서 따왔습니다.https://stackoverflow.com/questions/38637451/is-there-a-way-force-a-program-to-use-only-1-thread.