/엔지니어/트러블슈팅/Too many open files — ulimit
트러블슈팅중급UbuntuDebianCentOSRHELulimitToo many open filesEMFILE

Too many open files — ulimit 파일 디스크립터 한계 해결

EMFILE: too many open files, accept4() failed (24: Too many open files) 등 파일 디스크립터 한계 오류를 ulimit, limits.conf, systemd LimitNOFILE로 해결하는 가이드.

Too many open files 오류는 프로세스가 열 수 있는 파일 디스크립터(fd) 수의 한계에 도달했을 때 발생합니다. 소켓·파이프·실제 파일 모두 fd를 사용합니다.


현재 한계 확인

Bash
# 현재 쉘의 soft/hard 한계
ulimit -Sn    # soft limit (실제 제한)
ulimit -Hn    # hard limit (올릴 수 있는 최대)

# 시스템 전체 최대값
cat /proc/sys/fs/file-max
sysctl fs.file-max
Bash
# 특정 프로세스의 현재 fd 사용량
ls /proc/PID/fd | wc -l

# fd 수 많이 쓰는 프로세스 TOP 10
sudo lsof 2>/dev/null | awk '{print $2}' | sort | uniq -c | sort -rn | head -10

즉시 해결 — 현재 세션 한계 올리기

Bash
# 현재 쉘에서만 적용 (재시작 시 초기화)
ulimit -n 65535

# 확인
ulimit -n

영구 해결 1 — /etc/security/limits.conf

Bash
sudo nano /etc/security/limits.conf
INI
# 맨 아래에 추가
*         soft    nofile    65535
*         hard    nofile    65535
root      soft    nofile    65535
root      hard    nofile    65535

# 특정 사용자만 적용 시
deploy    soft    nofile    65535
deploy    hard    nofile    65535
Bash
# PAM limits 모듈 활성화 확인
grep "pam_limits" /etc/pam.d/common-session
# 없으면 추가
echo "session required pam_limits.so" | sudo tee -a /etc/pam.d/common-session

로그아웃 후 재접속해야 적용됩니다.


영구 해결 2 — systemd 서비스 (권장)

systemd로 관리되는 서비스는 limits.conf가 적용되지 않습니다. 서비스 파일에 직접 설정합니다.

Bash
# 서비스 override 파일 생성
sudo systemctl edit nginx    # 또는 해당 서비스명
INI
[Service]
LimitNOFILE=65535
Bash
sudo systemctl daemon-reload
sudo systemctl restart nginx

# 적용 확인
sudo cat /proc/$(pgrep nginx | head -1)/limits | grep "open files"

영구 해결 3 — 시스템 전체 커널 파라미터

Bash
# 즉시 적용
sudo sysctl -w fs.file-max=2097152

# 영구 적용
echo "fs.file-max = 2097152" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Nginx 전용 설정

Nginx는 nginx.conf 에서도 직접 설정할 수 있습니다.

Nginx
# /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 65535;

events {
  worker_connections 4096;
}
Bash
sudo nginx -t && sudo systemctl reload nginx

근본 원인 — fd 누수 확인

한계를 올려도 계속 오류가 난다면 fd 누수(leak) 가 있을 수 있습니다.

Bash
# 프로세스가 열고 있는 fd 목록 확인
sudo lsof -p PID | head -50

# fd 수 변화 모니터링 (10초 간격)
watch -n 10 "ls /proc/PID/fd | wc -l"

fd 수가 계속 증가하면 애플리케이션 코드에서 파일·소켓을 닫지 않는 버그입니다.

#ulimit#Too many open files#EMFILE#file descriptor#트러블슈팅#systemd#limits.conf
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서GNU/Linux man 페이지

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.