2012-05-21 105 views
2

我有一個WCF雙工服務(會話實例與net.tcp綁定),可能會做很多數據庫訪問。當它進入其高分貝訪問例程時,它將無法響應任何WCF服務調用。大量的數據庫訪問使WCF服務無響應

我檢查了CPU利用率,雖然很高,但它不是100%。這是在一個4芯盒。

看來,沒有實際的請求被WCF處理。不僅沒有服務操作被調用,而且還有一些安全自定義行爲在WCF堆棧的更遠處被調用。這讓我覺得WCF不知道WCF會因爲線程而餓死,所以無法分配新線程進行訪問。

我不認爲這是一個節流的問題,因爲我可以在服務少於5次的時候使這發生。

有問題的數據庫操作上千種單行插入的。這是通過一個單獨的實體框架上下文來完成的,該實例框架上下文每隔500次調用就會處理和重構,以減少實體框架內部高速緩存的內存積累。目標數據庫是SQL Express 2008 R2。

此服務中有相當數量的工作線程。所有這些都是由任務並行庫實例化的......有些作爲常規的短期任務(使用CLR線程池),另一些是長時間運行的任務(獲得自己的CLR線程),但其中不包括I/O線程(除非CLR正在做一些我不知道的魔法)。數據庫寫入發生在長時間運行的任務上。

是否有任何WCF或調試診斷工具可以報告或可視化WCF線程,工作線程,I/O線程和WCF節流的當前狀態?

環境摘要

  • WCF服務是一個Windows服務中託管
  • WCF服務使用基於會話的net.tcp雙螺旋結合
  • WCF服務(通過雙工合同要求)
  • 只有一個Windows服務實例,但WCF服務對象的多個實例按WCF的要求實例化。
  • WCF服務業務快速工作委託給後臺線程是Windows服務中持續。所有的WCF操作都快速返回,然後將後臺線程生成的附加結果向下傳送到WCF雙工回調通道。
  • 所有數據庫訪問都是在後臺工作線程上完成的。沒有WCF線程用於長時間運行的工作。
  • WCF服務具有單一的自定義安全行爲。沒有其他行爲(如可靠的消息傳遞等)
+0

配置了任何額外的行爲?可靠的消息或類似的東西?是否涉及交易? – rene

+0

沒有可靠的消息或交易。唯一的自定義行爲是自定義安全處理程序。看到這個錯誤的一種方法是在調試器中運行服務,並在安全處理程序中放置一個斷點。通常情況下,如果客戶端嘗試連接,這會非常快速地發生。在這個數據庫階段,安全處理程序從不執行,表明(在我看來)WCF缺少線程。 –

回答

0

如果您使用會話實例化,則每個客戶端連接都有一個主機服務。如果主機正在訪問數據庫,那麼我會說它是阻止&將無法​​處理來自其客戶端的任何其他調用,直到它完成。您可能能夠改變它的工作方式以實現異步。調用一個啓動方法,它啓動工作線程上的數據庫活動並立即返回。要麼有進度方法來檢查狀態,要麼由於您使用的是雙工,因此主機在完成時向客戶端發出信號。

或者是wcf服務不接受新客戶?

+0

WCF服務駐留在持久Windows服務中。 Windows服務具有後臺線程,可定期喚醒並執行數據庫工作。 WCF服務是基於會話的,併爲每個新客戶端創建一個新的會話實例。這工作得很好。除非Windows服務在後臺執行大量數據庫工作,否則WCF服務永遠不會實例化。 –