로컬에서 개발할 때 출근 하고 랩탑을 켜고 Docker desktop을 실행시키면 매번 docker run명령을 통해 자주 쓰는 container를 실행시켜줘야 한다. 주로 로컬 DB가 있는 경우 이런 귀찮음이 엄청나다. 이럴 때는 –restart 옵션을 주면 docker desktop을 실행시킬 때 마다 container를 항상 같이 띄울 수 있다.
혹은 서버에서 docker container가 죽는 경우 재시작을 할 수 있도록 설정할 수도 있다.
--restart 옵션은 4가지가 있다.:
no: container를 재시작 시키지 않는다. (default)
on-failure[:max-retries]: container가 정상적으로 종료되지 않은 경우(exit code가 0이 아님)에만 재시작 시킨다. max-retries도 함께 주면 재시작 최대 시도횟수를 지정할 수 있고, 테스트 서버 등과 같은 리모트에 설정하면 좋을 것 같다.
always: container를 항상 재시작시킨다. exit code 상관 없이 항상 재시작 된다.
unless-stopped: container를 stop시키기 전 까지 항상 재시작 시킨다.
용량이 큰 프로그램을 사용하다 보면 화면 업데이트 업데이트가 안되는 freezing 현상이 발생되고, 마우스 클릭을 하더라도 반응이 없거나 매우 느린 현상이 발생한다면 “Memory 부족 현상”을 의심할 필요가 있다. 이런 현상이 발생하는 경우 ‘시스템 감시’ 를 띄워 놓고 Memory 와 SWAP 사용량을 확인하면 메모리 부족 현상 여부를 정확하게 판단할 수 있다. 아래 그림에서 시스템 감시는 8GB RAM 은 다 사용했고, 부족한 메모리를 대신 SWAP 을 사용하고 있지만 대략 50% 정도 사용 중이다.
emory 부족 현상은 1) 실제 메모리와 2) SWAP 메모리를 모두 사용한 상태이다. 이 경우 리눅스 커널의 OOM(Out of Memory) killer가 실행 중인 프로그램을 우선 순위에 따라서 필요한 메모리를 확보할때 까지 하나씩 강제 종료 시킨다. 사용자에 메모리 부족 현상을 알려주는 팝업도 없이 백그라운드 프로그램부터 포그라운드 프로그램까지 강제 종료 시키기 때문에 사용자가 메모리 부족현상을 인지하지 못할 수 도 있다. 예를 들어, 8GB RAM의 우분투 환경에서 Android ASOP소스를 m -j8 (=thread 8개) 옵션으로 full build 하는데 ninja 프로그램이 에러 메시지 없이 종료해서 원인을 찾는데 한참 걸렸다.
메모리가 부족 현상은 근본적으로 RAM을 늘려서 해결해야 하지만, 일시적으로 메모리가 부족한 현상인 경우 SWAP 파일의 크기를 늘려 해결이 가능하다. 최근에 SSD가 빨라서 SWAP을 하더라도 사용성에는 큰 문제는 없다.
1. SWAP 파일 확인 방법
Ubuntu 18.04 부터는 swap 은 /swap parition으로 생성하는 것이 아니고 /swap file로 개선되어 parition 변경 없이 편하게 swap file의 크기를 조절할 수 있다. swapfile은 root 폴더 하위에 /swapfile 로 생성되며 사용 현항은 free 명령어로 확인할 수 있다. (시스템 감시의 자원의 메모리와 Swap 현황과 동일). Ubuntu 20.04버전에서는 디폴트로 2GB의 스왑이 잡혀있다.
root@ubuntu_vir:/# free -m
total used free shared buff/cache available
Mem: 1601730415113160015432
Swap: 204702047Code language:PHP(php)
2.swapfile 만들기
리눅스에서 파일공간을 할당하는 명령어인 fallocate를 이용하여 2GB용량의 파일을 만들겠습니다. 여기서는 루트폴더에 swapfile이라고 이름을 지었는데 이름은 원하는데로 지으면 됩니다. 파일을 만든 후 권한 설정을 수정하여 swap메모리로 지정합니다.
sudo fallocate -l 2G /swapfile → swapfile 생성
sudo chmod 600 /swapfile → root 사용자만 사용할 수 있도록 권한 변경
$ sudo mkswap /swapfile → 스왑메모리로 변경
$ sudo swapon /swapfile → 스왑메모리 활성화
free명령어를 이용하여 지정된 스왑메모리에 대한 정보를 확인 할 수 있습니다.
이렇게 지정하면 스왑 메모리가 활성화 되는데 재부팅 후에도 계속 스왑 메모리가 필요한 경우 /etc/fstab에 마운트 내용을 추가합니다.
swap 메모리 크기 조정은 fallocate 명령어를 사용한다. 이후 권한을 설정하고 mkswap 명령어로 swapfile 을 만들고 swapon 으로 활성화 시킨다.
# swap 을 8GB 로 조정한 경우
$ sudo fallocate -l 8G /swapfile
#권한 설정
$ sudo chmod 600 /swapfile
#swap file 만들기
$ sudo mkswap /swapfile
#swap file 활성화 : 리부티하지 않아도 swap file이 활성화 된다.
$ sudo swapon /swapfileCode language:PHP(php)
/etc/fstab 을 수정해서 swap file을 마운트 한다.
# /etc/fstab 을 열어서 내용 추가
swapfile none swap sw 00Code language:PHP(php)
swap이 정상동작되는지 free 명령어로 확인하다.
4. swapfile 제거하기
스왑메모리는 디스크의 용량이 부족한 일이 아니고는 특별히 제거할 이유가 없습니다. 하지만, 방법은 알고 있어야겠죠? 지정된 스왑메모리를 해제하는 방법은 다음과 같습니다. /etc/fstab에 저장된 스왑메모리의 마운트 내용을 삭제 또는 주석처리 합니다. 그리고 스왑을 비활성화 하고 파일을 삭제 하면됩니다.
sudo vi /etc/fstab → 자동마운트 내용 제거 및 주석처리
sudo swapoff -v /swapfile
sudo swapoff on /swapfile
sudo rm -r /swapfile