본문으로 건너뛰기
버전: 5.1.0-11.0

H12. JVM 열린 파일 디스크립터 고갈 진단

Diátaxis: How-to(목표별 가이드) · 대상: 운영자 / 관리자 ← 목차로

로그에 Too many open files가 찍히거나, "한참 잘 돌다 갑자기 파일·소켓을 못 열어 요청이 실패한다"면 JVM의 열린 파일 디스크립터(FD)가 한도에 닿은 것입니다. 자바에서 파일·소켓· 파이프는 모두 파일 디스크립터 하나로 세므로, DB 연결·HTTP 소켓·열어 둔 파일이 반환되지 않으면 FD가 마릅니다. 이 문서는 WAS ▸ JVM ▸ 열린 파일 수 탭으로 진단하는 순서입니다.

힙·GC 개념은 E3.2 JVM 건강을, 차트 임계치는 R2.1 WAS 차트 — JVM을 보세요. 메모리 누수는 H7. 메모리 누수 점검에 있습니다.

여는 법 — 좌측 메뉴 ▸ WAS ▸ (인스턴스 선택) ▸ JVM열린 파일 수


열린 파일 수 vs 최대 한도 읽기

열린 파일 수 차트는 현재 열린 FD 수와 **최대 허용 한도(ulimit)**를 함께 보여 줍니다. 현재값이 한도에 얼마나 가까운지가 핵심입니다.

JVM 열린 파일 — 열린 파일 수(주황)가 계단처럼 우상향해 ulimit 한도(파랑 점선)에 붙는 FD 누수

위 화면이 FD 누수가 진행 중인 모양입니다 — 열린 파일 수(주황)가 정상 톱니로 머물다 어느 시점부터 계단처럼 우상향해, 끝내 최대 한도(ulimit, 파랑 점선)에 붙은 채 평탄해집니다. 이 상태가 곧 Too many open files 직전입니다.

모습해석
현재값이 한도보다 충분히 낮음정상 — 여유 있음
현재값이 한도에 자주 닿음(상한에 머무름)주의 — FD에 여유가 없음. 곧 Too many open files 직전
현재값이 계단처럼 우상향해 한도에 붙은 채 평탄위험 — FD 누수. 반환되지 않는 핸들이 쌓이는 중

참고 정상 운영에서는 현재값이 톱니처럼 오르내립니다(열고 닫음 반복). GC·트래픽이 줄어도 내려오지 않고 우상향하면 누수 쪽입니다 — H2. 기간 바꿔 보기로 최근 1일~1주를 펼쳐 바닥선이 올라가는지 확인하세요.

주의 "현재값이 한도에 붙음"의 원인은 두 가지입니다 — ① 순간 트래픽으로 동시 연결·파일이 많은 것(부하 해소되면 내려옴), ② 핸들을 반환하지 않는 누수(안 내려옴). 추세로 가립니다.


무엇이 FD를 잡고 있는지 좁히기

FD는 파일·소켓 모두를 셉니다. 어느 쪽이 쌓이는지부터 가립니다.

  • 소켓이 원인 — 같은 시간대 H11. 서버 소켓 과다 진단의 CLOSE_WAIT·ESTABLISHED 가 함께 쌓이면, 닫지 않은 네트워크 연결이 FD를 먹는 것입니다. DB·HTTP 커넥션 풀 미반환, 외부 API 소켓 누수를 의심합니다.
  • 파일이 원인 — 소켓은 정상인데 FD만 오르면, 열어 둔 파일 스트림·임시파일을 닫지 않는 코드입니다. 로그·업로드·캐시 파일 처리 경로를 점검합니다.
  • WAS 트러블슈팅 보조 — JVM 탭 옆 트러블슈팅 ▸ 오픈 파일 분석으로 그 순간 열린 파일· 소켓 목록을 받아, 어떤 경로의 핸들이 비정상적으로 많은지 직접 확인할 수 있습니다.

조치

확인된 상황1차 조치
FD 누수(우상향, 안 내려옴)스트림·소켓 미반환 코드 점검(try-with-resources·close() 누락) — 개발팀 전달. 근본 원인
소켓이 FD를 먹음커넥션 풀 반환·외부 API 소켓 정리 점검 → H11. 서버 소켓 과다
누수는 아닌데 한도가 작음OS ulimit -n(또는 systemd LimitNOFILE) 상향 — 인프라팀과 함께, 트래픽 대비 여유 확보
이미 Too many open files 발생트래픽 분산 후 해당 인스턴스 순차 재시작으로 FD 우선 회복

주의 한도(ulimit)만 무작정 키우면 누수를 늦출 뿐 해결되지 않습니다. 우상향 추세가 보이면 반환 누락 코드를 먼저 잡아야 같은 일이 반복되지 않습니다.


잘 안될 때

증상점검
열린 파일 수 탭이 비어 있음인스턴스 연결 상태 — H20. 에이전트 점검
FD는 여유 있는데 응답이 느림FD 문제 아님 — 힙·GC(H7)·DB 풀(H8) 먼저 확인
FD가 오르는데 원인 경로를 모름트러블슈팅 ▸ 오픈 파일 분석으로 핸들 목록 확보 후 소켓/파일 비중 구분

관련 문서