뭔가를 만들 때 오늘 아침, 나는 실행하기로 결정 make
으로
$ make -j
아마도 다른 프로그램과 습관 중 같은 cabal
곳 -j
합리적인 제한 기본값.
약 20 초 후에 내 전체 데스크탑이 정지 됩니다. 다양한 활동의 징후를 찾습니다. 팬이 회전하지 않습니다. HDD 표시등이 녹색으로 켜져 있지만 디스크 작동이 들리지 않습니다. 흠. 10 분의 침묵 후에 마침내 몇 년 전에 처음으로 눌렀 던 키 누르기에 대한 응답을 보게되었고 디스크 스 래싱이라는 너무 친숙한 소리도 들리기 시작합니다. 20 분 후이 응답하지 않는 머신에서 터미널로 천천히 들어 가려고했지만 REISUB를 사용했습니다.
처음에는 관련없는 데스크톱 응용 프로그램이 범인이되어야한다고 생각했습니다. 오랫동안 대화식 bash 세션에 메모리 제한을 두어 오랫동안 이러한 상황에 처하게되는 것을 막았습니다. 그러나 /var/log/syslog
다른 이야기를한다. 뒤에 왼쪽 OOM 킬러 일부 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는 동시에 실행할 수있는 작업 수를 제한하지 않습니다.
나는이 문제를 재현 할 수 있는지 확인하기를 꺼려 해요 (I 할 때 상처 의사를 이 …) 하지만, 조사 결과는 지금까지 홈런 것 같다 : 분명히, make -j
그리고 그 결과 프로세스의 수백 이 있어야합니다 되어 요령 및 디스크 탈곡의 원인. 즉, 인터넷을 검색하면서 나는 그것에 대해 많은 경고를 찾을 수 없습니다. 나는 결론에 뛰어 들고 있는가?
make -j
나에게 보이는 것처럼 위험한 가요 ? 그렇다면 왜 지상 에 존재하며, 그것을 교정하기 위해 무엇을 할 수 있습니까?
답변
상상력을 발휘할 수있는 도구가 있습니다. 이것은 다른 사람이 “정상적”이라고 생각하는 것에 제한을받지 않고 상상력을 사용하여 문제를 해결할 수 있도록하기위한 것입니다.
make -j
작은 프로젝트에서 실행 하는 것은 완벽합니다. 다른 프로젝트에서는 -j
인수없이 사용 하면 시스템 응답 성이 심각하게 손상 될 수 있습니다. 일부 프로젝트에서는와 함께도 병렬 빌드를 사용 -j2
하면 빌드가 완전히 중단됩니다 (병렬 make 프로세스로 작성된 파일은 다른 프로세스에 대한 시간 내에 있지 않습니다).
나는 개인적으로 에일리어싱 make
을 피할 것입니다 make -j4
(당신이 생각하는 것처럼 의견에서). 기계에게 무엇을해야하는지 명시 적으로 알려주는 것이 낫다는 것을 알게되었습니다 . 며칠 안에 그 별명을 잊어 버렸을 것입니다. 왜 별도의 터미널에 구축하고있는 4 개의 프로젝트가 내 시스템을 응답하지 않는지 궁금합니다.
“위험한”에 관해서는 … 단어는 다른 상황에서 다른 것을 의미합니다. 예, 시스템이 응답하지 않을 수 있기 때문에 “위험한”상태입니다. 예, 빌드 도중에 빌드 프로세스가 중단 될 수 있기 때문에 “위험한”상태입니다. 그러나 아니요, 하드 드라이브를 다시 포맷하거나 임의의 파일을 삭제하기 시작한다는 의미에서 “위험한”것은 아닙니다.
그래서 어떻게 바보 증거?
다음은 확실한 단계별 가이드입니다.
- 도구 사용법을 배우십시오.
또한 -j
BSD 플래그 에는 인수 make
가 필요 하며이 플래그는 비표준입니다 (Unix POSIX 표준에서는 언급하지 않음).
답변
다음을 사용하여 make를 제한 할 수도 있습니다 -l
.
-l [load], –load-average [= load] 다른 작업이 실행 중이고로드 평균이 최소한로드 (부동 소수점 숫자) 인 경우 새 작업 (명령)을 시작하지 않도록 지정합니다. 인수없이, 이전로드 제한을 제거합니다.
그러나 다음과 같이 실행하는 데 도움이되지 않는 것 같습니다 make -j -l4
.
로드 평균이 한계를 초과하기 전에 너무 많은 작업이 시작되었습니다 (내 경험에 따라). 따라서 조합이 작동 할 수 있습니다 (예 🙂 make -j8 -l4
.