在C#/ WCF应用程序中使用不明原因的CPU

时间:2010-01-26 01:20:13

标签: c# asp.net wcf

我有一个麻烦的问题,我无法解释。简而言之,我的Web场中的Web服务器上的CPU使用率非常高。

我有大量用户点击两台前端Web服务器。 99%的页面加载是Ajax请求,并提供简单的JSON序列化对象,Web服务器使用WCF从后端检索。在典型情况下(同样可能是99%的请求),所有ASPX页面正在进行WCF调用以获取此数据,将其序列化为JSON字符串并将其返回。

对象非常小 - 一个guid,一对短字符串,几个整数。

非典型情况是初始页面加载,它执行相同的操作(WCF请求),但使用asp:literals将响应注入页面的不同部分。

所有三台机器(2台Web服务器,一台后端)都具有相同的硬件规格。我希望后端在这种情况下完成大部分工作,因为它管理所有数据,进行查找等。但是:后端的负载很多小于负载前端。后端是一个不错的10-20%CPU负载。前端平均运行30%,但它们遍布地图,有时会达到100%的峰值10秒,并且需要600ms才能为这些非常简单的页面提供服务。

当我在探查器(ANTS)中运行前端时,它将WCF通信标记为占用80%的CPU时间。这是对.NET生成的WCF代理的全部调用。

WCF设置:服务完全并行。我将实例化设置为“单一”并将并发设置为“多个”。我打开服务上的maxConnections和listenBacklog到256.在严重的压力下(500个请求/秒),我看到前端服务器和服务之间有大约75个连接打开,所以它没有打到那个墙。我的安全设置为'none'。带宽使用约为电位的1/20(100Mb / s网络上为4Mb / s)。

在客户端(Web服务器)上,我为该服务创建了一个静态ChannelFactory。调用服务的代码如下:

service = MyChannelFactory.CreateChannel();
try {
   service.Call();
   service.Close();
} catch {
   service.Abort();
}

(简化,但你得到的基本图片)

我不明白的是前端的所有负载来自哪里。令人奇怪的是,它永远不会在30%-90%的范围内。它处于恐慌模式(100%)或正常(30%或更低)。但是考虑到后端的负载,我预计这两台机器都会达到10%或更低。内存使用,手柄等都显得合情合理。

再添加一个皱纹:当我记录在后端服务这些呼叫所需的时间时,我得到的时间始终小于15毫秒(可能一到两个尖峰到每分钟30毫秒)。在前端,这些调用最多可能需要1秒才能返回。我想这可能是因为CPU问题,但它似乎对我而言。

那么......有没有人对这种东西的看法有什么想法?我正在寻找可以探索的东西。

澄清:WCF服务托管在Windows服务中,并使用netTcp绑定。另外,我将客户端上的maxConnections设置为128,FWIW。

2 个答案:

答案 0 :(得分:5)

很难说可能会发生什么,但一个疯狂的猜测是,某些事情正在触及争用点并且正在旋转(而不是等待)。

您是否有机会增加前端服务器中后端服务器允许的HTTP连接数?你可以做through the config file。我在WCF客户端看到的一个常见问题是,限制保留为默认值2,严重限制了客户端代理级别的并发性。

答案 1 :(得分:2)

您是否考虑并测试了外部因素的可能性?

  • 流程回收?
  • 是否启用了动态压缩?