CRA 메모리 부족으로 인한 build 에러

kakasoo·2021년 3월 7일
0


( 사실 자바스크립트와 관련은 없지만, 모든 배너는 자바스크립트로 할 생각이다. 앞으로도. )

서론

순서 상 이게 먼저 나올 수는 없다. 하지만 처음부터 알아뒀으면 하는 내용이라 당겼다.

사실 메모리가 부족해서 build가 실패했다는 것을, 에러 발생 시 바로 알아내기도 힘들 것이다. 나의 경우에는 aws에서 프리티어로 발급 받은 서버로 클라이언트, 서버를 모두 배포하고 있었는데, npm run build를 할 때마다 모든 소프트웨어가 중단되는 것을 발견했다. 매번 build에 소요되는 시간도 길었거니와 한 번씩 팅기기라도 하면 시간이 너무 오래 걸려서 제대로 된 프로그래밍이 불가능했다. 사실, 이 글에서 메모리 부족을 해결할 수 있는, 완벽한 방법을 제공해줄 수는 없다.
말 그대로 메모리가 부족한 것이기 때문에 하드웨어적인 해결 방법 말고는 근본적인 해결책이 될 수 없다. 다만, 메모리를 일시적으로 할당해서 문제를 우회할 수는 있다. 이 방법은, 하드 디스크의 공간을 메모리처럼 사용하여 말 그대로 우회하는 것이다. 따라서 속도나 성능을 기대하고 사용해서는 안 된다.
또, 개인적인 경험 상, 이 방법을 쓰면 개발이 진척됨에 따라 문제가 더 심각해질 수도 있다. 이 명령어를 실행하는 시점이라면 이미 상당히 메모리가 부족한 상태일 것이고, 이 명령어를 실행하는 것조차 버거워질 수 있다.
따라서 그냥 하드웨어를 개선하는 게 해답이다.

그럼에도, 일시적인 해결책을 원한다면 아래의 방법을 따라해보자.

스왑 메모리 할당

echo "start!"

# 1단계
sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
echo "메모리할당 성공"

# 2단계
sudo chmod 600 /mnt/swapfile
echo "스왑 파일 권한 변경 성공"

# 3단계
sudo mkswap /mnt/swapfile
echo "스왑 영역 설정"

# 4단계
sudo swapon /mnt/swapfile
echo "스왑 영역 사용 추가"

# 5단계
sudo swapon -s
echo "스왑 영역 사용 체크"

# 6단계
npm run build
echo "빌드 완료"

# 7단계
sudo swapoff -v /mnt/swapfile
echo "스왑 메모리 해제"

sudo rm /mnt/swapfile
echo "해제 완료"

echo는 그냥 어디까지 진척됐는지 알아보기 위해서 작성한 것일 뿐 별 다른 의미는 없다. 단계 별로 설명하자면, 첫째는 메모리를 할당하는 일이다. 할당이라고 했지만, 실질적으로 사용 가능한 것은 아니다. 이 단계에서는 2048MB에 해당하는 파일을 생성하는 것과 같다. 메모리가 데이터를 기록하고 읽히기 위해 존재하듯, 동일한 역할을 할 파일을 만든다고 보면 된다. 2단계에서는 그 파일의 권한을 설정하는 일이다. 3단계에서는 영역을 설정하고, 4단계에서 사용을 추가한다.
5단계는 사실 체크를 할 뿐이고, 의미가 없다. 필요하다면 free -m 명령어를 통해 남은 메모리를 조회할 수 있는데, 이 명령어에서 스왑 메모리를 함께 조회할 수 있으니 참고하자.

다음으로는 npm run build를 한다. 앞선 과정이 정상적으로 진행되었다면, 매우 느린 속도지만 build를 할 수 있을 것이다. 이후 7단계에서 메모리를 해제하고, 다시 삭제해주면 된다. 만약 자주 build를 해야 한다면 차라리 메모리를 할당해놓고 풀지 않는 것도 나쁘지 않다.

이상의 방법으로 나는 문제를 해결할 수 있을 줄 알았지만, 안타깝게도 클라이언트 측 파일이 비대해짐에 따라 속도는 점차 느려졌고, 결국 감당할 수 없는 수준이 되었다. aws 프리티어로 DB, 서버, 클라이언트를 모두 돌리는 것 자체가 무리였던 모양이다.

최선의 방법은 서론에 말했다시피, 하드웨어적인 해결이다. aws에 요금을 내고, 더 많은 RAM을 확보하자.

profile
자바스크립트를 좋아하는 "백엔드" 개발자

0개의 댓글