2011-04-11 57 views
3

是否有任何.NET性能分析工具可以附加到正在運行的Windows服務並進行基本堆棧調用採樣?如果該工具不需要安裝,那將是非常好的,因爲我需要通過客戶的IT部門獲取大量繁文tape節。.NET生產代碼性能分析工具

謝謝


自然的性能問題: 這個程序有性能問題運行作爲Windows服務,並處理來自200多個移動設備的收入信息。通常這個程序每秒可以處理至少10條消息。不幸的是,在最近的升級之後,由於某些原因,該程序通常在上午7點左右不能夠快速處理消息。消息進入後,它可以在程序內部隊列中超過10分鐘,然後才能進行處理。我們還注意到該程序使用的CPU比正常高。通常情況下,它應該是8核心機器的5%,現在是20-25%。

該程序不僅處理傳入消息,還維護數據庫並向客戶端提供數據。它有五個線程處理傳入的消息,並在其線程上運行任何維護作業。

當前的解決方法是在發生減速時重新啓動服務。重新啓動後,程序將再次正常運行(CPU低於5%)。直到凌晨7點左右,第二天早上纔會發生。每次重新啓動後,隊列中的所有消息均被丟棄。通常上午7點和下午5點是我們收到大量信息的時間,但問題似乎只發生在上午7點。

我們的團隊試圖在內部使用模擬消息重現該程序,並進行代碼比較以查看是否存在任何關鍵瓶頸。

+0

聽起來像問題可能與內存泄漏有關(可能是一個事件句柄未釋放,導致對象永遠無法被垃圾收集)。我會建議在內部運行諸如DebugDiag之類的測試消息,並查看是否存在某種性質的泄漏。你可以檢查[這個鏈接](http://viisual.net/tools/)下載1.2測試版,它有一個專門針對.Net內存使用情況的規則。拋出你的PDB文件,你可以得到分配的行號。 – pstrjds 2011-04-11 04:51:44

+0

感謝您的建議。應用程序可能會在一段時間內積累某些內容,並且不會丟棄數據,因爲我們注意到應用程序啓動後內存更高。但是,它並不直接解釋高於正常的CPU使用率。 – dsum 2011-04-11 20:40:56

+0

不知道你的代碼的性質我不能肯定地說,但是如果由於內存壓力它必須進行大量分頁,或者你正在迭代代碼中的某種集合,那麼CPU使用率可能會增加,預計會不斷增長,但現在每當數據進入時你都被迫迭代更大的集合......這肯定會導致CPU時間隨着時間的推移而增長。 – pstrjds 2011-04-12 15:38:44

回答

0

感謝您的所有建議。

我嘗試了一些性能分析工具,但是它們都需要安裝,而且有些需要花錢。

嘗試使用「Windows Debug Tools」+「Process Explorer」+「Process Monitor」查看是否可以獲取正在運行線程的堆棧跟蹤的快照。不幸的是不能讓我們自己的託管符號文件(pdb)工作。我可以看到所有對內核api的調用,但沒有我自己的代碼。

幸運的是,我們的客戶已經批准我們安裝探查器。如果您獲得了Visual Studio Premium或Enterprise版本,它將附帶stand alone profiler。我能夠在客戶端計算機上獲取配置文件報告並使用Visual Studio分析報告。

+0

如果將pdb-s的位置添加到進程資源管理器符號路徑配置中,則應該在其線程視圖中顯示路徑。 – Ghita 2015-08-05 14:01:41

1

看看AVICode(最近被微軟收購)是否符合您的需求。該產品都是關於監控生產環境中應用程序的性能。我在10年內沒有看過這個產品,但是當我看到它之前,它強調了從生產中運行的應用程序獲取異常信息和調用堆棧的能力,而且開銷很小。它建立在.NET性能分析API的基礎之上,所以如果它提供了CPU利用率情況的功能,我也不會感到驚訝。我不知道在服務器上安裝/啓用它所需的詳細信息,因此我不確定它是否可以輕鬆清除IT部門的障礙。

也檢查出performance counters for the .NET Framework,可以啓用它,而無需觸摸您的應用程序或其配置。

2

我不知道任何可以使用而無需安裝它們的分析器,因此您可能最終必須與客戶的IT部門達成一些協議。

但是,您可以通過查看.NET性能計數器來獲得一些洞察。由於某種原因,服務可能會過度垃圾回收。

如果這樣不能產生任何線索,可以使用SysInternals中的Process Explorer。無需事先安裝即可運行。屬性窗口有一個線程,它將向您顯示進程中的所有線程以及它們的運行時間,這可能會有所幫助。