2010-01-26 60 views
4

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

+0

@Moxen:找出问题所在? – LBushkin 2010-04-23 19:38:57

+0

我们也有一个NetTCP WCF服务托管在Windows服务中,这种行为在移到.NET后突然显示出来4 您有任何更新吗?我们正在考虑转向基于IIS/ASP.NET,但我不相信它会解决这个问题。 – Jaans 2013-02-13 03:45:33

回答

5

很难说可能会发生什么,但一个疯狂的猜测是某件事正在引发一个争用点和它的旋转(而不是等待)。

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

+0

对 - 我有这样的印象:它正在忙着等待什么,但我无法弄清楚什么。看起来,如果需要的话,它仍然有空间建立更多的服务连接。 稍微详细一点 - WCF服务作为Windows服务托管,而不是IIS的一部分。我有maxConnections设置为128绑定(顺便说一句,是netTcp)。 – Moxen 2010-01-26 02:05:05

+0

这两件事情都没有关系。我所描述的问题与服务器无关(我同意你在那里做了正确的更改),但是在*客户端*上。 默认情况下(这是HTTP规范建议的),HttpWebRequest(WCF在内部使用)一次将连接到单个远程服务器的连接限制为2个并发HTTP连接。这意味着无论您的服务器设置如何,您的客户端可能会遇到争用。 – tomasr 2010-01-26 03:13:57

+0

HttpWebRequest连接限制是否会影响netTcp绑定?我不认为这是发生的,因为我确实看到两台机器之间的数十个开放连接。在压力测试中,连接从零开始并最终工作。而套接字(根据netstat)绝对处于'ESTABLISHED'状态。 – Moxen 2010-01-26 15:52:14

2

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

  • 过程回收?
  • 是否启用动态压缩?
+0

我想到的第一件事就是过程回收。 – Cheeso 2010-01-26 01:44:29

+0

这些机器除了Web服务器上的ASP.NET和后端上的一个WCF Windows服务之外,没有其他任何其他服务器在其上运行。 “ASP.NET v2.0.50727 /应用程序重新启动”计数器不显示任何重新启动正在进行。并且应用程序池未设置为在X请求后自动重新启动。 – Moxen 2010-01-26 02:12:34