여기서는 멈추세요
- FD 수가 빠르게 계속 증가하면 limit 상향만으로 해결하지 않고 애플리케이션 누수 조사를 시작합니다.
- 서비스 재시작의 트래픽 영향과 롤백 창을 확보하지 못하면 override를 적용하지 않습니다.
FILE DESCRIPTORS
SAFE OPERATING BOUNDARY
systemctl edit로 추가한 정확한 LimitNOFILE 줄을 제거하고 daemon-reload·승인된 재시작 후 이전 limit이 복원됐는지 확인합니다.
BEFORE YOU START
CHECK THE BRANCH
현재 FD 수가 프로세스 soft limit에 가깝고 사용량이 안정적이면 워크로드에 맞는 제한 조정을 검토합니다.
제한을 높여도 재발하므로 파일·소켓을 닫지 않는 애플리케이션 누수와 특정 요청 패턴을 먼저 조사합니다.
로그인 셸의 ulimit은 systemd 서비스에 그대로 적용되지 않을 수 있으므로 프로세스 limits와 LimitNOFILE을 기준으로 판단합니다.
FOLLOW THE FLOW
SERVICE_NAME을 실제 unit으로 바꾸고 오류를 낸 프로세스의 PID를 확인합니다.
systemctl status SERVICE_NAME --no-pager -ljournalctl -u SERVICE_NAME --since '-30 min' -g 'Too many open files|EMFILE' --no-pagersystemctl show SERVICE_NAME -p MainPID --valueMainPID가 0이거나 재시작됐다면 장애 시각의 이전 PID와 로그를 별도로 확보합니다.
현재 또는 장애 당시 PID를 다음 단계에 사용합니다.
PID_NUMBER를 대상 PID로 바꾸고 soft·hard limit과 사용량을 같은 시점에 비교합니다.
cat /proc/PID_NUMBER/limitsfind /proc/PID_NUMBER/fd -maxdepth 1 -type l 2>/dev/null | wc -lsystemctl show SERVICE_NAME -p LimitNOFILE현재 FD 수가 Max open files의 soft limit에 가까운지 확인합니다.
여유가 있는데 오류가 났다면 child process, 컨테이너 또는 다른 PID를 확인합니다.
lsof는 FD가 매우 많은 프로세스에서 출력과 부하가 커질 수 있으므로 한 PID로 제한합니다.
sudo lsof -nP -p PID_NUMBER | awk 'NR>1 {count[$5]++} END {for (type in count) print count[type], type}' | sort -nlsof가 설치된 환경에서 대상 PID 하나로만 실행합니다.ss -sfind /proc/PID_NUMBER/fd -maxdepth 1 -type l 2>/dev/null | wc -lREG, IPv4·IPv6, FIFO 등 특정 종류가 증가하는지와 요청량 감소 후 FD가 반환되는지 봅니다.
지속 증가하면 limit 조정보다 애플리케이션 누수 분석을 우선합니다.
프로세스별 EMFILE과 시스템 전체 ENFILE 가능성을 구분합니다.
cat /proc/sys/fs/file-nrcat /proc/sys/fs/file-maxsystemctl cat SERVICE_NAMEfile-nr의 할당 수가 file-max에 가깝지 않다면 해당 프로세스 제한 또는 누수 가능성이 큽니다.
필요 동시 연결·파일 수를 근거로 새 limit 값을 승인받습니다.
LIMIT_VALUE를 측정 근거가 있는 값으로 바꾸며 누수를 숨기기 위한 임의의 큰 값은 사용하지 않습니다.
sudo systemctl edit SERVICE_NAME[Service] 아래에 LimitNOFILE=LIMIT_VALUE를 추가하고 저장합니다.sudo systemctl daemon-reloadsudo systemctl restart SERVICE_NAMEsystemctl show SERVICE_NAME -p MainPID -p LimitNOFILE새 PID의 /proc/PID/limits에 승인값이 적용되고 정상 부하에서 FD가 안정적으로 회수되어야 합니다.
FD가 계속 증가하면 이전 값 복원보다 먼저 트래픽 보호와 애플리케이션 수정 계획을 진행합니다.
PRIMARY REFERENCES
배포판과 버전에 따라 옵션·로그 위치가 다를 수 있습니다. 실행 전 서버의 --help와 로컬 매뉴얼을 함께 확인하세요.