Приложение IIS 7.5 на производстве работает НАМНОГО медленнее, чем при работе в CASSINI (VS 2010)

У меня есть приложение (MVC3 + EF5), работающее на веб-сервере IIS 7.5. Это 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 мс. Так что это говорит мне, что это не база данных. Предыдущий опыт с производственным приложением также предполагает это. Например, при выравнивании запаса я вызываю одну хранимую процедуру, и профилировщик говорит, что она выполняется за 23 мс, но здесь это занимает почти секунду (между выравниванием запаса и 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 – --------------------------------------------

Теперь я был бы счастлив с этими числами. Даже когда отладчик подключен, разработка происходит быстрее. Еще одна вещь, которая подтверждает, что база данных не является виновником, это когда я проверяю продолжительность процедуры SQL, которую рабочая БД разжевывала в течение 23 мс, с помощью профилировщика AnjLab. Это делается за 169 мс SQL Server Express!

Я также настроил тестовую среду, с нуля, 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 раза медленнее в производстве, чем в разработке. Другие просто возятся с объектами в памяти.

С Уважением,

0 ответов

Другие вопросы по тегам