0

У меня есть crawlerbot, который загружает различные страницы параллельно, используя parallel.for и parallel.foreach. MaxDegreeOfParallelism настроен примерно на 20, поскольку увеличение его, похоже, не улучшает производительность, и я не хочу перегружать любые веб-серверы.Консольное приложение медленнее, чем приложение asp.net

Когда я запускаю сканирование с веб-сайта ASP.NET (из всех мест), он работает с приемлемой производительностью, и все это занимает несколько часов. Из-за проблем с дизайном этой настройки я меняю это, поэтому я могу запустить его с консоли.

Весь код, в котором я нуждаюсь, находится в dll, к которому можно получить доступ как на веб-сайте, так и на консольном приложении.

Нет вывода на консоль, за исключением сообщения о запуске.

Проблема в том, что когда я запускаю ее с консоли (или от отладчика), она занимает примерно в 10 раз больше (!), Чем при запуске ее с веб-сайта ASP.NET. Мне было бы легче понять, будет ли версия ASP.NET медленнее, чем консоль.

Почему это так или как я могу отладить это или выяснить, почему это так или исправить проблему?

Редактировать: Это также случается при попытке обоих вариантов через отладчик визуальной студии. Выход в окно «Выход» из «Отладки» похож на:

Поток '' (0x1d34) вышел с кодом 0 (0x0). Поток '' (0xf20) вышел с кодом 0 (0x0). Поток '' (0x3414) вышел с кодом 0 (0x0). Поток '' (0x35c8) вышел с кодом 0 (0x0). Поток '' (0xdc) вышел с кодом 0 (0x0). Поток '' (0x1c98) вышел с кодом 0 (0x0). Поток '' (0x3308) вышел с кодом 0 (0x0). Поток '' (0x2b00) вышел с кодом 0 (0x0). Поток '' (0x2f7c) вышел с кодом 0 (0x0). Поток '' (0x345c) вышел с кодом 0 (0x0). Поток '' (0x2a18) вышел с кодом 0 (0x0). Поток '' (0x138) вышел с кодом 0 (0x0). Поток '' (0x3650) вышел с кодом 0 (0x0). Поток '' (0x376c) вышел с кодом 0 (0x0).

за исключением того, что в случае ASP.NET этот текст написан примерно в 10 раз быстрее.

Возможно, также стоит отметить, что dll вызывает 7zip через COM для каждой загруженной страницы, чтобы сжать его.

+0

Вы используете код на одном и том же оборудовании в обоих случаях? – Joni

+0

Да, все это работает на моей машине разработки. – tomsv

+2

Загружает ли он много страниц с того же сервера? Каковы значения ['ServicePointManager.DefaultConnectionLimit'] (http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx) и [' ServicePointManager.MaxServicePoints'] (http: //msdn.microsoft.com/en-us/library/system.net.servicepointmanager.maxservicepoints.aspx) в обеих средах? Вы пытались выяснить, где именно происходит замедление? – svick

ответ

2

Если вы загружаете большое количество страниц с того же сервера, вы столкнетесь с лимитом, установленным ServicePointManager.DefaultConnectionLimit. Значение по умолчанию обычно равно 2 (as suggested by the HTTP 1.1 RFC), но, похоже, это 10 для приложений ASP.NET. Если вы видите другой номер, скорее всего, что-то изменило значение по умолчанию.

Когда вы достигнете этого предела, инфраструктура не будет устанавливать никаких дополнительных соединений с этим конкретным сервером (или «конечной точкой»), поэтому большинство ваших потоков блокируют выполнение ничего.

Вы можете исправить это, изменив значение DefaultConnectionLimit, но лучшим решением может быть изменение порядка ваших запросов, чтобы вы не выполняли много одновременных запросов на один и тот же сервер.

Смежные вопросы