리눅스에서 파일 디스크립터(File Descriptor, FD)는 “열려 있는 파일을 식별하는 번호”다.
여기서 말하는 파일은 실제 파일뿐 아니라 소켓, 파이프, 장치까지 포함한다.
즉 리눅스에서는 모든 I/O를 파일처럼 다루고,
그 접근 핸들이 바로 파일 디스크립터다.
1. 기본 개념
프로세스는 파일을 열 때 내부적으로 숫자 형태의 FD를 할당받는다.
이 FD를 통해 읽기, 쓰기, 닫기 작업을 수행한다.
int fd = open("file.txt", O_RDONLY);
read(fd, buffer, size);
close(fd);
fd는 단순한 숫자지만, 커널 내부에서는 실제 파일과 연결된 구조체를 가리킨다.
2. 표준 파일 디스크립터
리눅스는 기본적으로 3개의 표준 FD를 제공한다.
- 0 — stdin (표준 입력)
- 1 — stdout (표준 출력)
- 2 — stderr (표준 에러)
이 값들은 모든 프로세스에서 기본으로 열려 있다.
쉘에서 리다이렉션을 사용할 때도 이 FD를 활용한다.
# stdout을 파일로 저장
echo "hello" > output.txt
# stderr만 따로 저장
command 2> error.log
3. FD와 네트워크 연결
웹 서버에서 클라이언트 연결도 파일 디스크립터로 관리된다.
즉 하나의 HTTP 요청 = 하나의 FD라고 볼 수 있다.
동시 접속자가 많아지면 FD도 그만큼 증가한다.
이 때문에 FD 제한에 걸리면 서버가 새로운 연결을 받지 못한다.
4. FD 제한 (ulimit)
리눅스는 프로세스가 열 수 있는 FD 개수를 제한한다.
기본값은 보통 1024 정도로 설정되어 있다.
ulimit -n
웹 서버, DB 서버처럼 동시 연결이 많은 서비스는 이 값을 반드시 늘려야 한다.
ulimit -n 65535
영구 설정은 /etc/security/limits.conf에서 변경한다.
5. 현재 열린 FD 확인
특정 프로세스가 얼마나 많은 FD를 사용하는지 확인할 수 있다.
lsof -p [PID]
전체 시스템 FD 사용량도 확인 가능하다.
lsof | wc -l
FD가 계속 증가하면 리소스 누수를 의심해야 한다.
6. FD 누수 문제
파일이나 소켓을 열고 닫지 않으면 FD가 계속 쌓인다.
이를 FD leak이라고 한다.
FD가 한도에 도달하면 다음과 같은 에러가 발생한다.
Too many open files
이 상태가 되면 새로운 파일 열기나 네트워크 연결이 실패한다.
결과적으로 서비스 장애로 이어진다.
7. 실무 점검 기준
- ulimit 값 확인 및 조정
- 프로세스별 FD 사용량 확인
- FD 증가 패턴 모니터링
- 소켓/파일 close 누락 여부 점검
특히 웹 서버, DB, 프록시 서버는 FD 사용량이 빠르게 증가한다.
초기 설정을 제대로 하지 않으면 트래픽 증가 시 바로 장애로 이어질 수 있다.
한 줄 요약
파일 디스크립터는 리눅스에서 파일·소켓·I/O를 식별하는 숫자 핸들이다. 동시 연결 수와 직결되기 때문에 FD 제한, 사용량, 누수 여부를 반드시 관리해야 한다.
댓글 0