IIS 8.5单人工作进程vs Web花园性能

问题描述:

我有一个简单的ASP.NET应用程序,它只是用ImageResizer调整图像的大小,并且什么也不做。出于测试目的,我禁用了磁盘缓存,因此图像在每个请求上都调整大小。IIS 8.5单人工作进程vs Web花园性能

当我测试应用程序的性能与JMeter的,我得到以下的平均响应时间:

  • 单一的工作进程,1个并发客户端:〜200ms的
  • 单一的工作进程,10个并发客户端:〜1200ms
  • 4个工作进程,10个并发客户端:〜300ms的

正如你可以看到,当我运行一个工作进程和10个并发客户端,响应时间增加博士尽管有可用的硬件资源,但仍然具有一定的性能:性能测试期间的CPU使用率约为30%,内存使用量约为150MB。

正如所讨论的here

Web园是专为一个单一的原因 - 提供应用 不在CPU绑定的,但执行长时间运行的请求,规模和用不完中所有可用的线程的能力 工作进程。

这不是我的情况。

所以,我不明白为什么我会得到这样的结果。我期望的是,即使是单一的工作人员流程,也能提供可接受的响应时间,直到达到资源限制。而10个并发客户肯定不是一个沉重的负载。有人可以向我解释,我错在哪里?

我的配置:

  • 的Windows Server 2012 R2
  • IIS 8.5默认的设置(除MaxWorkerThreads)
  • 四核酷睿i3 3.4GHz的CPU
  • 16 GB RAM

我的应用程序只是空的ASP.NET MVC应用程序与ImageResizer,添加在this instruction(选项3 - 手动I安装)并且在Web.config中禁用了DiskCache插件

+1

只需根据您提供的,并且无需了解任何ImageResizer这些数字,它看起来像ImageResizer运行在一个单一的THR调整操作ead,也许是STA?如果它基于不支持多线程的COM组件,则这种(推测)可能是这种情况。 – Ben

由于@ Ben的评论,我找到了答案。

问题是ImageResizer基于GDI +(如在it's site上所述),其中包含锁(请参阅thisthis帖子以了解详细信息)。这就是为什么它在单一过程中如此缓慢的原因。

找到问题原因后我试了this solution。从ASP.NET应用程序引用WPF程序集可能不是一个好主意,但可以用于测试目的。

现在,我得到下面的结果,当我执行相同的性能测试中的问题:

  • 单一的工作进程,1个并发客户端:〜90个毫秒
  • 单一的工作进程,10个并发客户端:〜120毫秒
  • 单个工作过程中,40个并发的客户端:〜190ms
  • 单个工作过程中,60级并发的客户端:〜400个毫秒
  • 单个工作过程中,80级并发的客户端:〜630ms

正如你可以看到,现在应用程序的工作要快得多。同样,它在高负载下利用几乎所有可用的CPU资源,正如我最初所预期的那样。

所以,如果你在你的ASP.NET应用程序中处理图像:

  • 不使用GDI +基础的解决方案,如果你能
  • ,如果你必须使用GDI +,增加广告应用程式MaxWorkerProcesses池的设置