我有一个麻烦的问题,我不知所措。简而言之,我的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