2011-10-19 50 views
8

我有一個客戶端/服務器應用程序。服務器組件運行時,以「遠程處理」方式(二進制格式化程序,會話對象)使用WCF。附帶調試器的C#代碼非常慢; MemoryMappedFile的錯?

如果我啓動服務器組件並啓動客戶端,則服務器在第一個任務中將完成0.5秒的<。

如果我使用附加的VS調試器啓動服務器組件,然後啓動客戶端,則任務需要20秒才能完成。

沒有代碼更改 - 沒有條件編譯更改。無論我的服務器組件是以32位,64位,VS託管流程,沒有VS託管流程還是任何這些組合的方式編譯和運行,都會發生同樣的情況。

可能重要:如果我用VS.NET 探查(採樣模式),然後應用程序,就好像沒有附加的調試運行一樣快。所以我不能這樣診斷。剛剛檢查,儀器模式也運行得很快。對於併發性分析模式也是如此,可以快速運行。

主要數據:

  • 應用程序使用相當沉重的多線程(在標準的線程池40個線程)。創建線程很快就會發生,而且不是一個慢點。有很多鎖,WaitHandle s和Monitor模式
  • 該應用程序根本沒有引發異常。
  • 該應用程序不會創建控制檯輸出。
  • 該應用程序是完全託管代碼。
  • 該應用程序並在磁盤上映射的幾個文件到MemoryMappedFile:1x750MB和12x8MB和一些規模較小的

實測表現:

  • CPU使用率在兩種情況下最小;當連接調試器時,CPU位於< 1%
  • 在這兩種情況下,內存使用都很少;在這兩種情況下
  • 有很多頁面故障發生(參考MMF)的大概有50或60MB,但是當調試器附加
  • 如果VS宿主進程不使用,或基本上是「遠程調試它們發生更慢顯示器「進入遊戲,然後使用一個體面的CPU,並創建了很多頁面錯誤。但這不是發生問題的唯一時間
  • 無論客戶端如何運行,都會看到性能差異。唯一被更改的變量是通過「從調試開始」vs從資源管理器啓動的服務器組件。

我的想法:當調試

  • WCF慢?
  • MemoryMappedFiles調試速度慢嗎?
  • 使用40個線程 - 調試速度慢?也許監視器/鎖通知調試器?線程調度變得很奇怪/上下文切換非常罕見?
  • 宇宙背景輻射授予的智慧和幽默的殘酷感VS

都顯得愚蠢的可能性不大。

所以,我的問題:

  1. 這究竟是爲什麼?
  2. 如果#1未知,我該如何診斷/發現?
+1

是否啓用第一個機會異常收穫?您還可以嘗試啓用.NET服務器源代碼步進,以在調試模式下捕獲最多潛在的「隱藏」異常,特別是(de)服務器異常。另外,痕跡(outputdebugstring或其他)呢? –

+0

是的,根本不會引發任何異常 - 所有類別的異常(包括.NET)都有第一次機會。沒有調試控制檯輸出(這就是我的意思是控制檯輸出 - 我會編輯澄清)。我剛剛啓用.NET框架源步進(無法看到服務器源步進)..發現一些例外。將暫時更新 –

+0

來自WCF的異常:「'字符,十六進制值0x20,不能包含在名稱中。」我不知道*可以用這種方式隱藏異常:不是例外嗎?將看我能做些什麼來解決。也許你可以發表一個答案,這樣你可以得到一些upvotes /一個接受,如果這能解決它? :) –

回答

9

異常可顯着影響應用程序的性能。有兩種類型的異常:第一次機會異常(用try/catch塊優雅地處理的異常)和未處理的異常(最終會使應用程序崩潰)。

默認情況下,調試器不顯示第一次機會異常,它只是顯示未處理的異常。並且默認情況下,它也只顯示代碼中發生的異常。但是,即使它沒有顯示它們,它仍然會處理它們,所以它的性能可能會受到影響(尤其是在負載測試或大型循環運行中)。

要在Visual Studio中啓用第一次機會例外顯示,請單擊「Debug | Exceptions」以調用Exceptions對話框,並在「Common language runtime」部分檢查「Thrown」(您可以更具體地選擇第一個偶然的例外,你想看到)。

爲了使第一次機會異常從任何地方的應用程序中顯示始發,不只是從你的代碼,點擊「工具|選項|調試|常規」和禁用「啓用僅我的代碼」選項。

爲這些特定「取證方式」的情況下,我也強烈建議,以使.NET框架源步進(它需要「啓用僅我的代碼」被禁用)。這是非常有用的理解發生了什麼事情,有時只是在看調用堆棧是非常鼓舞人心的 - 和樂於助人尤其是在宇宙輻射的mixup的:-)情況

兩個相關的有趣的文章:

+1

根據我的其他意見,這個例外是完全'隱藏'的,直到我啓用'.NET Framework源程序步驟'。 SerializableInfo.SetValue()拋出一個關於'string'參數的異常不是一個有效的XML元素名稱,即使它可以繼續工作,而且我使用的是NetTcpBinding(即二進制格式化程序) 。 –

2

由於這是google搜索這個問題,我想在這裏補充我的問題解決方案,節省人2個小時的研究就像我的希望,當第一批成果之一我的情況。

我的代碼從30秒減慢不附加到4分鐘,調試器的調試器。因爲我忘記刪除一個條件斷點。這些似乎執行大大減緩,所以,要當心那些