Application Servers & Java

[장애 사례] java.net.SocketException: Too many open files

midworker 2025. 5. 15. 18:57
반응형

[장애 사례] java.net.SocketException: Too many open files

운영 중인 Java 애플리케이션에서 다음과 같은 오류가 발생할 경우,
이는 시스템 또는 사용자별 파일 핸들 수(file descriptor) 제한을 초과했음을 의미합니다.


✅ 에러 메시지

java.net.SocketException: Too many open files

✅ 원인 정리

원인 유형 설명
OS 레벨 제한 Linux는 사용자당 열 수 있는 파일 수를 제한함 (ulimit -n)
커넥션 누수 열었던 소켓/스트림을 닫지 않아 누적
과도한 트래픽 짧은 시간에 수천 개 이상의 접속 발생
파일 I/O 로그 파일, 업로드 처리, 캐시 등에서 열린 파일 미반환

✅ 진단 방법

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

ulimit -n

예) 1024 → 기본 제한


2. 현재 열린 파일 수 확인

lsof -p <PID> | wc -l

→ Java 프로세스의 열린 파일 수 확인


3. 어떤 파일들이 열려 있는지 확인

lsof -p <PID>

→ 파일, 소켓, 파이프 등 리소스 확인 가능


✅ 해결 방법

✔ 1. OS 레벨 리소스 제한 상향

/etc/security/limits.conf

youruser soft nofile 65536
youruser hard nofile 65536

PAM 설정 확인

/etc/pam.d/common-session
# 또는
/etc/pam.d/login

→ 다음 항목 존재해야 함:

session required pam_limits.so

✔ 2. systemd 사용 시

# /etc/systemd/system/<your-service>.service

[Service]
LimitNOFILE=65536

→ 적용 후:

systemctl daemon-reexec
systemctl restart <your-service>

✔ 3. 애플리케이션 코드 점검

  • Socket, InputStream, OutputStream, FileInputStream 등 사용 후 close() 호출 여부 반드시 확인

예:

try (Socket socket = new Socket(...)) {
    // 작업 수행
} // 자동 close

✅ 실무 팁

항목 권장
WAS (Tomcat, WildFly 등) ulimit -n 65536 이상 권장
DB 서버 연동 시 JDBC 커넥션 누수 여부 점검
APM 도입 누적 소켓/파일 수 추적 가능

✅ 마무리

Too many open files 오류는 시스템 안정성을 위협하는 대표적인 리소스 고갈 장애입니다.
운영체제 설정 상향 + 코드 내 리소스 반환 점검을 통해 사전 예방이 중요합니다.


반응형