Gentoo Linux에서는 패키지를 빌드할 때 병렬로 실행해야 하는 작업 수를 알려주 MAKEOPTS
는 변수를 설정할 수 있습니다 . 저는 듀얼 코어 CPU를 가지고 있기 때문에 순진하게 이 옵션을 사용하기로 선택했습니다. 즉, 코어당 하나의 작업이므로 둘 다 할 일이 있습니다. "문제"는 듀얼 코어 CPU를 사용하는 사용자에게 이 옵션을 대신 설정하라는 참조가 많다는 것입니다 . 그 중 일부는 다음과 같습니다:/etc/portage/make.conf
make
-j2
-j3
예를 들어, 젠투 매뉴얼에는 다음과 같이 나와 있습니다:
좋은 선택은 시스템의 CPU(또는 CPU 코어) 수에 1을 더하는 것이지만 이 지침이 항상 완벽한 것은 아닙니다.
그러나 "CPU + 1" 규칙의 근거는 무엇입니까? 왜 추가 작업을 해야 하나요?
make.conf(5) 매뉴얼 페이지에는 다음과 같은 내용도 나와 있습니다.
권장 설정은 CPU+1과 2*CPU+1 사이입니다.
make
또한 정보 페이지에서 섹션 5.4(병렬 실행) 와 make
이 옵션에 대한 매뉴얼 페이지 설명을 읽었 -j
지만 답이 없는 것 같습니다.
답변1
항상 작동하는 간단한 규칙은 없습니다. 사람들은 특정 컴퓨터에서 특정 편집을 시도했는데 그것이 최적의 설정이었기 때문에 또는 현실과 관련이 있을 수도 있고 없을 수도 있는 몇 가지 추론을 따랐기 때문에 특정 번호를 추천할 수 있습니다.
RAM이 많은 경우 긴 컴파일의 제한 요소는 CPU 시간입니다. 그런 다음 CPU당 하나의 작업과 가끔 I/O 블록에 대한 보류 작업을 추가하는 것이 좋은 설정입니다. 이는 -j3
듀얼 코어 CPU(또는 더 정확하게는 듀얼 CPU 시스템에 적합합니다. 각 코어가 하이퍼스레딩된 경우 4개의 CPU가 있으므로 -j5
)에 적합합니다.
RAM이 매우 작은 경우 한 가지 제한 요소는 동시 작업을 많이 가질 수 없거나 작업이 지속적으로 서로 교체된다는 점일 수 있습니다. 예를 들어 두 개의 컴파일러 인스턴스를 메모리에 쉽게 맞출 수 없다면 make -j2
이미 2개 이상의 make
컴파일러 인스턴스가 있을 수 있습니다. 이는 RAM에 동시에 들어갈 수 있는 컴파일러 프로세스 수에 따라 달라지므로 일반적인 숫자는 없습니다. 와.
그 사이에 더 많은 일자리를 갖는 것이 도움이 될 수 있습니다. 각 컴파일러 프로세스는 작지만 전체 빌드에 많은 양의 데이터가 포함되는 경우 디스크 I/O가 차단 요인이 될 수 있습니다. 이 경우 동시에 실행되는 CPU당 여러 작업이 필요하므로 항상 각 CPU를 사용하는 하나의 작업이 있고 다른 작업은 I/O를 기다리고 있습니다. 다시 말하지만 이는 빌드 작업과 사용 가능한 RAM에 따라 크게 달라집니다. 여기서는 데이터 캐시에 사용 가능한 항목에 따라 달라집니다(너무 많은 작업이 캐시를 너무 많이 오염시키는 최적의 값이 있습니다).
답변2
좀 그럴거 같은데경험적— 프로세스 make
시작을 허용하면 CPUs + 1
다음이 보장됩니다.
- 방금 완료된 작업자 프로세스와 아직 실행되지 않은 작업자 프로세스 사이에는 간격이 없습니다. 이는 실행 대기열을 미리 채우는 것과 같습니다.
- 대기열 사전 채우기를 실행하여 상당한 오버헤드가 발생할 정도로 경쟁하는 프로세스가 너무 많지는 않습니다.
그런데 또 그게 말이야.경험적FreeBSD 매뉴얼은 아직추천하다 make -j4
단일 CPU의 경우.
답변3
일반적으로 코어 수보다 더 많은 작업을 시작하는 이유가 있습니다. gcc를 사용한 C 컴파일의 경우 -pipe가 gcc 옵션에 정의되지 않은 경우 임시 파일을 사용하여 작업(전처리, 첫 번째 실행, 최적화 및 어셈블리)을 순차적으로 수행합니다. -pipe는 이를 하위 프로세스 파이프라인 간에 사용하도록 변경합니다. (-pipe를 추가하는 것은 FreeBSD에서는 기본값이지만 Linux에서는 레거시가 아닙니다.) 따라서 2개의 코어가 있고 2개의 작업을 병렬로 허용하는 경우 디스크 I/O에 약간의 시간을 소비하게 됩니다. 일자리 1개를 추가하라는 제안은 이 세부정보와 관련이 있는 것 같습니다. 하지만 최종 답변을 얻으려면 누가 이 제안을 언제 추가했는지 찾아 그에게 물어봐야 합니다. :) 또는 Gentoo 개발자 메일링 리스트에 물어보세요.
답변4
기본적으로 이 숫자는 저자가 상식이라고 부르는 것입니다. 기껏해야 이것은 좋은 추측입니다. 내가 아는 한, 입력할 때 생성된 make 프로세스는 make
이미 설명되어 있으므로 -j3
다른 두 프로세스가 컴파일되는 동안 기본 프로세스가 대기하게 될 수 있습니다.
하지만 젠투를 사용할 때의 경험 법칙은 <#cpus>*2 + 1
.
모든 것은 치킨 트레일, 찻잎 또는 어떤 디스크 I/O가 발생해야 하는지와 현재 Linux 커널의 일정을 알려주는 마법의 8볼에 따라 달라집니다. [이 게시물의 핵심 시작] 내 개인적인 경험에 따르면( -j
Gentoo에 국한되지 않음) #cpus + 1과 #cpus *2 +1 사이의 모든 것이 좋은 결과를 낳을 것입니다. [이 게시물 핵심 끝] 평균적으로는 거의 눈치채지 못할 것입니다. 차이점. 오늘날의 프로세서와 코어는 매우 좋습니다.
그러나 a) 실제로 여러 상자를 사용하여 컴파일하거나(du'h) b) 자신의 코드를 개발하는 경우 이 모든 변경 사항이 적용됩니다.
속성이 높을 -j
수록 이전에 알려지지 않은 종속성을 표시할 가능성이 더 높습니다.
참고: 코어 수가 아니라 CPU가 차지하는 동시 스트림 수를 고려하십시오. (슈퍼 타이틀!)