gunicorn도 그렇지만 멀티프로세스 데몬의 gracefully restart는 중요하다.
4개의 워커가 있고 SIGHUP 재기동을 하는 상황이다. 웹서버들은 우아한 종료를 지원하므로 4개를 다 끈 후 한 번에 다 켜지 않는다. 한 개씩 종료하고 한 개씩 켠다. 이론상 서비스 다운타임이 없어야 하는데...
gunicorn 을 보니까 교체된 새 프로세스가 아직 시동이 안 걸렸는데 프로세스 떴다고 이전 프로세스를 하나 또 종료시켜버린다.
새 프로세스는 대용량 데이터를 로딩한다고 뺑이를 치고 있다. 아직 http 받을 준비가 안 됐다. 그런데 이전 프로세스들을 다 킬 시켰다..
잘헌다.. AI 시대 아닌가. 거대모델을 로딩한다고 시동 시간이 오래 걸릴 수 있다. 또는 도커의 시대 아닌가. 컨테이너 초기 어쩌고저쩌고 시간이 오래 걸릴 수도 있다.
여튼 gunicorn 우아한 재기동에 있어서 교체한 새 프로세스의 시동이 완전히 걸렸는지 트리거링을 하거나 딜레이를 주는 방법을 찾지 못했다.
그러면 모다모다? 만들어야지.
데몬형 코딩을 제대로 했다면 데몬 프로세스의 부모 PID는 1이 된다.
pgrep -P 1 gunicorn 으로 프로세스 관리자격인 gunicorn의 pid를 찾는다.
이제 이 pid가 부모인 프로세스들을 찾는다.
pgrep -P $(pgrep -P 1 gunicorn) 으로 찾으면 된다.
오호.. 이제 얘네들을 순차 SIGHUP 주면 된다.
for i in 아까 그거.
do
kill -SIGHUP $i
sleep 30
done
이제 우아한 재기동에 있어 30초 딜레이를 충분히 주고 순차 재기동 할 수 있는 몸이 되었다. 신경숙 요즘 뭐하나.