2012-02-17 66 views
1

我正在做一個相當大的應用程序,負責做實時運動跟蹤和攝像機移動控制。其任務是:凍結管理線程

  • 運動跟蹤
  • (由本機模塊,它從一個網絡攝像頭解碼的視頻流,並提供大如1280×720像素,並跟蹤結果通過回調託管的應用程序都像緩衝區完成)
  • 從接收定位反饋數據和運動數據發送給平移/傾斜硬件約20倍的第二以及縮放命令從/到攝像機
  • 顯示的圖像數據包括實時可視化
  • 編碼和寫入的圖像和會話數據
  • 視頻的自動後處理由另一個進程完成

該應用程序使用.NET 4.0並具有WPF用戶界面。

託管線程凍結

從我們不得不面對管理線程凍結500之間,以1500毫秒,這是非常多的這樣的實時應用程序的開始。

爲了找出這些掛起發生的時間,我創建了一個線程,其唯一的任務是始終進行100ms的睡眠。然後,我計算了睡眠真正花費了多長時間,並確定了相機移動停止的時間。它的工作非常可靠,線程都在同一時間!

非託管線程不凍結

雖然所有託管線程凍結非託管線程沒有任何問題的工作。我們通過獨立於應用程序的託管部分編寫的日誌來檢查該日誌。

分析

我試圖找出與現象也許可以導致此行爲:

  • 整機減慢,當我們遇到這些問題:Windows正在響應速度很慢(如目錄列表在Windows資源管理器和我的應用程序中掛起半分鐘,或者啓動應用程序需要非常長的時間)
  • 我們同時讀取和寫入數千個文件(跟蹤和後處理應用程序),可能是(根據Process.VirtualMemory64)此不多要價窗口
  • GUI的響應變得非常慢
  • 該應用程序使用有關虛擬內存的1.3GB /工作集存儲器(Process.WorkingSet64)的500MB - 會不會是一些交換到硬盤上?
  • 當然,如果我們殺了這個進程在Windows再次響應速度快(那怎麼可以檢查或解決了嗎?),但它需要的Windows一會兒就如何進行調查這個

提示重新正常響應將不勝感激。非常感謝你!

+0

您描述的內容聽起來像顛簸:http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29嘗試使用FileMon和DiskMon來查看實際發生的磁盤訪問情況。 – Candide 2012-02-17 11:14:20

+0

運行taskmgr.exe,進程選項卡。查看+選擇列並勾選「頁面錯誤增量」。通常的下一個結論是「啊,需要更多的RAM」。 – 2012-02-17 13:53:00

+0

@HansPassant:我在「Page fault delta」下得到的值高達70.000。這是否意味着「顛簸」? (順便說一下:你可以創建一個新的回答這篇文章,而不是評論) – nepa 2012-02-24 16:23:09

回答

1

我會建議採取流程轉儲,因爲你遇到的性能問題。您可以通過多種方式執行此操作(SysInternals中的taskmgr.exe或procdump.exe)。採取完整的內存轉儲。

一旦你有.dmp文件,你可以用windbg(或Visual Studio 2010)分析它。對於託管進程,您需要加載sos.dll擴展。

有很多很好的資源的WinDbg在那裏,但這裏有一些是曾經幫助過我:

1)苔絲費爾南德斯video(ASP.NET進程,但技術是相同的)

2)WinDbg cheatsheet

當您遇到問題並告訴您確切的罪魁禍首時,內存分析將能夠爲您提供堆棧(!clrstack)。