Linux Too many open files 오류가 발생하는 원인과 해결 방법

Linux 서버를 운영하다 보면 웹 서버나 데이터베이스, 애플리케이션을 실행하는 중 Too many open files라는 오류를 만나는 경우가 있습니다. 이 오류는 시스템이나 특정 프로세스가 동시에 열 수 있는 파일 개수 제한을 초과했을 때 발생합니다.

여기서 말하는 ‘파일(File)’은 일반 파일뿐만 아니라 소켓(Socket), 파이프(Pipe), 디바이스(Device) 등 파일 디스크립터(File Descriptor)를 사용하는 모든 자원을 포함합니다. 따라서 접속자가 많은 서버에서는 네트워크 연결이 증가하면서 이 오류가 발생하기도 합니다.

이번 글에서는 Too many open files 오류가 발생하는 원인과 실무에서 해결하는 방법을 알아보겠습니다.

Too many open files란 무엇인가?

Linux에서는 모든 파일과 네트워크 연결을 파일 디스크립터(File Descriptor)로 관리합니다.

프로세스마다 동시에 열 수 있는 파일 개수에는 제한이 있으며, 이를 초과하면 다음과 같은 오류가 발생합니다.

Too many open files

또는

EMFILE: Too many open files

이 오류가 발생하면 새로운 파일을 열거나 클라이언트 연결을 처리하지 못하게 됩니다.

Too many open files가 발생하는 대표적인 원인

다음과 같은 경우에 자주 발생합니다.

  • 동시 접속 증가
  • 파일 디스크립터 제한 초과
  • 프로그램의 파일 핸들 누수(File Descriptor Leak)
  • 로그 파일 과다 오픈
  • 데이터베이스 연결 증가
  • 웹 서버 연결 증가
  • 잘못된 ulimit 설정
  • systemd LimitNOFILE 설정 부족

먼저 현재 파일 디스크립터 사용량을 확인하는 것이 중요합니다.

1. 현재 파일 디스크립터 제한 확인하기

현재 사용자의 제한값을 확인합니다.

ulimit -n

예시

1024

1024개 이상의 파일을 동시에 열 수 없다는 의미입니다.

2. 시스템 전체 제한 확인하기

시스템 전체 제한을 확인합니다.

cat /proc/sys/fs/file-max

현재 시스템에서 허용하는 최대 파일 디스크립터 개수를 확인할 수 있습니다.

3. 현재 사용량 확인하기

현재 사용 중인 파일 개수를 확인합니다.

cat /proc/sys/fs/file-nr

출력 결과는 사용 중인 개수와 최대 허용 개수를 보여줍니다.

4. 특정 프로세스 확인하기

특정 프로세스가 얼마나 많은 파일을 열고 있는지 확인합니다.

lsof -p PID

열려 있는 파일 목록을 확인할 수 있습니다.

5. 가장 많이 사용하는 프로세스 찾기

프로세스별 파일 개수를 확인합니다.

lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head

어떤 프로세스가 가장 많은 파일을 사용하는지 쉽게 확인할 수 있습니다.

6. 열린 파일 개수 확인하기

프로세스별 열린 파일 개수를 확인합니다.

ls /proc/PID/fd | wc -l

파일 디스크립터 사용량을 확인할 수 있습니다.

7. ulimit 변경하기

일시적으로 제한을 늘립니다.

ulimit -n 65535

현재 세션에서만 적용됩니다.

8. 영구적으로 변경하기

영구 적용은 다음 파일에서 설정합니다.

/etc/security/limits.conf

예시

* soft nofile 65535
* hard nofile 65535

로그인 후 다시 적용됩니다.

9. systemd 설정 확인하기

systemd 서비스는 별도로 제한될 수 있습니다.

systemctl show 서비스명 | grep LimitNOFILE

필요하다면 서비스 설정 파일에 다음과 같이 추가합니다.

LimitNOFILE=65535

변경 후 서비스를 재시작합니다.

10. 열린 파일 누수 확인하기

파일이 정상적으로 닫히지 않는 프로그램은 시간이 지날수록 열린 파일 개수가 계속 증가합니다.

다음 명령으로 지속적으로 확인합니다.

watch "ls /proc/PID/fd | wc -l"

숫자가 계속 증가한다면 File Descriptor Leak을 의심해야 합니다.

Too many open files 문제를 확인하는 순서

실무에서는 다음 순서대로 확인하는 것이 가장 효율적입니다.

  1. ulimit -n
  2. cat /proc/sys/fs/file-max
  3. cat /proc/sys/fs/file-nr
  4. lsof -p PID
  5. 열린 파일 개수 확인
  6. 많이 사용하는 프로세스 확인
  7. ulimit 설정 확인
  8. limits.conf 확인
  9. LimitNOFILE 확인
  10. File Descriptor Leak 확인

이 순서대로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다.

오류를 해결할 때 주의할 점

무조건 ulimit 값을 크게 늘리는 것은 근본적인 해결책이 아닙니다.

프로그램이 파일을 정상적으로 닫지 못하는 버그가 있다면 제한을 아무리 늘려도 시간이 지나면 동일한 문제가 반복됩니다.

먼저 파일 디스크립터가 왜 증가하는지 원인을 확인한 뒤 설정을 조정하는 것이 바람직합니다.

자주 묻는 질문

파일이 많지 않은데 왜 이런 오류가 발생하나요?

Linux에서는 네트워크 연결, 소켓, 파이프도 모두 파일 디스크립터로 관리하기 때문에 실제 파일 수와 관계없이 오류가 발생할 수 있습니다.

ulimit만 늘리면 해결되나요?

일부 상황에서는 해결되지만, 프로그램의 파일 디스크립터 누수가 원인이라면 동일한 문제가 다시 발생합니다.

웹 서버에서 자주 발생하나요?

네. Nginx, Apache, Node.js, Java 애플리케이션처럼 동시 접속이 많은 서비스에서는 자주 발생하는 오류입니다.

마무리

Too many open files 오류는 파일 디스크립터 제한을 초과했을 때 발생하는 대표적인 Linux 서버 문제입니다. ulimit, lsof, /proc 정보를 활용해 현재 사용량과 제한을 확인하고, 필요하다면 limits.confsystemd 설정을 조정해야 합니다. 또한 프로그램의 파일 디스크립터 누수가 없는지도 함께 점검하는 것이 중요합니다.

댓글 남기기