📌 파일 디스크립터(FD)란?
리눅스에서 파일, 소켓, 파이프 등을 열 때 사용하는 고유한 번호입니다.
모든 프로세스는 파일 디스크립터를 사용하며, 최대 개수 제한이 있습니다.
제한을 초과하면 프로그램이 정상적으로 동작하지 않을 수 있습니다.
🔎 현재 시스템의 FD 정보 확인하기
cat /proc/sys/fs/file-max # 시스템 전체 FD 제한
cat /proc/sys/fs/file-nr # 현재 사용 중인 FD 개수
출력 예시:
22080 0 9223372036854775807
- 첫 번째 값: 현재 사용 중인 FD 개수
- 두 번째 값: 사용되지 않은 FD 개수
- 세 번째 값: 시스템의 최대 FD 개수
🔹 FD 사용량 자동 모니터링 스크립트
시스템의 FD 사용량을 주기적으로 기록하는 자동 모니터링 스크립트입니다.
1️⃣ 5초마다 FD 사용량을 기록하는 스크립트
아래 스크립트는 /proc/sys/fs/file-nr 값을 읽어 로그로 저장합니다.
#!/bin/bash
LOG_DIR="/var/log/file-nr"
LOG_FILE="$LOG_DIR/file-nr.log"
# 로그 디렉토리 생성
mkdir -p "$LOG_DIR"
# 무한 루프 실행 (5초마다 기록)
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(cat /proc/sys/fs/file-nr)" >> "$LOG_FILE"
sleep 5
done
2️⃣ Systemd 서비스로 자동 실행하기
위 스크립트를 시스템이 부팅될 때 자동 실행하도록 systemd 서비스를 설정합니다.
✅ 설정 방법
- 스크립트 저장
sudo nano /usr/local/bin/file-nr-logger.sh위의 모니터링 스크립트를 저장 후, 실행 권한 부여chmod +x /usr/local/bin/file-nr-logger.sh - Systemd 서비스 파일 생성
sudo nano /etc/systemd/system/file-nr-logger.service아래 내용 추가:[Unit] Description=File Descriptor Logger Service After=network.target [Service] ExecStart=/usr/local/bin/file-nr-logger.sh Restart=always User=root [Install] WantedBy=multi-user.target - 서비스 활성화 및 실행
systemctl daemon-reload systemctl enable file-nr-logger.service systemctl start file-nr-logger.service
✅ 이제 시스템이 부팅될 때 자동으로 FD 사용량을 기록합니다!
🔹 프로세스별 FD 사용량 확인하기
시스템 전체 FD 개수뿐만 아니라 어떤 프로세스가 FD를 많이 사용하는지도 분석해야 합니다.
1️⃣ 각 프로세스의 FD 개수를 확인하는 스크립트
#!/bin/bash
printf "%-10s %-10s %s\\n" "PID" "FD_COUNT" "COMMAND"
total_fd_count=0
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
if [ -d "/proc/$pid/fd" ]; then
fd_count=$(ls /proc/$pid/fd 2>/dev/null | wc -l)
total_fd_count=$((total_fd_count + fd_count))
cmd=$(cat /proc/$pid/comm 2>/dev/null)
printf "%-10s %-10s %s\\n" "$pid" "$fd_count" "$cmd"
fi
done
echo "======================================="
echo "Total FD Count: $total_fd_count"
✅ 실행 방법
chmod +x check-fd-usage.sh
./check-fd-usage.sh
📌 실행 결과 예시
PID FD_COUNT COMMAND
1001 30 nginx
2002 50 postgres
3003 200 java
=======================================
Total FD Count: 280
✅ 어떤 프로세스가 FD를 많이 사용하고 있는지 쉽게 확인할 수 있습니다!
🔹 로그 파일 자동 정리 (Logrotate 설정)
로그 파일이 계속 쌓이면 용량을 차지하므로, 자동으로 정리하도록 설정합니다.
- 설정 파일 생성
sudo nano /etc/logrotate.d/file-nr - 아래 내용 추가
/var/log/file-nr/file-nr.log { daily rotate 7 compress delaycompress missingok notifempty create 0644 root root postrotate systemctl restart file-nr-logger.service endscript } - 설정 테스트
logrotate -f /etc/logrotate.d/file-nr
✅ 이제 로그 파일이 자동으로 정리됩니다!
🔹 FD 최대 개수 조정하기
만약 특정 서버에서 FD 개수 제한이 너무 낮다면, 설정을 변경할 수 있습니다.
- 커널 설정 변경 (
/etc/sysctl.conf)fs.file-max = 1000000적용:sysctl -p - 사용자별 FD 제한 증가 (
/etc/security/limits.conf)* soft nofile 500000 * hard nofile 1000000
✅ 이제 FD 개수를 더 많이 사용할 수 있습니다!
🚀 정리
| 기능 | 적용 방법 |
|---|---|
| 시스템 전체 FD 사용량 기록 | /proc/sys/fs/file-nr 값을 주기적으로 로그 저장 |
| 자동 실행 | systemd 서비스로 등록 |
| 프로세스별 FD 개수 확인 | check-fd-usage.sh 실행 |
| 로그 자동 정리 | logrotate 설정 |
| FD 제한 값 조정 | sysctl.conf, limits.conf 변경 |
🎯 이렇게 하면…
✅ 서버의 파일 디스크립터 사용량을 쉽게 추적할 수 있습니다!
✅ 어떤 프로세스가 FD를 많이 쓰는지 파악할 수 있습니다!
✅ 필요하면 FD 개수를 조정하여 성능 문제를 예방할 수 있습니다!
🚀 이제 직접 설정해보세요! 🚀
