【发布时间】:2010-01-26 01:20:13
【问题描述】:
我有一个难以解释的麻烦问题。简而言之,我的网络场中的网络服务器上的 CPU 使用率高得令人费解。
我有大量用户访问两个前端 Web 服务器。 99% 的页面加载是 Ajax 请求,并提供一个简单的 JSON 序列化对象,Web 服务器使用 WCF 从后端检索该对象。在典型情况下(同样,可能是 99% 的请求),ASPX 页面所做的所有事情都是进行 WCF 调用以获取此数据,将其序列化为 JSON 字符串并返回。
对象非常小——一个 guid、几个短字符串、几个整数。
非典型情况是初始页面加载,它执行相同的操作(WCF 请求),但使用 asp:literals 将响应注入到页面的不同部分。
所有三台机器(2 个 Web 服务器,一个后端)都具有相同的硬件规格。我希望后端在这种情况下完成大部分工作,因为它管理所有数据、进行查找等。但是:后端的负载远小于前端。后端是一个不错的 10-20% 的 CPU 负载。前端平均运行 30%,但它们遍布整个地图,有时会在 10 秒内达到 100% 的峰值,并且需要 600 毫秒来处理这些非常简单的页面。
当我在分析器 (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% 或更少。内存使用、句柄等,似乎都是合理的。
再增加一个问题:当我记录在后端为这些调用提供服务所需的时间时,我得到的时间始终少于 15 毫秒(每分钟可能有一两个峰值到 30 毫秒)。在前端,这些调用最多可能需要 1 秒才能返回。我想这可能是因为 CPU 问题,但在我看来。
那么...有没有人知道在哪里看这种东西?我要探索的东西不多了。
澄清:WCF 服务托管在 Windows 服务中,并且正在使用 netTcp 绑定。另外,我将客户端上的 maxConnections 设置为 128,FWIW。
【问题讨论】:
-
@Moxen:有没有弄清楚问题出在哪里?
-
我们也在 Windows 服务中托管了一个 NetTCP WCF 服务,在迁移到 .NET 4 后突然出现这种行为。您有任何更新吗?我们正在考虑转向基于 IIS/ASP.NET,但我不相信它会解决问题。