리눅스
Predixy 장애 분석 "Too Many Open Files" 원인 및 진단 절차
변군이글루
2025. 12. 10. 12:51
반응형
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
반응형