我在生产中的 IIS 7.5 Web 服务器上启动并运行了一个应用程序(MVC3 + EF5)。它是 Windows Server 2008 + SQL SERVER 2008 R2。
现在,大多数时候,生产应用程序比我在 Visual Studio 中运行它时(提供页面、获取数据等)要快得多。
但不是在这种特殊情况下。这是应用程序中最重要的部分,所以它经常发生。我会尽力解释情况。
我需要“发布”一份文件(发票、库存、财务文件、工资等……)。这涉及解析存储在数据库中的一些表达式,使用 LINQ 表达式/lambda 编译它们,然后执行它们。有些表达式很简单,比如从一个对象中获取一个属性,然后设置不同的属性,有些表达式很复杂,比如对数据库运行查询。每个文档位置(或行项目,我不知道足够好的英语单词)有 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 毫秒。所以它告诉我它不是数据库。以前使用生产应用程序的经验也表明了这一点。例如,在 Stock Leveling 内部,我调用了一个存储过程,分析器说它在 23 毫秒内完成,但这里需要将近一秒钟(在 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 分析器检查生产数据库咀嚼 23 毫秒的 SQL 过程的持续时间时。SQL Server Express 在 169 毫秒内完成!
我还设置了测试环境,从头开始,Windows 7 64-bit + 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 倍。其他人只是摆弄内存中的对象。
问候,