[Jenkins] swap file 설정을 통한 메모리 누수문제 해결

2019. 8. 27. 01:50CentOS 7/Jenkins

300x250
반응형

젠킨스를 이용하여 톰캣 또는 spring boot jar 앱을 실행시킬 때, 아래의 메시지를 출력하며 build fail이 될 때가 있습니다.

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e0800000, 130023424, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 130023424 bytes for committing reserved memory.

Cannot allocate memory, 바로 메모리 초과 문제입니다.
이를 해결하기 위한 방법으로 Jenkins 의 JVM 메모리를 늘려주는 방법도 있으나,
저사양 메모리를 쓰고 있는 저의 경우 ( 1GB 짜리 메모리를 쓰고 있습니다. ) 무작정 JVM메모리를 늘리는 것은 문제의 해결책으로 보기 어렵습니다.

리눅스 메모리가 많이 부족한 경우, swap 메모리를 추가하여 가상메모리로 이용하면 메모리 관련 문제를 해결할 수 있습니다.


1. 메모리 및 swap 메모리 확인

free 명령어를 통해 리눅스 OS 메모리를 확인할 수 있습니다.

free -h
total        used        free      shared  buff/cache   available
Mem:           991M        793M         75M         14M        122M         50M

만일, 이 명령어를 호출 했을 때, Swap 메모리가 출력되지 않는다면 swap 가상메모리 설정이 되어있지 않다는 것이다.


2. swap파일 생성하기

dd 명령어를 이용하여 null문자로 채워진 대용량파일을 만듭니다.
swap파일은 보통, RAM 메모리의 1.5~2배정도로 설정하는 것을 권장합니다.

dd if=/dev/zero of=/var/spool/swap/swapfile bs=1MiB count=2048

한번에 1MiB(1MB)씩 2048번 반복하여 null문자로 채워진 파일을 만듭니다. (1MB * 2048 = 2GB)

현재 제가 사용하고 있는 클라우드는 1G의 RAM을 가지고 있기 때문에 swapfile을 2G로 설정하면 됩니다.
swap 메모리파일을 /var/spool/swap 디렉토리 아래에 swapfile라는 이름의 2G용량의 대용량 파일을 생성했습니다.

fallocate 명령어를 이용하여 대용량 파일을 생성할수도 있으나, Linux버전에 따라 간혹 swapfile로 이식이 안될때가 있습니다. 따라서 dd 명령어와 /dev/zero를 활용하여 swap파일을 만드는 것을 권장합니다.


sudo chmod 600 /var/spool/swap/swapfile

swapfile 퍼미션을 rw-------(600) 으로 변경합니다.


sudo mkswap /var/spool/swap/swapfile

swap포맷으로 변환합니다.

sudo swapon /var/spool/swap/swapfile

이 swap파일을 시스템상에 등록합니다.


3. swap 파일 영구적용하기

vim /etc/fstab
UUID=09934798-af72-4741-b12f-aa84a5850aa1 /                       ext4    defaults        1 1
/var/spool/swap/swapfile    none    swap    defaults    0 0

swapon 명령어를 이용하면 시스템에 swap파일을 등록할 수 있지만, OS를 재부팅할 경우 다시 리셋이 됩니다.
swap파일 등록을 영구히 하기 위해서는, 리눅스 파일시스템테이블에 등록해주면 됩니다.
/etc/fstab 에는 swap파일 이외에 마운트폴더 영구 적용에도 이용됩니다.

위의 코드의 맨아래줄과 같이 swap파일을 등록해줍니다.


4. swap파일 확인

free -h 명령어로 swap파일이 정상적으로 등록되었는지 확인해봅시다.

free -h
total        used        free      shared  buff/cache   available
Mem:           991M        793M         75M         14M        122M         50M
Swap:          2.0G        636M        1.4G

이제는 예전과 달리 Swap 파일도 출력됩니다.


4-2. swap파일 위치 확인

swapon --show
NAME                     TYPE SIZE   USED PRIO
/var/spool/swap/swapfile file   2G 638.5M   -2

swapon 명령어를 호출하면 등록된 swap파일 풀네임 및 크기, 사용량 등을 확인 할 수 있습니다.


++ 키워드

  1. Jenkins 'Cannot allocate memory' Error
  2. 젠킨스 빌드시 메모리 누수 문제
  3. os::commit_memory(0x00000000e0800000, 130023424, 0) failed; error='Cannot allocate memory' (errno=12)
  4. There is insufficient memory for the Java Runtime Environment to continue
  5. swapfile
  6. how to create swap partition in CentOS7
300x250
반응형