我有一個麻煩的問題,我不知所措。簡而言之,我的Web場中的Web服務器使用CPU的難度令人難以置信。在C#/ WCF應用程序中使用原因不明的CPU
我有大量的用戶打兩個前端Web服務器。 99%的頁面加載是Ajax請求,並提供一個簡單的JSON序列化對象,Web服務器使用WCF從後端檢索。在典型的情況下(大概99%的請求),所有的ASPX頁面都在做一個WCF調用來獲取這些數據,並將其序列化爲JSON字符串並返回。
該對象非常小 - 一個GUID,一對短字符串,幾個整數。
非典型情況是初始頁面加載,它執行相同的操作(WCF請求),但使用asp:literals將響應注入頁面的不同部分。
所有三臺機器(2個Web服務器,一個後端)具有相同的硬件規格。我期望後端在這種情況下完成大部分工作,因爲它管理所有數據,執行查找等。但是:後端的負載是,比前端的負載低。後端是一個很好的,級別10-20%的CPU負載。前端平均運行時間爲30%,但它們全都在地圖上,有時會在10秒內達到100%的峯值,並且需要600毫秒才能爲這些非常簡單的頁面提供服務。
當我在profiler(ANTS)中運行前端時,它將WCF通信標記爲佔用80%的CPU時間。這是.NET生成的WCF代理的整個調用。
WCF設置:服務完全平行。我已將實例設置爲「單個」,併發設置爲「多個」。我將服務上的maxConnections和listenBacklog打開到256.在緊張的情況下(500個請求/秒),我看到兩個前端服務器和服務之間打開了大約75個連接,所以它沒有打到牆上。我的安全性設置爲「無」。帶寬使用率約爲潛在的1/20(100Mb/s網絡爲4Mb/s)。
在客戶端(Web服務器)上,我爲該服務創建了一個靜態ChannelFactory。代碼來調用服務的樣子:
service = MyChannelFactory.CreateChannel();
try {
service.Call();
service.Close();
} catch {
service.Abort();
}
(簡化,但你得到的基本圖片)
我不明白的是,其中在前端所有這些負載是從哪裏來的。奇怪的是,它從來不在30%-90%的範圍內。它處於恐慌模式(100%)或正常(30%或更少)。但是,考慮到後端的負載,我預計這兩臺機器都會達到10%或更低。內存使用,句柄等等,都顯得合理。
要添加一個皺紋:當我記錄在後端服務這些調用需要多長時間時,我得到的時間始終小於15ms(可能每分鐘有一個或兩個尖峯到30ms)。在前端,這些調用可能需要1秒才能返回。我想這可能是因爲CPU的問題,但它似乎對我來說。
所以......有沒有人有什麼想法在哪裏看這種事情?我正在探索一些事情。
澄清:WCF服務託管在Windows服務中,並且正在使用netTcp綁定。另外,我將客戶端上的maxConnections設置爲128,FWIW。
@Moxen:找出問題所在? – LBushkin 2010-04-23 19:38:57
我們也有一個NetTCP WCF服務託管在Windows服務中,這種行爲在移到.NET後突然顯示出來4 您有任何更新嗎?我們正在考慮轉向基於IIS/ASP.NET,但我不相信它會解決這個問題。 – Jaans 2013-02-13 03:45:33