저는 약 7 개의 서버 (C#)로 실행되는 웹 사이트를 운영하고 있습니다. 그리고 3 개의 인스턴스로 실행되는 gRPC 서비스 (golang)가 있습니다. 각 웹 서버는 gRPC 서비스에 연결하고 gRPC 서비스를 호출합니다. 서비스에는 약 8000 건의 통화가 있습니다.매시간 gRPC 호출에 스파이크가 발생합니다
이 서비스에 대한 호출이 중요하지 않으므로 최근에는 통화 마감 시간을 20 밀리 초로 단축했습니다. 여기서 우리는 이상한 것을 발견했습니다. 하루 종일 매시간 "마감 기한 초과"오류가 발생했습니다. 그리고 등
0 번째 분 즉 오후 2 오후 3 오후 4시 정확히 왜 이런 일이 않습니다됩니까?
this link gRPC가 매 시간마다 연결을 재설정한다고 말했지만 그 이상은 아닙니다.
제 질문은 gRPC가 매시간 내부적으로 연결을 새로 고칩니다. 그렇다면 어쨌든이 동작을 조정할 것입니다. 만약 그렇다면 누군가가 어떻게 이런 일이 일어나고 있는지 디버깅 할 수있는 방향을 제시 할 수 있습니다.
한 gRPC 서버 인스턴스에서 30 초의 런타임 추적을 수집하여 스파이크 발생 15 초 후 15 초가되도록하는 것이 좋습니다. 추적은 'curl'과 같은 방법으로 얻을 수 있습니다. http : // endpoint/debug/pprof/trace? seconds = 30 '> runtime.trace' 그런 다음 GC의 스파이크와 같은 비정상적인 부분을 분석 할 수 있습니다. 추적 사용 방법은'go tool trace --help'를 참조하십시오. pprof-ready 항목을 추출하는 것 외에'-http' 플래그를 사용하면 Chromium의 내장 비주얼 라이저를 사용하여 추적을 볼 수 있습니다. 자세한 내용은 https://making.pusher.com/go-tool-trace/를 참조하십시오. – kostix
비정상적인 경우에만 정확하게 나타나고 다시 시작하면 스파이크가 이동하지 않습니다. 너무 많은 리소스를 사용하는 cron 작업과 같은 외부 시스템 요소를 찾는 것이 좋습니다. C# 구현에 대해 알지는 못하지만 대부분의 시스템은 이러한 스파이크를 방지하기 위해 마감 시간에 지터를 추가합니다. 클라이언트에서 20ms의 기한을 설정하고 있다면 새로운 연결을해야 할 때를 감당할 수 없을 것입니다. – JimB
@kostix 당신이 제안한 것처럼 추적을 실행했습니다. gRPC 서버에서 다른 동작을 찾을 수 없습니다. 나는 또한 각각의 전화가 서버에 걸리는 시간을 기록했다. JimB가 제안한 것을 살펴보고 클라이언트 측의 문제를 조사 할 것입니다. – pratikvasa