사람들이 듀얼 코어 CPU를 사용할 때 make에 -j3 옵션을 권장하는 이유는 무엇입니까?


18

젠투 리눅스에서 설정할 수 MAKEOPTS있는 변수 /etc/portage/make.conf이야기하는 make패키지를 만들 때이 병렬로 실행해야합니다 얼마나 많은 작업을. 듀얼 코어 CPU가 -j2있으므로 코어 당 하나의 작업으로 옵션 을 사용하기로 결정했습니다 . "문제점"은 듀얼 코어 CPU를 사용하는 사용자에게 -j3옵션 을 설정하도록 알려주는 참조가 많이 있습니다. 그들 중 일부는 다음과 같습니다.

예를 들어 젠투 핸드북은 다음과 같이 말합니다.

올바른 선택은 시스템의 CPU (또는 CPU 코어) 수에 1을 더한 것이지만이 지침이 항상 완벽하지는 않습니다.

그러나 "CPUs + 1"규칙의 근거는 무엇입니까? 왜 여분의 직업입니까?

make.conf (5) 매뉴얼 페이지는 다음과 같이 말합니다.

권장 설정은 CPU + 1과 2 * CPUs + 1 사이입니다.

또한 옵션 에 대한 make정보 페이지 및 make매뉴얼 페이지 설명 에서 섹션 5.4 (병렬 실행)를 읽었 -j지만 답변이없는 것 같습니다.



답변:


13

항상 작동하는 간단한 규칙은 없습니다. 사람들은 특정 기계에서 특정 편집을 실험했기 때문에 특정 인물을 추천 할 수 있으며 이것이 가장 좋은 설정이거나 실제와 관련이 있거나 없을 수도있는 추론을 따랐기 때문에 권장됩니다.

많은 RAM을 사용하는 경우 긴 컴파일의 제한 요소는 CPU 시간입니다. 그런 다음 CPU 당 하나의 작업과 가끔 발생하는 I / O 블록에 대해 보류중인 작업 하나가 좋은 설정입니다. 즉하게 -j3(듀얼 CPU의 기계, 더 정확하게 또는 - 각 코어가 하이퍼 스레딩 경우, 즉 4 개의 CPU, 그렇게 될 듀얼 코어 CPU에 대한 -j5).

RAM이 거의없는 경우 제한적인 요인은 동시 작업이 많지 않거나 계속 서로 교환 할 수 있다는 것입니다. 예를 들어 메모리에 두 개의 컴파일러 인스턴스를 편안하게 맞출 수없는 경우 make -j2이미보다 느릴 수 있습니다 make. 이는 RAM에 한 번에 몇 개의 컴파일러 프로세스를 적용 할 수 있는지에 따라 달라 지므로 일반적인 수치를 도출 할 방법이 없습니다.

그 사이에 더 많은 일자리를 얻는 것이 유리할 수 있습니다. 각 컴파일러 프로세스는 작지만 전체 빌드가 많은 데이터에 닿으면 디스크 I / O가 차단 요소가 될 수 있습니다. 이 경우 한 번에 CPU 당 여러 개의 작업을 원하므로 각 CPU를 사용하는 작업은 항상 있고 다른 작업은 I / O를 기다리고 있습니다. 다시 말하지만, 이것은 빌드 작업과 사용 가능한 RAM에 달려 있습니다. 여기서 데이터 캐시에 사용할 수있는 항목이 있습니다 (너무 많은 작업을 수행하면 캐시를 너무 많이 오염시키는 것이 최적입니다).


CPU 코어가 하이퍼 스레딩 된 경우 각각이 2로 계산된다는 것을 몰랐습니다. 어쨌든 내 CPU 는 하이퍼 스레딩을 지원하지 않는 것 같습니다 .
Francesco Turco

나는이 대답을 받아 들였다. 어쨌든 나는 -j2내 시스템 을 고수하기로 결정했다 . 나는 둘 다 새로운 시도 때문이다 gccfirefox에서 설정 -j1까지 -j5(10 명령을 등장의 총), 그리고 그 동안 보인다 -j2확실히 빠르게보다 -j1다른 세 가지 설정이와 비슷한 수준이다 -j2.
Francesco Turco

7

나는이 좀 것 같다 발견 - 수 make발사로 CPUs + 1처리하는 것이 있는지 확인하는 것입니다 :

  1. 방금 완료 한 작업자 프로세스와 아직 실행하지 않은 작업자 프로세스 (예 : 사전 채우기 실행 큐) 간에는 차이가 없습니다.
  2. 실행 대기열 사전 채우기로 눈에 띄는 오버 헤드를 가져 오기에는 너무 많은 경쟁 프로세스가 없습니다.

그러나 이것은 휴리스틱 이며 FreeBSD 핸드북은 여전히 단일 CPU를 권장 make -j4 합니다.


5

일반적으로 코어 수보다 많은 작업을 시작해야하는 이유가 있습니다. gcc를 사용한 C 컴파일의 경우, -pipe가 gcc 옵션에 정의되어 있지 않으면 임시 파일을 사용하여 조치 (전처리, 첫 실행, 최적화 및 어셈블리)를 순서대로 수행합니다. -pipe는 서브 프로세스간에 파이프를 사용하도록이를 변경합니다. (예를 들어 FreeBSD의 경우 -pipe를 추가하는 것이 기본이지만 Linux에서는 전통적이지 않습니다.) 따라서 2 개의 코어가 있고 2 개의 작업을 병렬로 허용하면 디스크 I / O에 시간이 걸립니다. 1 개의 직업을 추가하라는 권고는이 특성과 관련이있는 것 같습니다. 그러나 최종 답변을 얻으려면이 추천을 추가 한 사람을 찾아서 물어보십시오 :) 또는 Gentoo devels의 메일 링리스트에 문의하십시오.


2

기본적으로 그 숫자는 저자들이 상식이라고 부르는 것입니다. 기껏해야 좋은 추측입니다. 내가 아는 한, 입력 할 때 생성되는 make 프로세스 make가 이미 계산되었으므로 -j3두 프로세스가 컴파일되는 동안 기본 프로세스 대기로 끝날 수 있습니다.

그러나 Gentoo를 사용했을 때의 경험칙은 <#cpus>*2 + 1입니다.

그것은 당신의 치킨 트레일, 찻잎 또는 마술 8 공이 당신이해야 할 디스크 I / O와 현재 리눅스 커널의 스케줄링에 대해 알려주는 것에 달려 있습니다. [이 게시물의 핵심 시작] 내 개인적인 경험 ( -j젠투에 한정되지는 않음)에서 #cpus + 1과 #cpus * 2 +1 사이의 모든 항목에서 훌륭한 결과를 얻습니다 [이 게시물의 핵심 종료]. 평균적으로 차이는 거의 없습니다. 요즘 프로세서와 커널은 꽤 좋습니다.

그러나 a) 실제로 두 개 이상의 상자를 사용하여 컴파일 (du'h)하거나 b) 자신의 코드를 개발하는 경우이 모든 변경 사항

-j속성이 높을수록 이전에 알려지지 않은 종속성이 표시 될 가능성이 높습니다.

그리고 참고 사항 : 코어 수는 사용하지 말고 CPU가 동시 스트림 수를 사용하십시오. (하이 퍼트 헤딩!)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.