고부하 상태로 운영되는 Linux 서버에서 'Too many open files(열린 파일이 너무 많음)' 오류가 자주 발생합니다. 이 오류는 프로세스가 너무 많은 파일(파일 디스크립터)을 열어 더 이상 새 파일을 열 수 없다는 의미입니다. Linux에서는 기본적으로 프로세스 또는 사용자별로 최대 열기 파일 수 제한이 설정되어 있으며, 기본값은 상당히 작게 지정되어 있습니다.
이 글에서는 Linux에서 현재 설정된 최대 열기 파일 수 제한을 확인하는 방법과, 전체 호스트·개별 서비스·현재 세션 단위로 이 값을 변경하는 방법까지 자세히 알아보겠습니다.
'Too Many Open Files' 오류와 Linux의 파일 열기 제한
먼저 이 오류가 어떤 상황에서 나타나는지 살펴보겠습니다. 이 오류는 대체로 NGINX/httpd 웹 서버나 데이터베이스 서버(MySQL/MariaDB/PostgreSQL)가 설치된 환경에서 대량의 로그를 읽을 때 가장 흔하게 발생합니다. 예를 들어 Nginx 웹 서버가 열기 파일 제한을 초과하면 다음과 같은 오류 메시지가 표시됩니다.
socket () failed (29: Too many open files) while connecting to upstream
시스템 전체에서 열 수 있는 최대 파일 디스크립터 수는 다음 명령어로 확인할 수 있습니다.
# cat /proc/sys/fs/file-max현재 사용자의 열기 파일 제한은 기본적으로 1024로 설정되어 있으며, 아래 명령으로 확인할 수 있습니다.
# ulimit -n파일 열기 제한에는 두 가지 유형이 있습니다. 바로 Hard(하드) 제한과 Soft(소프트) 제한입니다. 사용자는 소프트 제한을 직접 변경할 수 있지만, 소프트 값은 하드 값을 초과할 수 없습니다. 하드 제한 값은 root 또는 특권 권한을 가진 사용자만 수정할 수 있습니다.
소프트 제한을 확인하려면 다음 명령을 실행합니다.
# ulimit -nS하드 제한 값을 확인하려면 다음 명령을 사용합니다.
# ulimit -nHLinux에서 최대 열기 파일 제한을 늘리는 방법
모든 서비스가 많은 수의 파일을 열 수 있도록 하려면 OS 차원의 제한 값을 변경해야 합니다. 새 설정을 영구적으로 적용하고 서버 재부팅이나 세션 재시작 후에도 초기화되지 않게 하려면 /etc/security/limits.conf 파일을 수정해야 합니다. 다음 줄을 추가합니다.
* hard nofile 97816 * soft nofile 97816
Ubuntu를 사용하는 경우 아래 줄도 함께 추가해야 합니다.
session required pam_limits.so
이 파라미터는 사용자 인증 후 열기 파일 제한이 적용되도록 하는 설정입니다.
변경 사항을 적용한 뒤에는 터미널을 다시 로드하고 max_open_files 값을 확인합니다.
# ulimit -n97816
서비스별 파일 디스크립터 제한 늘리기
운영체제 전체가 아니라 특정 서비스에 대해서만 열기 파일 디스크립터 제한을 변경할 수도 있습니다. Apache를 예로 들어 보겠습니다. systemctl을 사용해 서비스 설정을 엽니다.
# systemctl edit httpd.service원하는 제한 값을 추가합니다. 예시는 다음과 같습니다.
[Service] LimitNOFILE=16000 LimitNOFILESoft=16000
변경 후에는 서비스 설정을 갱신하고 서비스를 재시작합니다.
# systemctl daemon-reload
# systemctl restart httpd.service값이 실제로 변경되었는지 확인하려면 먼저 해당 서비스의 PID를 조회합니다.
# systemctl status httpd.service예를 들어 서비스 PID가 3724라면 다음과 같이 확인할 수 있습니다.
# cat /proc/3724/limits | grep "Max open files"이렇게 하면 특정 서비스에 대한 최대 열기 파일 수 값이 성공적으로 변경됩니다.
Nginx 및 Apache의 최대 열기 파일 제한 설정 방법
웹 서버의 열기 파일 수 제한을 변경할 때는 systemd 설정뿐 아니라 서비스 자체의 설정 파일도 함께 수정해야 합니다. 예를 들어 Nginx 설정 파일인 /etc/nginx/nginx.conf에서 다음 디렉티브 값을 지정하거나 변경합니다.
worker_rlimit_nofile 16000
worker_connections 8192로 구성된 고부하 8코어 서버에서 Nginx를 운영하는 경우, worker_rlimit_nofile 값은 8192 × 2 × 8(vCPU) = 131072로 지정하는 것이 좋습니다.
설정 후에는 Nginx를 재시작합니다.
Apache의 경우 먼저 디렉터리를 생성합니다.
# mkdir /lib/systemd/system/httpd.service.d/그다음 limit_nofile.conf 파일을 생성합니다.
# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf파일에 다음 내용을 추가합니다.
[Service] LimitNOFILE=16000
마지막으로 httpd를 재시작하는 것을 잊지 마세요.
현재 세션의 열기 파일 제한 변경하기
현재 터미널 세션에 대해서만 최대 열기 파일 제한을 변경하려면 다음 명령을 실행합니다.
# ulimit -n 3000터미널을 닫고 새 세션을 생성하면 제한 값은 /etc/security/limits.conf에 지정된 원래 값으로 되돌아갑니다.
시스템 전체 값인 /proc/sys/fs/file-max를 변경하려면 /etc/sysctl.conf에서 fs.file-max 값을 수정합니다.
fs.file-max = 100000
그리고 변경 사항을 적용합니다.
# sysctl -p이번 글에서는 Linux에서 열기 파일 디스크립터 제한 값이 너무 작을 때 발생하는 문제를 해결하는 방법을 알아보고, 서버에서 이러한 제한을 변경할 수 있는 여러 가지 옵션을 살펴보았습니다. 서비스 특성과 부하 규모에 맞게 적절한 값을 설정하면 'Too many open files' 오류를 효과적으로 예방할 수 있습니다.