증상재현 ..
이틀 동안 코드를 다시 살펴보았는데도 흠이 없는 것 같은데요.
php 내부 소스도 8.2, 8.3 기준으로 살펴보았어요. 깃허브에서 버전별로 태그된 브렌치로 열면 되는데요.
[1] nightmare/libxphp/main.cpp at main · nyakuz/nightmare · GitHub
[2] GitHub - php/php-src at php-8.3.0
문득 .. 전엔 생각하지 못하였던 이상한 방법이 .. 오늘은 일부러 슬립 함수로 대기 5초를 넣어서 적절히 천 번 요청을 보내었는데 php모듈이 뻗는 것 같은 비슷한 증상이 재현되었어요. 이번엔 제대로 망했네요!
cpu사용량은 10% 근처에도 못 가지만 램은 512mb 근처로 스파이크가 걸리고 이러면 스왑메모리에 의존하여서 미어터지는 것이 원인이겠어요.
여차하여 콘솔에서 php프로그램에 5초 딜레이를 걸고 1을 만 번 출력하는 테스트 코드를 실행해보았는데 메모리가 18.6gb 언저리에 스파이크가 걸리면서 아주 작동이 잘되어요. 이러면 크롤링이 초 당 1천회 이상 심하게 동시 요청되었다면 2기가 램이 소비되어야 하여서 결과적으로 터지겠어요.

하찮은 동기식 프로그램에 명료한 한계이다 ..
사실 짧은 시간 동안 작동한다면 특별히 문제되는 부분이 아니지만 지연이 심한 외부 서버랑 통신해야 하는 경우에는 대략 30초 전후로 계속 스레드 컨텍스트를 붙잡고 있어서 결과적으로 나쁜 영향을 주어요.
어쩐지 .. 완전히 터졌다면 segmentation fault가 나면서 서버가 강제 종료 되었어야 했어요. 불결한 오류로 터졌다면 서버는 다시 시작해요. 이러하였으면 이케이케 알아서 복구 되었지 않겠나요.
1 cpu 512m ram은 난이도가 너무 높았나요 ..
여담으로 가장 단순한 로드벨런싱은 dns기반으로 하는 것이어요.
[1] DNS 기반 부하 분산이란? | DNS 부하 분산 | Cloudflare
aspnetcore에 레이트 제한이 걸려 있어서 컴퓨터 하나로 과부하를 걸 수 없는 것 같은데요 .. 이렇게 되면 오히려 과부하가 걸렸을 때 응답이 지연되어서 결과적으로 더 빠르게 망할 것이어요. 설정 값은 또 어떻게 바꿔야 하나 ..
