1

我在服务器上遇到了我的 ASP.Net 应用程序的奇怪行为(Windows Server 2008 x64 上的 IIS7,处理器 Xeon Quad)。

Web应用程序是一个简单的页面,大约一秒钟计算一些数学,然后显示结果。那就是它几乎不消耗网络、磁盘、内存,而是完全使用处理器资源。

在负载测试时出现以下现象: IIS7 使用处理器不超过 25% 并且并非全世界都不想使用它。这 25% 等于一个核心,但根据任务管理器性能选项卡分布在所有四个核心上。在另一台计算机(IIS7、Win 7、Quad)上一切正常:处理器全部使用 100%。

对于每个行为变体(4 个核心处理器上的 25% 和 100% 的峰值负载),我在 2 台计算机上找到了。这里描述了类似的情况。什么会导致这种行为?

4

5 回答 5

2

这 25% 等于一个核心,但根据任务管理器性能选项卡分布在所有四个核心上。

现实检查:当你用完一个内核时,CPU 调度程序将在 2008 R2 之前的内核之间移动负载。从 2008 R2 开始,它将保持在一个核心上,以实际将其他核心移入深度睡眠。

所以,你看到的基本上是一个使用一个 CPU 内核的应用程序。观点。

什么会导致这种行为?

您的代码或您的请求生成(以及您的代码)确保请求是序列化的而不是并行处理的。

在负载测试期间...您是否接受/保留会话 cookie(例如:ONE)并且在您的 asp.net 页面中是否启用了会话状态?这会将所有页面请求序列化到内存中的一个会话,并且很可能是罪魁祸首。另一个是在代码中做“愚蠢”的事情,结果在一个块中,并使算法有效地单线程 - 但是如果没有更多关于你如何编程和你有效地做什么的信息,这是无法评估的。例如,我曾经见过一群猴子使用保存在应用程序对象中的一个数据库连接(以不使数据库过载)编写在线商店,并使用那里的锁定/解锁方法有效地将他们的 asp 应用程序转换为单线程事物。这很明显——但还有很多其他的事情可能会出错。

  • 您是否通过配置/测试场景来强制 IIS 序列化(这将在网络农场设置或会话状态的错误使用中)?
  • 您是否在页面中执行任何有效地将它们锁定为单线程的操作?

IIS 本身通过工作项(即使用大量线程)回答请求,除非它 HA 对它们进行序列化(会话一次只分配给一个线程,因此对同一会话的第二个请求被序列化)。

于 2010-11-08T11:04:54.117 回答
0

安装较新的操作系统后问题已解决。“ Windows Server 2008 Enterprise SP1 (c) 2009 ”而不是“ Windows Server 2008 Standard SP2 (c) 2007 ”。

于 2011-04-15T08:07:25.010 回答
0

如果您的服务器正在使用多个工作进程,并且您确定负载测试软件正在并行发出请求,那么您的应用程序中的某些内容可能会变成串行的。

这实际上很常见(我们为客户做了很多负载测试)——它可以像大小为 1 的数据库池一样简单,也可以像某些共享资源被锁定在应用程序深处或内部的某个级别一样复杂应用程序正在使用的库。我们已经看到服务应用程序页面的第一步打开了一个事务,该事务在页面完成之前未提交。如果该事务正在锁定每个其他页面出于相同目的而需要的表,则一次只能处理一个页面请求。

祝你好运找到问题 - 一定要让我们知道你发现了什么!

于 2010-11-10T13:34:17.060 回答
0

我了解到,在这 2 台负载为 100% 的计算机上,已经安装了 32 位 Windows。在相同的 2 台计算机上,峰值负载为 25% - 64 位。但是自定义更改“启用 32 位应用程序”=true 并没有帮助。

于 2010-11-09T07:54:09.093 回答
0

我怀疑它已经传播开来了。该算法更有可能没有并行化,因此代码在单核中运行。

于 2010-11-08T10:57:36.207 回答