2

我已經編寫了一個WCF服務,該服務在運行Windows Server 2008 R2的計算機上作爲Windows服務託管。 我的問題是,在運行24小時內,服務開始消耗100%cpu,如任務管理器中所示。 現在,我正試圖解決這個問題的底部。使用100%cpu的WCF窗口服務

我曾妄圖:

  1. 記錄在所有迴路錯誤(嘗試,趕上等)和服務方式。
  2. 從任務管理器讀取資源監視器。
  3. 在我的服務上運行性能監視器。
  4. 中的Microsoft SQL服務器運行數據庫活動監控(看看是否有鎖導致問題)

無論是做法已經產生了是什麼原因導致100%的CPU利用率的一個清晰的認識。 請告訴我一種可以成功調試的方法。

在此先感謝!

回答

3

去年我遇到了這個問題,因爲Web服務基本上表現得像內存泄漏一樣,緩慢地工作到100%的內存和CPU使用率。

我們發現的一個問題是,我的ServiceHost obj(每個請求一個)的每個實例都使用了一個公共共享變量(db連接,我認爲),它從運行我的Web服務的可執行程序中借用我們已經作爲Windows服務運行。該共享變量阻止了一些內存被釋放。一旦我們消除了共享變量,一些內存和CPU問題就消失了。

我們做的另一件事是讓我們的ServiceHost iDisposable使用的類,以便我們可以將它放入Using語句中,理論上應該在End Using命中時從內存中卸載對象。

所以,這兩件事情的結合對我們有所不同,所以希望它可能適用於您。

你可能會嘗試的另一件事是讓你的ServiceHost成爲單例類,或者改變你的併發模式。

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, 
InstanceContextMode:=InstanceContextMode.PerCall)> 

在我們的情況下,我們運行多個和實例我們的語境percall,但你可以更改設置,看看您的問題就會消失。

+0

在數據訪問層,我正在實現單例...你認爲這是一個問題。 – SutharMonil

+0

只有一種方法可以找出......改變它,看看症狀是否消失。 一個想法,確保您的Web服務客戶端明確關閉他們的連接。我不知道你是如何設置的,但如果Web服務的東西連接是打開的,你可能會有更多的對象駐留在內存中(並使用CPU),而不是你需要的。 – Brian

+0

回家之前還有一個想法。如果您還沒有做到這一點,請確保SQL服務器和您的Web服務在不同的機器上運行。這應該可以幫助你找出問題所在。如果您將Web服務和SQL分開,並且它實際上是造成問題的SQL,那麼您可能會遇到索引問題。 – Brian