2017-09-25 56 views
3

我有一個運行大約7臺服務器(C#)的網站。還有一個運行3個實例的gRPC服務(golang)。每個Web服務器連接並調用gRPC服務。該服務每分鐘有大約8000個電話。每小時在gRPC調用中出現高峯

對這項服務的呼叫並不那麼重要,所以最近我們將呼叫的最後期限縮短到了20毫秒。我們在這裏注意到一些奇怪的東全天每小時的「超出期限」錯誤都出現了峯值。和它發生正好在第0分鐘,即下午3點至下午4點等

spike in errors

爲什麼會出現這種情況?

我碰到過this link說gRPC每小時重置一次連接,但沒有其他更多。

所以我的問題是gRPC每小時都會在內部刷新連接。如果是的話,無論如何要調整這種行爲。如果沒有,那麼是否有人可以指導我如何調試爲什麼會發生這種情況。

+2

我建議從一個gRPC服務器實例中收集30秒的運行時間跟蹤信息,以便在所謂的峯值之前15秒和15秒之後。 可以通過類似'curl'的方式來獲得跟蹤http:// endpoint/debug/pprof/trace?seconds = 30'> runtime.trace' 然後,您可以分析它是否存在任何異常,如GC中的尖峯。 關於如何使用跟蹤,請參閱'go tool trace --help'。 除了從中提取pprof-ready的東西外,'-http'標誌還可以使用Chromium -s內置的可視化工具查看跟蹤。 有關更多信息,請參閱https://making.pusher.com/go-tool-trace/。 – kostix

+0

如果異常只出現在小時內,並重新啓動它不會改變峯值,那麼尋找一些外部系統因素會更有意義,例如佔用太多資源的cron作業。儘管我對C#實現一無所知,但大多數系統都會在截止日期前添加抖動以防止出現這樣的尖峯。如果你在客戶端設置了20ms的截止日期,那麼當你需要建立新的連接時,可能還不夠長。 – JimB

+0

@kostix我按照你的建議跑了蹤跡。我在gRPC服務器上找不到任何不同的行爲。我還記錄了每次通話在服務器上的時間,一切似乎都很好。我想我會研究JimB建議的內容,並留意客戶端的問題 – pratikvasa

回答

2

不,grpc-go不刷新連接。如果您配置「最大空閒」(ref)並且連接空閒時間超過該時間限制,則它唯一啓動斷開連接的時間。默認情況下這是禁用的,所以在這種情況下它不可能是罪魁禍首。

+0

在客戶端,您可以看到的另一件事是grpc調試日誌,它應該顯示連接何時遇到錯誤。 (如果您使用的是最新版本 - 最近一兩週內 - 它現在記錄*所有*連接狀態更改,無論原因如何。) –

相關問題