본문 바로가기

리눅스

Predixy 장애 분석 "Too Many Open Files" 원인 및 진단 절차

반응형

Predixy 장애 분석 "Too Many Open Files" 원인 및 진단 절차

Predixy 장애

2025-12-09 23:38:15.008608 N Logger.cpp:152 MissLog count 1

2025-12-09 23:38:25.073709 E Backtrace.h:18 predixy backtrace(6)
/usr/local/bin/predixy(_Z9traceInfoi+0x12a)[0x5e4e328e573a]
/usr/local/bin/predixy(+0xe457d)[0x5e4e328e457d]
/lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x71d54247ff20]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xc7)[0x71d54247fe97]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x141)[0x71d542481801]
/lib/x86_64-linux-gnu/libc.so.6(+0x89897)[0x71d5424ca897]
/lib/x86_64-linux-gnu/libc.so.6(+0x9090a)[0x71d5424d190a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x9f6)[0x71d5424d9346]
/usr/local/bin/predixy(_ZN9RefCntObjI16AcceptConnectionSt6atomicIiEE5unrefEv+0x1b1)[0x5e4e32893051]
/usr/local/bin/predixy(_ZN7Handler25postAcceptConnectionEventEv+0x25a)[0x5e4e328d953a]
/usr/local/bin/predixy(_ZN7Handler3runEv+0x168)[0x5e4e328db8c8]
/usr/local/bin/predixy(+0x10c87f)[0x5e4e3290c87f]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76db)[0x71d542a516db]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x3f)[0x71d54256288f]

2025-12-09 23:38:39.935727 N Handler.cpp:303 h 2 p 0.0.0.0:6379 4 e ListenSocket.cpp:50 socket accept fail Too many open files

1. 장애 발생 로그 분석

Predixy 프로세스 크래시(backtrace)

predixy backtrace(6)
...
cfree+0x9f6
...
RefCntObj::unref
Handler::postAcceptConnectionEvent
Handler::run
  • Predixy가 과도한 클라이언트 연결 요청을 받아 FD 소진
  • Predixy 내부 이벤트 핸들링 중 FD 부족 → 메모리/객체 해제 타이밍 오류로 abort 발생

Accept 단계에서 발생한 오류

ListenSocket.cpp:50 socket accept fail Too many open files

이 메시지는 Predixy가 클라이언트 연결을 받아들이는 순간(accept) 이미 시스템이 허용한 FD 수를 초과해 새 연결을 받을 수 없음을 의미한다.

이 문제는 클라이언트 연결 폭증, ulimit 제한 부족, 혹은 Predixy 설정값이 실제 OS limit보다 훨씬 크게 잡힌 경우에 쉽게 발생한다.

MissLog count

N Logger.cpp:152 MissLog count 1

Predixy가 내부적으로 처리하지 못한 요청이 누적되는 상황을 의미한다.

대부분 FD 고갈 → 요청 처리 누락 → MissLog 증가 순서로 이어진다.

2. Predixy 컨테이너에서 FD 제한 및 사용량 진단

컨테이너 내부에서 실제 FD(limit 및 사용량)를 확인해야 한다.

Predixy 프로세스의 FD 제한 확인

docker compose exec -it predixy sh -c "ulimit -n"

또는

docker compose exec -it predixy sh -c "cat /proc/1/limits | grep 'open files'"
Max open files: 1024  4096
  • Predixy가 실제로 사용할 수 있는 최대 FD 수
  • 4,000~10,000 정도라면 실서비스에는 매우 낮음

Predixy의 실제 FD 사용량 확인

Predixy 프로세스(PID 1)가 오픈한 전체 FD 개수(파일, 소켓 모두 포함)

docker compose exec -it predixy sh -c "lsof -p 1 | wc -l"

오픈된 네트워크 소켓 개수(TCP/UDP 모두 포함)

docker compose exec -it predixy sh -c "ss -anp | grep ',pid=1,' | wc -l"

/proc/1/fd 디렉토리 개수 확인(/proc/<PID>/fd/는 해당 PID가 오픈한 모든 파일 디스크립터 목록)

docker compose exec -it predixy sh -c "ls /proc/1/fd | wc -l"
728x90

Predixy 버전 확인

docker compose exec -it predixy sh -c "predixy --version"
predixy-1.0.4

3. Docker 컨테이너 실행 시 ulimit 증가

컨테이너 내부 FD 제한이 262144로 증가

vim docker-compose.yml
services:

  predixy:
    image: haandol/predixy:latest
    container_name: predixy
    hostname: predixy
    restart: always
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    volumes:
      - ./conf:/etc/predixy/conf
      - ./logs:/var/log/predixy
      - /etc/localtime:/etc/localtime:ro
    network_mode: host      
    ports:
      - 6379:6379

다시 시작

docker compose down -v
docker compose up -d

확인

docker compose exec -it predixy sh -c "ulimit -n"

 

참고URL

- GitHub : haandol/predixy

 

반응형