MongoDB 설치한 OS 에서 “Too many open files” 에러 발생 시 해결 가이드

Linux 서버(여기선 AWS EC2)를 운영하다보면 어제만해도 잘 돌아가던 서버 어플리케이션이 “Too many open files” 에러를 뱉고 죽는 현상이 발생함.

이런 오류가 생기는 이유는 프로세스가 OS에 요청할수 있는 리소스의 개수/양 (여기서는 NOFILE 이라 불리는 최대 Open 가능한 파일 개수)에 Limit가 있고, 프로세스가 그 제한을 넘었기 때문이다.

해결방법

각 프로세스의 Limit는 그 프로세스가 실행되는 계정의 Limit를 바탕으로 만들어지므로 프로세스의 Limit를 올려준다고 해서 문제가 해결되진 않는다. 계정과 프로세스 모두 변경해 주어야 그 프로세스를 다시 시작했을때에도 같은 문제가 생기지 않음.

$ ulimit -Hn
4096
$ ulimit -Sn
1024

Limit는 Soft와 Hard 2가지가 있는데 Soft Limit은 non-root 계정에서도 설정 가능하며 일시적으로 이를 넘어도 시스템 상에서 경고 이메일만 보낼뿐 큰 문제가 되지 않지만 Hard Limit는 root 계정에서만 세팅이 가능하고 절대로 넘을수 없는 Limit이다. Too many open files가 계속 발생하고 아예 기능이 동작하지 않을 경우 프로세스에 기본 할당된 Hard Limit를 넘었다고 볼수 있음.

root 계정으로 /etc/security/limits.conf에 다음 내용을 추가.

* hard nofile 500000
* soft nofile 500000
root hard nofile 500000
root soft nofile 500000
$ cat /proc/sys/fs/file-max

계정에 할당된 Limit을 변경했다면 터미널을 로그아웃 했다가 다시 로그인 한 후에 앞에서 실행한 ulimit으로 값이 변경되어 있는지 확인해야 한다.

이제 프로세스에 대한 Limit을 올려줄 차례다. 프로세스를 죽였다가 다시 살리면 되지만 운영환경에선 프로세스를 죽이면 안되는 때가 있음.

방법

$ ps -ef | grep foobar
1234
$ prlimit --nofile --output RESOURCE,SOFT,HARD --pid 1234
$ prlimit --nofile=500000 --pid=1234

이렇게 변경을 하면 Soft Limit과 Hard Limit이 동일하게 500000으로 맞춰진다. 다시 이전 command를 실행해서 더블체크.