У меня есть приложение ASP.NET 4.0, работающее поверх IIS 7.5 на 64-битной машине Windows Server 2008 R2 Enterprise с огромным количеством ОЗУ, ЦП, диска и т. Д.
С каждым веб-запросом приложение ASP.NET подключается к серверной веб-службе (через необработанные сокеты), которая работает на том же компьютере.
Проблема: похоже, что-то ограничивает количество одновременных подключений к серверной веб-службе. Подозрительно, но количество одновременных подключений достигает 16.
Я нашел эту ключевую статью от Microsoft, в которой объясняется, как настроить параметры IIS для размещения приложений ASP.NET, которые делают множество запросов веб-служб: http://support.microsoft.com/?id=821268#tocHeadRef
Я следил за рекомендациями статьи, но все равно не повезло. Настройка, которая особенно интересна, - это maxconnection
настройка, которую я даже повысил до 999.
Есть идеи, что еще может дросселировать соединения?
Примечание. Когда я исключил IIS из смеси и заставил клиентов подключаться напрямую к серверной веб-службе, она с радостью откроет столько соединений, сколько мне нужно, поэтому я уверен, что серверная часть не является узким местом. Это должно быть что-то в области IIS / ASP.NET.
Вот соответствующий раздел, machine.config
который, я уверен, читается приложением (проверено appcmd.exe
):
<system.web>
<processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" />
<httpRuntime minFreeThreads="176" minLocalRequestFreeThreads="152"/>
<httpHandlers />
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</profile>
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add name="AspNetWindowsTokenRoleProvider" applicationName="/"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
</system.web>
<system.net>
<connectionManagement>
<add address="*" maxconnection="999"/>
</connectionManagement>
</system.net>
источник
Ответы:
Большинство ответов, представленных здесь, относятся к количеству входящих запросов к вашей серверной веб-службе, а не к количеству исходящих запросов, которые вы можете сделать из своего приложения ASP.net в свою внутреннюю службу.
Здесь не ваш серверный веб-сервис регулирует частоту запросов, а количество открытых соединений, которые ваше вызывающее приложение желает установить с той же конечной точкой (с тем же URL).
Вы можете снять это ограничение, добавив следующий раздел конфигурации в файл machine.config:
<configuration> <system.net> <connectionManagement> <add address="*" maxconnection="65535"/> </connectionManagement> </system.net> </configuration>
Вы, конечно, можете выбрать более разумное число, если хотите, например, 50 или 100 одновременных подключений. Но приведенное выше откроет его вплоть до макс. Вы также можете указать конкретный адрес для правила ограничения открытия, указанного выше, вместо символа «*», обозначающего все адреса.
Документация MSDN для System.Net.connectionManagement
Еще один отличный ресурс для понимания ConnectManagement в .NET
Надеюсь, это решит вашу проблему!
РЕДАКТИРОВАТЬ: Ой, я вижу, что у вас есть управление подключением, упомянутое в вашем коде выше. Я оставлю приведенную выше информацию, поскольку она актуальна для будущих тех, кто столкнется с той же проблемой. Однако обратите внимание, что в настоящее время на большинстве современных серверов есть 4 разных файла machine.config!
Существует .NET Framework v2, работающий как под 32-битной, так и с 64-битной версиями, а также .NET Framework v4, также работающий как под 32-битной, так и с 64-битной версиями. В зависимости от выбранных вами настроек для пула приложений вы можете использовать любой из этих 4 разных файлов machine.config! Пожалуйста, проверьте все 4 файла machine.config, которые обычно находятся здесь:
источник
machine.config
(64-битный 4.0).Я понимаю, что вопрос может быть довольно старым, но вы говорите, что серверная часть работает на том же сервере. Это означает, что на другом порту, возможно, отличном от порта по умолчанию 80.
Я читал, что когда вы используете элемент конфигурации «connectionManagement», вам необходимо указать номер порта, если он отличается от 80 по умолчанию.
ССЫЛКА: параметр maxConnection может не работать даже autoConfig = false в ASP.NET
Во-вторых, если вы решите использовать конфигурацию по умолчанию (address = "*"), расширенную вашим собственным значением, специфичным для серверной части, вы можете подумать о том, чтобы сначала указать конкретное значение! В противном случае, если сделан запрос, сначала будет совпадать *, а по умолчанию - 2 соединения. Как и при использовании раздела в web.config.
ССЫЛКА: <remove> Элемент управления подключением (Настройки сети)
Надеюсь, это кому-то поможет.
источник
Возможно ли, что вы используете ссылку на веб-службу на основе WCF? По умолчанию ServiceThrottlingBehavior.MaxConcurrentCalls - 16.
Вы можете попробовать обновить
<serviceThrottling>
элемент поведения ссылки на службу<serviceThrottling maxConcurrentCalls="999" maxConcurrentSessions="999" maxConcurrentInstances="999" />
(Обратите внимание, что я бы рекомендовал указанные выше параметры.) См. MSDN для получения дополнительной информации о том, как настроить соответствующий
<behavior>
элемент.источник
TcpClient
(служба продает пользовательские двоичные BLOB-объекты, а не WCF / SOAP или аналогичные). Эти параметры конфигурации , кажется , быть чисто воздействуя вас , если вы используетеServiceHost
, неTcpClient
; я что-то упускаю?Вы пытались программно установить значение статического свойства DefaultConnectionLimit ?
Вот хороший источник информации об этой настоящей головной боли ... Использование потоков ASP.NET в IIS 7.5, IIS 7.0 и IIS 6.0 с обновлениями для framework 4.0.
источник
См. Раздел «Потоки» на этой странице: http://msdn.microsoft.com/en-us/library/ff647786.aspx вместе с разделом «Подключения».
Вы пробовали поднять атрибут maxconnection в настройке processModel?
источник
maxconnection
атрибут не применяется к вызовам локальных веб-служб. В этом конкретном случае веб-служба является локальной, но у нас есть та же проблема в другой среде, где служба не является локальной.minLocalRequestFreeThreads
- этот рабочий процесс использует этот параметр для постановки в очередь запросов от localhost (где веб-приложение вызывает веб-службу на том же сервере ), если количество доступных потоков в пуле потоков падает ниже этого числа. Этот параметр аналогичен minFreeThreads, но применяется только к запросам, использующим localhost .minLocalRequestFreeThreads
(см. Мойmachine.config
в вопросе.Если он не определен в веб-службе, приложении или сервере (apache или IIS), на котором размещается расходный материал веб-службы, вы можете создавать бесконечные соединения до сбоя.
источник
при тестировании производительности я использую показатель RPS, то есть количество запросов в секунду, которые может обслужить сервер с приемлемой задержкой.
теоретически один сервер может выполнять одновременно столько запросов, сколько ядер на нем.
Не похоже, что проблема заключается в потоковой модели ASP.net, поскольку она потенциально может обслуживать тысячи запросов в секунду. Похоже, проблема в вашем приложении. Вы используете какие-нибудь примитивы синхронизации?
также какая задержка в ваших веб-сервисах, они очень быстро реагируют (в течение микросекунд), если нет, то вы можете рассмотреть асинхронные вызовы, чтобы вы не блокировали
Если это что-то не дает, вы можете профилировать свой код с помощью Visual Studio или профилировщика Redgate.
источник