'make -j'(인수 없이)는 위험한가요? [폐쇄]

'make -j'(인수 없이)는 위험한가요? [폐쇄]

오늘 일찍 뭔가를 짓고 있는 동안 나는 make달리기로 결심했습니다.

$ make -j

아마도 합리적인 한도를 기본값으로 cabal설정하는 등 다른 프로그램의 습관 때문일 수 있습니다 .-j

약 20초 후,전체 데스크탑이 작동을 멈췄어요. 나는 활동의 징후를 찾았습니다. 팬이 회전하지 않습니다. HDD 표시등이 녹색으로 켜져 있지만 디스크 활동 소리가 들리지 않습니다.어 허.10분간의 침묵 끝에 드디어 오래 전에 눌렀던 첫 번째 키에 대한 반응이 나타났고, 아주 익숙한 디스크 두드리는 소리도 들리기 시작했습니다. 응답하지 않는 이 시스템에서 터미널에 들어가려고 20분 동안 천천히 시도한 후 마침내 포기하고 REISUB을 사용했습니다.


처음에는 범인이 관련 없는 데스크톱 응용 프로그램임에 틀림없다고 생각했습니다.대화형 bash 세션의 메모리 제한이런 상황이 오기 전에! 하지만 /var/log/syslogOOM 킬러가 남긴 흔적은 다릅니다.일부 ps폐차장의심스러운 것포장된그리고 c++프로세스 cc1plus!

다음은 덤프 중 하나의 빈도 분석입니다.

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

그래서 GNU make의 매뉴얼 페이지를 확인했습니다: (강조 추가)

-j [jobs], --jobs[=jobs] 동시에 실행할 작업(명령) 수를 지정합니다. -j 옵션이 여러 개 있는 경우 마지막 옵션이 적용됩니다. -j 옵션을 인수 없이 지정하면 make는 동시에 실행할 수 있는 작업 수를 제한하지 않습니다.


문제를 재현할 수 있는지 확인하고 싶지 않습니다.(박사님, 하면 아파요)이것...), 그러나 지금까지의 결과는 홈런처럼 보입니다. 분명히 make -j수백 개의 결과 프로세스가 발생했습니다.확실히 그렇습니다정지 및 디스크 스래싱의 원인. 즉, 인터넷을 검색해봐도 이에 대한 경고를 많이 찾을 수 없었습니다. 내가 너무 성급하게 결론을 내리는 걸까?

make -j정말 생각만큼 위험한가요? 만일이 경우라면,도대체 왜거기 있나요? 바보가 사용하는 것을 방지하려면 어떻게 해야 합니까?

답변1

다양한 상상력을 발휘하여 자신의 발에 총을 쏠 수 있는 도구가 있습니다. 이렇게 하면 다른 사람들이 "정상"이라고 생각하는 것에 제한을 받지 않고 상상력을 사용하여 문제를 해결할 수 있습니다.

소규모 프로젝트를 실행하는 것이 make -j합리적입니다 . 다른 프로젝트에서는 -j매개변수 없이 사용하면 시스템 응답성이 심각하게 손상될 수 있습니다. 일부 프로젝트에서는 병렬 빌드를 사용하는 경우에도 -j2빌드가 완전히 중단됩니다(병렬 make 프로세스로 생성된 파일은 시간이 지나면 다른 프로세스에 나타날 수 없습니다).

개인적으로 나는 별칭을 사용하지 않을 것입니다 make( make -j4귀하의 의견에서 말씀하셨듯이). 나는 기계에게 무엇을 해야 할지 명시적으로 알려주는 것이 가장 좋다고 생각합니다.알다그것은 무엇을 할 것인가? 며칠 후 나는 이 별칭을 잊어버리고 왜 내가 다른 터미널에 구축한 네 개의 프로젝트로 인해 내 시스템이 응답하지 않는지 궁금해했습니다.

"위험"에 관해서는... 그 단어는 상황에 따라 다른 것을 의미합니다. 예, 시스템이 응답하지 않게 만들 수 있으므로 "위험"합니다. 예, 빌드하는 동안 빌드 프로세스가 중단될 가능성이 높기 때문에 "위험"합니다. 하지만 아니요, 하드 드라이브를 다시 포맷하거나 임의의 파일을 삭제하기 시작한다는 점에서 "위험"하지 않습니다.

그렇다면 바보를 예방하는 방법은 무엇입니까?

다음은 확실한 단계별 가이드입니다.

  1. 도구를 사용하는 방법을 배우십시오.

또한 -jBSD 플래그 에 유의하세요.make 하다인수가 필요하며 이 플래그는 비표준입니다(Unix POSIX 표준에서는 이를 언급하지 않습니다).

답변2

다음을 사용하여 make를 제한할 수도 있습니다 -l.

-l [load], --load-average[=load] 실행 중인 다른 작업이 있고 로드 평균이 load(float) 이상인 경우 새 작업(명령)이 시작되지 않도록 지정합니다. 인수가 없으면 이전 로드 제한을 제거합니다.

그러나 다음과 같이 실행하는 것은 도움이 되지 않는 것 같습니다 make -j -l4.

로드 평균이 한도를 초과하기 전에 너무 많은 작업이 시작되었습니다(내 경험상). 예를 들어 조합이 작동할 수 있습니다 make -j8 -l4.

관련 정보