我正在做一個相當大的應用程序,負責做實時運動跟蹤和攝像機移動控制。其任務是:凍結管理線程
- 運動跟蹤 (由本機模塊,它從一個網絡攝像頭解碼的視頻流,並提供大如1280×720像素,並跟蹤結果通過回調託管的應用程序都像緩衝區完成)
- 從接收定位反饋數據和運動數據發送給平移/傾斜硬件約20倍的第二以及縮放命令從/到攝像機
- 顯示的圖像數據包括實時可視化
- 編碼和寫入的圖像和會話數據
- 視頻的自動後處理由另一個進程完成
該應用程序使用.NET 4.0並具有WPF用戶界面。
託管線程凍結
從我們不得不面對管理線程凍結500之間,以1500毫秒,這是非常多的這樣的實時應用程序的開始。
爲了找出這些掛起發生的時間,我創建了一個線程,其唯一的任務是始終進行100ms的睡眠。然後,我計算了睡眠真正花費了多長時間,並確定了相機移動停止的時間。它的工作非常可靠,線程都在同一時間!
非託管線程不凍結
雖然所有託管線程凍結非託管線程沒有任何問題的工作。我們通過獨立於應用程序的託管部分編寫的日誌來檢查該日誌。
分析
我試圖找出與現象也許可以導致此行爲:
- 整機減慢,當我們遇到這些問題:Windows正在響應速度很慢(如目錄列表在Windows資源管理器和我的應用程序中掛起半分鐘,或者啓動應用程序需要非常長的時間)
- 我們同時讀取和寫入數千個文件(跟蹤和後處理應用程序),可能是(根據Process.VirtualMemory64)此不多要價窗口
- GUI的響應變得非常慢
- 該應用程序使用有關虛擬內存的1.3GB /工作集存儲器(Process.WorkingSet64)的500MB - 會不會是一些交換到硬盤上?
- 當然,如果我們殺了這個進程在Windows再次響應速度快(那怎麼可以檢查或解決了嗎?),但它需要的Windows一會兒就如何進行調查這個
提示重新正常響應將不勝感激。非常感謝你!
您描述的內容聽起來像顛簸:http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29嘗試使用FileMon和DiskMon來查看實際發生的磁盤訪問情況。 – Candide 2012-02-17 11:14:20
運行taskmgr.exe,進程選項卡。查看+選擇列並勾選「頁面錯誤增量」。通常的下一個結論是「啊,需要更多的RAM」。 – 2012-02-17 13:53:00
@HansPassant:我在「Page fault delta」下得到的值高達70.000。這是否意味着「顛簸」? (順便說一下:你可以創建一個新的回答這篇文章,而不是評論) – nepa 2012-02-24 16:23:09