매우 자주 '열린 파일이 너무 많음 ' 오류는 고부하 Linux 서버에서 발생합니다. 이는 프로세스가 너무 많은 파일(파일 설명자)을 열었고 새 파일을 열 수 없음을 의미합니다. Linux에서 최대 열린 파일 제한은 기본적으로 각 프로세스 또는 사용자에 대해 설정되며 값은 다소 작습니다.
이 기사에서는 Linux에서 열린 최대 파일 수에 대한 현재 제한을 확인하는 방법과 전체 호스트, 개별 서비스 또는 현재 세션에 대해 이를 변경하는 방법을 배웁니다.
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
두 가지 제한 유형이 있습니다. 하드 및 부드러움 . 사용자는 소프트 한계를 변경할 수 있습니다(단, 소프트 값은 하드 값을 초과할 수 없음). 권한이 있는 사용자 또는 루트 사용자만 하드 제한 값을 수정할 수 있습니다.
소프트 제한을 표시하려면 다음 명령을 실행하십시오.
# ulimit –nS
하드 리미트 값을 표시하려면:
# ulimit -nH
Linux에서 최대 파일 열기 제한을 늘리는 방법은 무엇입니까?
모든 서비스에서 많은 수의 파일을 열 수 있도록 Linux OS에서 제한을 변경할 수 있습니다. 새 설정을 영구적으로 만들고 서버 또는 세션이 다시 시작된 후 재설정을 방지하려면 /etc/security/limits.conf를 변경해야 합니다. . 다음 행을 추가하십시오.
* hard nofile 97816 * soft nofile 97816
Ubuntu를 사용하는 경우 다음 행도 추가하십시오.
session required pam_limits.so
이 매개변수를 사용하면 사용자 인증 후 열린 파일 제한을 설정할 수 있습니다.
변경한 후 터미널을 다시 로드하고 max_open_files 값을 확인하십시오.
# ulimit -n
97816
서비스당 Open File Descriptor 제한 증가
전체 운영 체제가 아닌 특정 서비스에 대해 열린 파일 설명자의 제한을 변경할 수 있습니다. 아파치를 예로 들어보자. 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에 대한 최대 열린 파일 제한을 설정하는 방법
웹 서버에 대한 열린 파일 수 제한을 변경할 때 서비스 구성 파일도 변경해야 합니다. 예를 들어 Nginx 구성 파일 /etc/nginx/nginx.conf에서 다음 지시문 값을 지정/변경합니다. :
worker_rlimit_nofile 16000worker_connections 8192를 사용하여 로드가 많은 8코어 서버에서 Nginx를 구성할 때 8192*2*8(vCPU) =131072를 지정해야 합니다. worker_rlimit_nofile에 있습니다.
그런 다음 Nginx를 다시 시작하십시오.
아파치의 경우 디렉토리 생성:
# 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에서 열린 파일 설명자 제한 값이 너무 작을 때 문제를 해결하는 방법을 배웠고 서버에서 이러한 제한을 변경하는 몇 가지 옵션에 대해 논의했습니다.