리눅스 FD 자동 로깅 스크립트 설정 방법

2–3분

📌 파일 디스크립터(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 서비스를 설정합니다.

✅ 설정 방법

  1. 스크립트 저장 sudo nano /usr/local/bin/file-nr-logger.sh 위의 모니터링 스크립트를 저장 후, 실행 권한 부여 chmod +x /usr/local/bin/file-nr-logger.sh
  2. 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
  3. 서비스 활성화 및 실행 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 설정)

로그 파일이 계속 쌓이면 용량을 차지하므로, 자동으로 정리하도록 설정합니다.

  1. 설정 파일 생성 sudo nano /etc/logrotate.d/file-nr
  2. 아래 내용 추가 /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 }
  3. 설정 테스트 logrotate -f /etc/logrotate.d/file-nr

이제 로그 파일이 자동으로 정리됩니다!


🔹 FD 최대 개수 조정하기

만약 특정 서버에서 FD 개수 제한이 너무 낮다면, 설정을 변경할 수 있습니다.

  1. 커널 설정 변경 (/etc/sysctl.conf) fs.file-max = 1000000 적용: sysctl -p
  2. 사용자별 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 개수를 조정하여 성능 문제를 예방할 수 있습니다!

🚀 이제 직접 설정해보세요! 🚀