예전 직장에서 있었던 일이다.
한 시니어 엔지니어가 FD 한계치에 도달했다며 서버 증설을 주장했는데, 알고 보니 유저 단위로 FD를 잘못 이해하고 있었다. 그 일을 계기로 팀원들에게 FD 개념을 다시 교육했고, 그 기억이 떠올라 이 글을 공유하고자 한다.
운영 중인 리눅스 서버에서 열린 파일 수가 많다거나 FD를 늘려야 한다는 이야기가 자주 나온다. 하지만 FD(File Descriptor)의 개념을 정확히 이해하지 못하면 불필요하게 시스템을 확장하거나, 반대로 장애 징후를 놓칠 수 있다. 여기서는 FD의 기본 개념과 확인 방법, 해석 시 주의할 점을 정리한다.
1. File Descriptor란 무엇인가
리눅스에서 모든 것은 파일이다. 실제 파일, 디렉터리, 소켓(socket), 파이프(pipe), 장치(device) 모두 FD라는 정수 번호로 관리된다. FD가 고갈되면 더 이상 파일이나 소켓을 열 수 없게 되고, 결국 서비스 장애로 이어진다.
2. 시스템 전체 FD 확인
시스템 전역 FD 사용 현황은 /proc/sys/fs/file-nr
에서 확인한다.
cat /proc/sys/fs/file-nr
37248 0 13123092
- 첫 번째 값 → 현재 사용 중인 FD 수 (allocated)
- 두 번째 값 → 사용 가능한 free FD 수
- 세 번째 값 → 시스템 전체 최대 FD 수 (max)
커널 버전별 차이
- 커널 2.6 ~ 4.x: 두 번째 값이 항상
0
으로 표시된다. free FD를 커널이 집계하지 않았기 때문. - 커널 5.x 이상: free FD 값이 실제 수치로 표시된다. FD 캐시 관리 로직이 개선된 결과다.
Ubuntu에서는 배포판 버전에 따라 커널 버전이 다르므로 반드시 확인해야 한다.
uname -r
예시:
4.15.0-210-generic
→ 커널 4.x, free 값은 항상 05.15.0-122-generic
→ 커널 5.x, free 값이 정상 출력
3. 프로세스별 FD 제한 확인
각 프로세스는 동시에 열 수 있는 FD 최대치가 정해져 있다. ulimit
명령어로 확인한다.
ulimit -Sn # soft limit
ulimit -Hn # hard limit
- soft limit → 일반적으로 적용되는 한도
- hard limit → 관리자가 별도로 올리지 않는 이상 넘을 수 없는 한도
예:
ulimit -Sn
30480
→ 하나의 프로세스가 동시에 열 수 있는 FD 최대치가 30,480개임을 의미한다.
4. 실제 사용량 확인
FD가 실제로 얼마나 쓰이고 있는지 확인하려면 lsof
를 이용한다.
사용자 단위
lsof -u <username> | wc -l
50867
→ 해당 유저가 실행 중인 모든 프로세스를 합쳐 약 5만 개 FD 사용.
프로세스 단위
lsof -p <PID> | wc -l
300
→ PID 프로세스에서 약 300개의 FD 사용. 이 경우 프로세스 제한치(예: 30,480)에 훨씬 못 미침.
5. 장애 발생 조건
FD와 관련된 장애는 보통 두 가지 경우에서 발생한다.
- 시스템 전체 한도 초과
/proc/sys/fs/file-nr
의 첫 번째 값(사용 중 FD 수)이 세 번째 값(최대치)을 넘어서는 경우.
모든 소켓과 파일 오픈이 실패하고 서비스가 중단된다. - 프로세스별 한도 초과
특정 프로세스가ulimit -Sn
값에 도달하는 경우.Too many open files
에러가 발생하고, 주로 Java 애플리케이션의 DB 커넥션이나 소켓 핸들이 폭증할 때 나타난다.
6. 흔한 오해
- 유저 단위 제한이 있다 → 잘못된 이해. FD 제한은 프로세스 단위다. 동일 유저가 여러 프로세스를 실행하면 각 프로세스별로 FD 제한이 적용된다.
lsof -u
값이 ulimit보다 크면 문제다 → 오해.lsof -u
는 유저 전체 합계이고,ulimit
은 개별 프로세스 제한이다.
7. 정리
- FD는 리눅스에서 모든 리소스를 다루는 기본 단위다.
/proc/sys/fs/file-nr
→ 시스템 전체 현황. 커널 버전에 따라 free 값 출력 여부가 달라진다.ulimit -Sn
→ 프로세스별 FD 한도.lsof -p <PID>
→ 개별 프로세스 사용량.- 문제는 보통 프로세스별 한도 초과나 시스템 전체 한도 초과에서 발생한다.
- FD가 부족하면 소켓 연결 실패 → 서비스 장애로 이어진다.
ⓒ 2025 엉뚱한 녀석의 블로그 [quirky guy's Blog]. All rights reserved. Unauthorized copying or redistribution of the text and images is prohibited. When sharing, please include the original source link.
답글 남기기
댓글을 달기 위해서는 로그인해야합니다.