我在服务器( Windows Server2008 x64上的IIS7,处理器为Xeon Quad)上遇到过我的ASP.Net应用程序的奇怪行为。
web应用程序是一个简单的页面,大约一秒钟计算一些数学,然后显示结果。也就是说,它几乎不消耗网络、磁盘、内存,而是完全占用处理器资源。
在负载测试中会出现以下现象: IIS7对处理器的使用率不超过25%,并且不是因为世界不希望更多地使用它。这25%等同于一个核心,但根据任务管理器性能选项卡分布在所有四个核心上。在另一台计算机(IIS7,Win 7,Quad)上,所有的工作都应该正常:处理器的利用率都是100%。
对于每种行为变体(在4核处理器上的峰值负载分别为25%和100% ),我在2台计算机上找到了。类似的情况在here中有描述。是什么导致了这样的行为?
发布于 2010-11-08 11:04:54
这25%相当于一个核心,但根据任务管理器性能选项卡分布在所有四个核心上。
现实检验:当你用完一个核心时,中央处理器调度器将在2008 R2之前在核心之间移动负载。从2008年的R2开始,它将保持在一个核心上,实际上将其他核心移动到深度睡眠中。
因此,您所看到的基本上是一个使用一个CPU核心的应用程序。点。
是什么导致了这种行为?
无论是您的代码,还是您的请求生成(以及您的代码),都要确保请求是序列化的,而不是并行处理的。
在负载测试期间...您是否接受/保留会话cookie (如: ONE),并且在asp.net页面中是否启用了会话状态?这会将所有页面请求序列化到内存中的一个会话,这很可能是罪魁祸首。另一种是在代码中做“愚蠢”的事情,结果是块中的结果,使算法有效地单线程-但这是无法评估的,如果你没有更多的信息,你如何编程和你有效地做了什么。例如,我曾经见过一群猴子使用应用程序对象中保存的一个数据库连接(为了不使数据库过载)编写在线商店代码,并使用那里的lock / unlock方法有效地将他们的asp应用程序转换为单线程的东西。这是显而易见的--但是还有很多其他的事情可能会出错。这些问题基本上是:
IIS本身通过工作项(即使用大量线程)来应答请求,除非它必须序列化它们(会话一次只分配给一个线程,因此对同一会话的第二个请求是序列化的)。
发布于 2010-11-08 10:57:36
我怀疑它是不是扩散开了。更有可能的是,算法没有并行化,因此代码在单个内核中运行。
发布于 2010-11-09 07:54:09
据我所知,在那两台100%加载的计算机上,已经安装了32位Windows。在相同的两台计算机上,峰值负载为25% - 64位。但自定义更改“启用32位应用程序”=true并没有帮助。
https://stackoverflow.com/questions/4123167
复制