2010-09-22 99 views
2

我們的網絡應用程序中存在延遲問題。大多數時間要求在100ms內處理。但有時可能會花費幾秒鐘,因爲沒有明顯的原因。監控工具的準確性 - 調試應用程序延遲

所以我迷上了一些監控工具,擡頭髮生了什麼事(Wireshark來通過端口複製和進程監視器外部監視在網絡上看到發生了什麼事在本地計算機上)。

我能匹配tcp數據包,他們通常在兩個日誌文件eachother毫秒內彼此。但是在一次事件中,與Wireshark相比,一系列的最後一個數據包在Process Monitor中延遲了250ms以上(並且由於延遲導致應用程序不穩定的行爲正在被觀察)。

由於Wireshark的就迷上了另一臺電腦我敢肯定那是什麼被監測是準確的:所有的包裝都按時到達網卡。 至於進程監視器我不完全確定它是如何工作的:網絡數據何時被註冊?它是否到達網卡?當它被提供給應用程序?當應用程序讀取數據?

在這250毫秒有被註冊其他一些事件,讓我相信,進程監視器被正確記錄,而這250ms的延遲不是由它「創造」。

有關進程監視器,我用它來挖下來的問題,或者您認爲可能是這個問題,將不勝感激當前有哪些方法的行爲任何幫助。

回答

1

選項2

也許您遇到了臭名昭著的250毫秒的延遲,從時間GC原因時(link)。您可以使用專門的CLR主機(link

準確地測量GC懸浮

選項1 - 被排除

由於使用的是TCP,我建議你打開 NoDelay選項,以消除Nagle的算法和延遲確認算法之間的衝突。如果您正在經歷「分批」數據包,而有時數據包「延遲」了大約200毫秒,那麼這可能就是問題所在。
對此行爲的更深入的解釋可以在 here找到。

+0

Nodelay已啓用。此外,由於我使用wireshark進行監控,並且數據包在發送部分沒有任何延遲的情況下進入,所以我只能假設問題在本地。數據包及時通過網絡,爲什麼它不能在本地計算機上「準時收到」? – Benoittr 2010-09-27 13:03:33

+1

@Benoittr,你有沒有檢查過250ms的延遲是否是由GC收集引起的?也許你正經歷着GC不時引起的臭名昭着的250ms延遲(鏈接:http://blogs.microsoft.co.il/blogs/sasha/archive/2009/07/31/garbage-collection-thread-懸浮液 - 延遲 - 250ms的-multiples.aspx)。您可以使用專門的CLR主機準確測量GC懸浮液(鏈接:http://blog.liranchen.com/2010/08/accurately-measuring-gc-suspensions.html) – Liran 2010-09-27 13:25:18

+0

@Liran我一直在嘗試測量GC在我的應用程序中跟隨你的博客文章我稍微修改它以使用4.0中的新事物。目前我可以從主機加載一些示例c#程序,但一旦出現第一次垃圾收集,方法SetAppDomainManager將在非託管代碼中調用,並且c#應用程序會因System.ExecutionEngineException而崩潰。仍在努力。最終我想要一個可配置的主機,它可以加載任何管理代碼並報告GC持續時間。它可能已經存在,但我找不到任何東西。 – Benoittr 2010-09-28 15:19:33