我有一個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服務具有單一的自定義安全行爲。沒有其他行爲(如可靠的消息傳遞等)
配置了任何額外的行爲?可靠的消息或類似的東西?是否涉及交易? – rene
沒有可靠的消息或交易。唯一的自定義行爲是自定義安全處理程序。看到這個錯誤的一種方法是在調試器中運行服務,並在安全處理程序中放置一個斷點。通常情況下,如果客戶端嘗試連接,這會非常快速地發生。在這個數據庫階段,安全處理程序從不執行,表明(在我看來)WCF缺少線程。 –