원문출처 :

https://medium.com/hbsmith/too-many-open-files-%EC%97%90%EB%9F%AC-%EB%8C%80%EC%9D%91%EB%B2%95-9b388aea4d4e




“Too many open files” Error는 어떻게?

Linux 서버(여기선 AWS EC2)를 운영하다보면 어제만해도 잘 돌아가던 서버 어플리케이션이 “Too many open files” 에러를 뿜고 죽어버릴 때가 있다. 이런 오류가 생기는 이유는 프로세스가 OS에 요청할수 있는 리소스의 개수/양 (여기서는 NOFILE 이라 불리는 최대 Open 가능한 파일 개수)에 Limit가 있고, 프로세스가 그 제한을 넘었기 때문이다. 따라서 해결책은 Limit를 늘려주면 된다.

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

우선 프로세스가 실행되고 있는 계정의 NOFILE Limit는 아래와 같이 확인 가능하다. 기본값은 1024, 4096이다.

$ 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

모든 계정에 대해서 Soft와 Hard를 500000으로 설정했는데 이 값이 system 전체의 Limit보다 작아야 한다. 넘을경우 심각한 문제가 생길수 있다. system 전체의 Limit은 아래와 같이 확인한다. 적당한 Soft/Hard 값은 실행하고자 하는 어플리케이션에 따라 다를수 있으니 확인바란다.

$ cat /proc/sys/fs/file-max

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

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

Limit를 변경하고 싶은 프로세스의 PID를 알아낸다.

$ ps -ef | grep foobar
1234

해당 프로세스의 NOFILE Limit를 확인한다.

$ prlimit --nofile --output RESOURCE,SOFT,HARD --pid 1234

이 Limit가 과거의 값으로 세팅되어 있다면 변경해줄 차례다.

$ prlimit --nofile=500000 --pid=1234

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

NOFILE 이외에도 여러 Limit를 변경해줘야 할때 위의 방법을 응용할수 있다. 다만, 인터넷에 널린 글들을 보면 문제가 생기지 않았는데도 Limit를 미리 세팅하거나 unlimit로 설정하라는 글들이 있는데 주의하기 바란다. 한번 올려놓으면 내리기 어렵고, 적당히 크게 올려놔도 같은 문제를 일으킨다면 해당 Process에 버그가 있다고 보고 버그를 해결하는게 낫다.

하지만 nGrinder, Perf 등의 벤치마킹 어플리케이션은 서버에 부하를 많이 일으켜야 하므로 이러한 튜닝이 반드시 필요할때가 있다. 이런경우엔 어떻게 설정을 하라는 어플리케이션 개발자의 문서를 꼭 참고한 후 튜닝하기 바란다.