IIS 7.5生产中的应用程序比在CASSINI中运行时要慢得多(VS 2010)

时间:2013-06-22 16:14:26

标签: c# asp.net iis cassini

我在生产中的IIS 7.5 Web服务器上启动并运行了一个应用程序(MVC3 + EF5)。它是Windows Server 2008 + SQL SERVER 2008 R2。

现在,大多数情况下,生产应用程序的速度明显快于我在Visual Studio中运行它(提供页面,获取数据等)。

但不是在这种特殊情况下。这是应用程序中最重要的部分,所以它经常发生。我会尽力解释情况。

我需要“发布”一份文件(发票,库存,财务文件,工资等......)。这涉及解析存储在数据库中的一些表达式,使用LINQ Expressions / lambdas编译它们并执行它们。有些表达式是微不足道的,比如从一个对象获取属性,然后设置不同的属性,有些表达式就像对数据库运行查询一样复杂。每个文档位置有20到30个表达式(或行项目,我不太清楚英语单词)。

我用于测试目的的文件相当大(库存 - 144个文件位置,因此在发布期间大约有3500个计算)。它需要很长时间才能完成。这是来自生产应用程序的日志,使用log4net:

PRODUCTION: IIS 7.5 + SERVER 2008 R2 64-bit + SQL SERVER 2008 R2 Enterprise (XEON 3GHz, 4GB)
1 minute 30 seconds alltogether, calculations 1 minute 24 seconds 

DEBUG2013-06-22 XX:XX:XX.XXX – --------------------------------------------
DEBUG2013-06-22 03:59:37.823 – Posting: 4374##M09##1
DEBUG2013-06-22 04:01:01.299 – Financial statements
DEBUG2013-06-22 04:01:02.734 – Stock
DEBUG2013-06-22 04:01:04.981 – SAVE
DEBUG2013-06-22 04:01:05.698 – Stock Leveling
DEBUG2013-06-22 04:01:06.572 – SAVE
DEBUG2013-06-22 04:01:07.196 – --------------------------------------------

我已经在生产服务器上发布了(使用SQL Server Profiler)过程,我发现没有问题,实际上,请求的时间都不超过50毫秒。所以它告诉我它不是数据库。之前的生产应用程序经验也表明了这一点例如,在内部库存调平中,我调用一个存储过程,并且分析器表示它在23ms内完成,但这需要将近一秒钟(在Stock Leveling和SAVE之间)。

现在这里是我的发展环境中的数字:

DEVELOPMENT (WITH VS DEBUGGER ATTACHED): CASSINI + WINDOWS 7 64-bit + SQL EXPRESS 2008 R2 (i5, 6GB)
54 seconds alltogether, calculations 41 seconds 

DEBUG2013-06-22 XX:XX:XX.XXX – --------------------------------------------
DEBUG2013-06-22 04:46:36.662 – Posting: 4374##M09##1
DEBUG2013-06-22 04:46:37.379 – Compiled!
DEBUG2013-06-22 04:47:18.745 – Financial statements
DEBUG2013-06-22 04:47:20.399 – Stock
DEBUG2013-06-22 04:47:24.923 – SAVE
DEBUG2013-06-22 04:47:26.779 – Stock Leveling
DEBUG2013-06-22 04:47:28.682 – SAVE
DEBUG2013-06-22 04:47:30.492 – --------------------------------------------


DEVELOPMENT (NO VS DEBUGGER ATTACHED): CASSINI + WINDOWS 7 64-bit + SQL EXPRESS 2008 R2 (i5, 6GB)
14 seconds alltogether, calculations 12 seconds 

DEBUG2013-06-22 XX:XX:XX.XXX – --------------------------------------------
DEBUG2013-06-22 04:59:42.003 – Posting: 4374##M09##1
DEBUG2013-06-22 04:59:53.984 – Financial statements
DEBUG2013-06-22 04:59:55.232 – Stock
DEBUG2013-06-22 04:59:55.981 – SAVE
DEBUG2013-06-22 04:59:56.183 – Stock Leveling
DEBUG2013-06-22 04:59:56.464 – SAVE
DEBUG2013-06-22 04:59:56.667 – --------------------------------------------

现在,我很高兴看到这些数字。即使附加了调试器,开发也会更快。确认数据库不是罪魁祸首的另一件事是,当我使用AnjLab分析器检查生产数据库咀嚼23ms的SQL过程的持续时间时。它是由SQL Server Express在169毫秒内完成的!

我还设置了测试环境,从头开始,Windows 7 64位+ IIS 7.5附带它,这里有数字:

TEST ENVIRONMENT: IIS 7.5 + WINDOWS 7 + SQL EXPRESS 2008 R2 (Pentium E5400, 1GB)
1 minute 57 seconds alltogether, calculations 1 minute 24 seconds 

DEBUG2013-06-22 XX:XX:XX.XXX – --------------------------------------------
DEBUG2013-06-22 04:38:41.021 – Posting: 4374##M09##1
DEBUG2013-06-22 04:38:41.458 – Compiled!
DEBUG2013-06-22 04:40:28.867 – Financial statements
DEBUG2013-06-22 04:40:31.503 – Stock
DEBUG2013-06-22 04:40:34.966 – SAVE
DEBUG2013-06-22 04:40:36.292 – Stock Leveling
DEBUG2013-06-22 04:40:38.180 – SAVE
DEBUG2013-06-22 04:40:39.178 – --------------------------------------------

所以一切都指向IIS,但我甚至不知道从哪里开始。显然,它可以在14秒内完成。生产硬件能够做得更好我猜,SQL EXPRESS只使用一个核心等。

只有我为IIS更改的设置增加是为了将运行我的应用程序的应用程序池的空闲超时从20分钟增加到60分钟。

我读到某个地方,我支持启用32位应用程序,但是当我尝试使用Crystal Reports时,我的应用程序崩溃了。

我知道这是非常具体的,我可能只会通过反复试验来解决这个问题,但任何帮助或方向都会非常感激。

更新:

这里有一点点粒度(仅一个文档位置): 从生产:

DEBUG2013-06-22 07:21:19.157 – item: 48984-------------------------------------------
DEBUG2013-06-22 07:21:19.157 – 0.00 - Quant * StockPrice
DEBUG2013-06-22 07:21:19.157 – statement[GOODS] * Tax / (100.00 + Tax)
DEBUG2013-06-22 07:21:19.157 – statement[GOODS] * Tax / (100.00 + Tax)
DEBUG2013-06-22 07:21:19.157 – statement[GOODS] * GK(1349,P,D) / GK(1340,D,D)
DEBUG2013-06-22 07:21:19.235 – Quant * StockPrice + statement[CalcTax1] + stavka[CalcTax2] + statement[Proffit]

来自发展:

DEBUG2013-06-22 06:58:53.810 – item: 48984-------------------------------------------
DEBUG2013-06-22 06:58:53.810 – 0.00 - Quant * StockPrice
DEBUG2013-06-22 06:58:53.810 – statement[GOODS] * Tax / (100.00 + Tax)
DEBUG2013-06-22 06:58:53.810 – statement[GOODS] * Tax / (100.00 + Tax)
DEBUG2013-06-22 06:58:53.810 – statement[GOODS] * GK(1349,P,D) / GK(1340,D,D)
DEBUG2013-06-22 06:58:53.840 – Quant * StockPrice + statement[CalcTax1] + stavka[CalcTax2] + statement[Proffit]

GK()是对数据库的调用。生产速度比开发慢3倍。其他人只是摆弄内存中的对象。

此致

0 个答案:

没有答案