비동기 태스크 ..
어쩌면 cpu 99.99% 문제는 비동기 태스크에 있었지 않았겠나요.
고사양 서버에서 이런 문제가 안 생기지만 저사양 서버는 신규 스레드를 생성할 메모리가 적절하지 않으면 비동기 태스크를 재활용 하려고 하는 것이어요.
스레드 풀
태스크 팩토리
async HttpRequest()
(sync) php_execute()
(sync) Write()
async FlushAsync()
return
async HttpResponse()
return
2번이 관리되지 않는 코드라 하더라도 3-2은 관리되는 코드이므로 대기 상태를 걸면 3번 함수에 잠시 위임 될 수도 있을 것 같은데요. 이러면 같은 스레드에서 3번을 두 번 실행하여서 터져요. 무한 루프 데드락이 생길 것 같은데요.
태스크 클래스에 Result, Wait() 이런 동기처리 함수를 사용하더라도 내부적으로 스레드를 물리지 않아서 다른 대기중인 태스크가 여전히 처리되는 부분이 있었어요. 음 ..
태스크를 재활용 하지 않도록 잠시 pin - release 하는 부분이 필요한데 이케 안대면 뮤텍스나 세마포어를 써야하겠쩌. 이러면 한헐적으로 4번이 중복 실행되려고 할 때 어느 방문자는 심각한 지연을 겪을 것이어요. 0.1% 흠결을 남기기 싫은데 어떡하나요.
아 ..
Thread.Sleep(5000); 함수로 스레드를 차단하여도 태스크는 여전히 실행되어요. 내부적으로 태스크 팩토리로 항상 처리되는 것 같은데요. 이러면 어떠캄 망해쩌.
아무래도 태스크 팩토리가 여러가지 태스크를 가지고 있어서 스레드 차단은 절때 허용하지 않을 것 같은데요. 이러면 결과적으로 php는 스레드 풀에서 작동 시켜야 99.99% 문제가 전혀 발생하지 않을 것으로 전망해요.
안일하네요. 돈이 많은 ms도 사실 이런 부분은 몰랐었겠쩌. 이케 _트롤 스러운 코드를 작성하는 사람이 세상에 얼마나 있겠나요. pin된 쓰레드가 잠깐 동안 3번 함수에 2번 위임 되지 않도록 만 해주면 모두다 해결 된다는 말이어요.
슬프빈다.
머 여차하면 aspnetcore 코드가 오픈소스이니 저 부분에 핵 코드를 만들어서 사용 하여야 하겠어요. 옛날에 클로즈 소스이었을때 진심 해킹 말고는 답이 없었쩌. 대충 선방 한 것으로 여겨야 하겠어요.
언제 적용하지 .. 코드를 보다가 떠오른 것이 아니고 문득 생각난 것이어서 소스 커밋을 계속 미루어야 하겠어요. 동시에 다 하는 방법이 없었나 몰라요.
