ROS 2 colcon 빌드, RAM 몇 GB면 될까: Nav2를 16·8·4GB에서 직접 빌드해 본 결과
ROS 2 작업공간을 colcon build로 빌드하다가 노트북이 멈추거나 c++: fatal error: Killed signal terminated program cc1plus를 본 적이 있다면, 원인은 대개 RAM이다. 그럼 RAM은 몇 GB면 될까. 감으로 답하지 않고, 실제 패키지(Nav2, Jazzy 브랜치 45개 패키지)를 RAM 상한을 바꿔 가며 다섯 번 빌드해 쟀다.
결론부터
- 기본 설정 그대로(
colcon build) 빌드하면 4GB에서는 실패했다. 컴파일러가 메모리 부족으로 강제 종료됐다. - 8GB에서는 성공했지만 상한 8GiB 중 7.8GiB까지 차올랐다. 남는 몫이 거의 없다.
- 순차 빌드(
--parallel-workers 1+MAKEFLAGS=-j1)로 바꾸면 최대 2.7GiB로 줄었고, 4GB에서도 끝까지 빌드됐다. - 실제 노트북은 OS·브라우저·IDE가 3~4GB를 더 쓴다. 그래서 기본 설정으로 편하게 빌드하려면 16GB, 8GB 노트북이라면 순차 빌드 설정이 현실적인 선이다.
측정 조건
4 vCPU·16GB 리눅스 서버(AWS Lightsail)에서 Docker 컨테이너마다 메모리 상한을 걸고, 스왑은 껐다(--memory-swap을 --memory와 같게). 그래서 “성공”은 RAM 안에서 끝났다는 뜻이다. 이미지는 ros:jazzy(다이제스트 066420e07f60…), Nav2는 jazzy 브랜치 커밋 645abd95다. 최대 메모리는 컨테이너 cgroup의 memory.peak로 읽었다.
| 조건 | RAM 상한 | 결과 | 최대 메모리 |
|---|---|---|---|
| 기본 설정 (4 워커 × make -j4) | 16GiB | 성공 (45/45) | 8.1GiB |
| 기본 설정 | 8GiB | 성공 (45/45) | 7.8GiB |
| 기본 설정 | 4GiB | 실패 — cc1plus Killed, 8개 완료 후 중단 | 4.0GiB (상한) |
| 순차 빌드 (워커 1 × make -j1) | 16GiB | 성공 (45/45) | 2.7GiB |
| 순차 빌드 | 4GiB | 성공 (45/45) | 2.7GiB |
숫자를 읽을 때 주의할 점
- memory.peak에는 파일 캐시도 들어간다. 16GB에서 8.1GiB가 잡힌 건 여유가 있어서 캐시까지 넉넉히 쓴 결과다. 8GB에서 7.8GiB로 상한 근처까지 찼지만 죽지 않은 것도, 커널이 캐시를 비워 가며 버텼기 때문이다. 그래서 “기본 설정에 꼭 필요한 양”은 4GiB보다 크고 8GiB보다 작은 어딘가다.
- 빌드 시간은 비교하지 않는다. 측정 서버는 CPU 크레딧이 바닥나 중간부터 속도가 묶였다(steal 약 60%). 그래서 기본 설정과 순차 빌드가 둘 다 2시간 안팎으로 비슷하게 나왔다. 제 속도가 나오는 PC라면 순차 빌드는 기본 설정보다 몇 배 느리다.
- 코어 수에 따라 달라진다. 기본 설정은 동시에 도는 컴파일러 수가 대략 코어 수의 제곱(워커 수 × make -j)까지 늘어난다. 8코어·16코어 노트북은 같은 Nav2라도 기본 설정에서 더 많은 RAM을 쓴다.
8GB 노트북이라면
내가 쓰는 노트북은 2020년 인텔 맥북 프로 13형(4코어, RAM 8GB)이다. 이 측정 기준으로 보면, 이 정도 사양에서 Nav2 같은 큰 작업공간을 기본 설정으로 빌드하면 OS 몫까지 합쳐 메모리가 모자랄 가능성이 크다(측정은 위 리눅스 서버에서 했고, 이 맥에서 직접 빌드하지는 않았다). 8GB에서 빌드해야 한다면 이렇게 돌린다.
MAKEFLAGS="-j1" colcon build --parallel-workers 1
조금 덜 느리게 하려면 MAKEFLAGS="-j2"처럼 숫자를 하나씩 올려 보며 멈추지 않는 선을 찾으면 된다. 동시에 도는 컴파일러가 늘수록 최대 메모리가 커진다는 원리는 colcon 순차 빌드 메모리 예산 글에서 따로 쟀다.
RAM을 사거나 바꾼다면
측정 결과로 정리하면 기준은 이렇다.
- 새 노트북: ROS 2 개발용이면 RAM 16GB 이상. 코어가 8개 이상이면 32GB가 편하다.
- 지금 노트북 업그레이드: RAM 슬롯이 있는 모델이면 16GB 모듈로 올리는 게 가장 싸게 해결하는 방법이다. 맥북처럼 RAM이 메인보드에 붙어 있는 모델은 교체가 안 되니 순차 빌드 설정으로 버틴다.
위 기준에 맞춰 고른 상품이다. 써 보고 고른 게 아니라 사양으로 고른 것이니, 사기 전에 내 노트북과 맞는지 꼭 확인한다.
- 삼성 노트북용 DDR5 16GB 5600MHz: 최근 노트북에 많이 쓰는 규격이다. 내 노트북이 DDR5 SO-DIMM 슬롯을 쓰는지 먼저 확인한다. RAM이 메인보드에 붙은(LPDDR) 모델은 교체할 수 없다.
- 삼성전자 노트북용 DDR4 16GB: 그 이전 세대 노트북용이다. DDR4와 DDR5는 슬롯 모양이 달라 서로 끼울 수 없다.
- 레노버 씽크패드 X390 i7 RAM 16GB: 2019년 출시 모델로, 4코어 CPU에 RAM 16GB다. 측정 서버와 코어 수가 같아 위 표를 참고하기 좋다. 다만 OS·브라우저 몫을 빼면 기본 설정 빌드의 여유는 크지 않다. 이 모델은 RAM이 메인보드에 붙어 있어 나중에 늘릴 수 없다.
같은 방법으로 MoveIt 2도 쟀다. MoveIt 2는 8GB에서 기본 설정 빌드가 실패했다: MoveIt 2 RAM 실측 글.
재현
측정 스크립트(measure.sh)와 다섯 번의 원본 결과(results.tsv, 조건별 빌드 로그)는 실험 공개 폴더에 있다. Docker가 있는 리눅스에서 bash measure.sh로 같은 순서를 다시 돌릴 수 있다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.