MySQL서버가 또 다운되었다. 메모리 부족이 원인이어서 결국 스왑파일(swap file)을 추가했다.

아침에 일어나보니 서버가 다운되었다고 Jetpack에서 알림 이메일이 왔다. 원래 일요일 새벽에 서버 전체를 재부팅하도록 cron에다가 작업을 걸어놨기 때문에, 아마도 부팅이 미처 완료되지 못한 상태일 때 젯팩에서 체크를 했겠거니라고 생각했다. 그런데 그게 아니었다.

워드프레스 플러그인 젯팩 모니터(Jetpakc Monitor)에서 온 메일. 주기적으로 서버가 다운되었는지를 점검해서 문제가 생기면 이메일로 알려준다.

무려 한시간 이상 서버가 다운되어 있었고, 다행이도 그 이후에 cron에서 재부팅을 하는 바람에 서버가 정상으로 돌아온 상태였다. 처음 MySQL서버가 다운되었을 때에는 my.cnf파일만 수정해서 innodb_buffer_pool_size를 조정했는데, 사실 그 이후에도 다운된 적이 여러번 있었다.

Mar 12 03:54:13 k-june kernel: [600125.509650] Out of memory: Kill process 2950 (mysqld) score 147 or sacrifice child
Mar 12 03:54:13 k-june kernel: [600125.510029] Killed process 2950 (mysqld) total-vm:782520kB, anon-rss:73604kB, file-rss:0kB
Mar 12 03:54:13 k-june kernel: [600125.563803] init: mysql main process (2950) killed by KILL signal
Mar 12 03:54:13 k-june kernel: [600125.563874] init: mysql main process ended, respawning

시스템로그(syslog)를 보니 이번에도 역시 메모리 부족(Out of memory)이 원인이었고, 그 이유가 mysqld 때문인 것도 확실해졌다. 서버 메모리는 512MB인데 반해 total-vm은 이미 782MB를 넘었다. 디지털오션 모니터링 시스템을 보니 분명 사고직전 까지만 해도 메모리 사용률이 평소와 다름없이 꾸준히 60%~70%사이를 유지하고 있었는데 아마도 순간적으로 메모리가 폭주하는 현상이 생긴 것 같다.

안그래도 watchdog 스크립트를 이용해서 주기적으로 서버(특히MySQL)가 다운되었는지를 점검하도록 한 후, 문제가 발견되면 자동으로 서비스를 재시작하도록 하는 방법을 연구중이었는데, 그냥 이번 기회에 좀 더 강력하게 스왑파일을 만들어 버리기로 결심했다. 그동안 사실 SSD에 스왑파티션을 만드는 것은 SSD수명을 단축시킨다고 해서 서버든 데스크탑이든 되도록 기피하고 있었으나, 이렇게 서버가 다운되면서 더 기피하고 싶은 상황이 생기니 나로서도 어쩔 수가 없다.

아무튼 리눅스 설치할 때에 스왑 파티션(Swap Partition)은 많이 만들어 봤지만 설치 후에 스왑 파일(Swap file)을 추가하는 방법은 처음이었는데 디지털오션에 보니 친절하게 설명이 되어 있었다.

스왑파일 추가 매뉴얼에는 스왑파일을 추가하는 과정 뿐만 아니라 중간중간에 잘 되고 있는지 점검하는 부분도 있었는데, 설정에 필요한 명령어만 간추려 보면 아래와 같다.

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

그리고 마지막으로 /etc/fstab를 수정해서 마지막줄에 /swapfile 디렉토리를 추가하면 된다.

sudo nano /etc/fstab
# fstab파일에 아래 내용 추가
/swapfile   none    swap    sw    0   0

스왑파일 용량을 얼마로 할지가 고민이었는데, SSD용량이 12GB밖에 안남은 데다가 서버 램이 512MB라서 그냥 적당히 1GB 정도로만 했다. 이것마저 부족할 상황이 되면 비용을 더 주고 업그레이드를 하는 것이 맞다고 본다.

그리고 매뉴얼에 따라 swappiness값이랑 vfs_cache_pressure값도 조정해서 조금 더 정교하게 세팅을 했다.

sudo nano /etc/sysctl.conf
# sysctl.conf파일에 아래 내용 추가
vm.swappiness=0
vm.vfs_cache_pressure = 50

매뉴얼에는 vm.swappiness 옵션값을 10으로 설정하였지만, 나는 메모리부족(OOM)인 상황에서만 스왑을 사용할 수 있도록 0으로 바꿔서 세팅했다.

putty에서 터미널을 열어서 작동 테스트를 하였다.

free -m 명령어를 이용해서 스왑파일을 점검해보니 정상적으로 잘된다. 이제 메모리부족 오류는 좀 그만 생겼으면 하는 소원이 있다.

댓글 남기기