2013-01-24 42 views
4

我有一個64位的.NET控制檯應用程序,基本上從MSMQ讀取消息,然後通過與SQL Server通過.NET SqlClient進行通信來處理它們。大多數情況下,它可以正常工作,但是每時每刻,即使是最簡單的操作(如構建SqlCommand參數數組),運行速度異常緩慢。在最糟糕的情況下,應用程序一次只能處理30分鐘(沒有寫入日誌,並且在詳細模式下相當健談),然後再次開始寫入,但沒有指出導致延遲的原因。這對我們的產品的可用性產生嚴重影響。爲什麼我的.NET應用程序產生如此多的頁面錯誤?

我花了幾個小時看着每一個性能計數器等,一切都指向過多的頁面讀取 - 由於這個原因,磁盤I/O最大化,我可以看到我的過程不斷地讀取pagefile.sys等等,但我不知道爲什麼,因爲應用程序的總內存使用率遠低於可用的RAM:工作集是60M,總承諾大小是300M(高,並且匹配高峯工作集 - 不是確定這是爲什麼),但這是花生相比,12G的可用內存,其中很少有人正在使用。

我已經讀過關於監視應用程序性能等的每個MS文檔,但所有內容都指向「我的應用程序需要更多內存」。好的...那麼它如何給它更多的記憶 - 沒有別的東西正在使用它!現在還有一個單獨的問題,就是應用程序的功能,它確實不需要太多的內存,但是要想降低這些內存的成本可能不值得花費更多的硬件。

還有一件事要注意:如果我啓動同一應用程序的第二個實例,它似乎運行良好。所以這顯然不是一個全系統問題。

我在這裏看到了一些類似的帖子在stackoverflow,但沒有特別有幫助的答案呢...希望比以前的海報更幸運。

+0

你有沒有試過在這些超慢時期分析程序,看看它花費最多時間在哪些方法? Visual Studio有一個非常好的分析器 – Patashu

+0

系統中還在發生什麼?你有其他CPU密集型進程嗎?SQL Server數據庫在哪裏運行?此控制檯應用程序每分鐘處理多少條消息?在您的環境中存在太多可能導致問題的原因......在這些緩慢的時間內使用Visual Studio調試器並附加到流程將是一個好的開始。代碼是否足夠小,以至於您可以提供一些核心邏輯例如[Pastie](http://pastie.org/)? – mellamokb

+0

是的,我嘗試了所有的東西 - 它不會做任何事情,它不會一直做。使用任何CPU或內存的系統上沒有其他任何東西。 Sql服務器在別處。我想知道高頁錯誤是否必然是相關的,因爲我只是查看了該進程的所有磁盤I/O,而且它實際上正在向MSMQ存儲區寫入*(爲什麼寫 - 這個過程不會' t甚至生成消息,只能刪除它們?)而不是從pagefile.sys中讀取 –

回答

0

任務管理器中的頁面錯誤意味着命中磁盤上的頁面文件,默認爲您安裝的RAM量的1.5倍。它不一定是壞的,它只是告訴你數據在哪裏。您可以關閉分頁文件,將此數字保持爲0.

您是否查看過您依賴的產品(如SQL Server或MSMQ)的性能和計數器?你有沒有試過memtest86來測試你的內存?

+0

我現在好像再次處於這種狀態,並且使用最新的procmon,它正在執行的唯一操作(僅針對頁面文件和.NET程序集)是ReadFile。其他任何Win32電話都沒有,現在已經超過30分鐘了。離奇。 –

0

我有同樣的問題。根據我的經驗,當你有強烈的應用「永遠在線」時;它們應該放置在Windows服務中而不是控制檯應用程序中。

這就是說這可能是一個垃圾收集問題。

添加到您的配置文件:

<runtime> 
    <gcServer enabled="True"/> 
</runtime> 

您需要將它配置節點下。

根據我的經驗,這會導致應用程序擁有更少的PageFaults和更大的工作集。

沒有銀彈。沒有代碼,就沒有辦法知道你的代碼是否在泄漏內存;這可能是超常分頁的另一個原因。

相關問題