Мой вопрос о производительности простого тестового веб-сайта.Плохая производительность простого webservice
Для тестирования производительности я использую jMeter, который моделирует 75 пользователей на этой странице (непрерывно). Страница только выполняет вызов webservice в GetHello() и печатает результат.
Метод вебсервис не делать:
public string GetHello(){
int count = 0;
foreach(int i = 0; i < 10000000; i++){
count++;
}
return "hello world "+ count;
}
Но в результатах я вижу, среднее время загрузки становится все выше и выше ..., что не кажется мне логичным. Я не знаю, где искать эту проблему.
Сервер для веб-сайта (2 четырехъядерных процессора памяти 2,33 ГГц, память 8 ГБ) не занят, сервер для веб-службы (такой же аппаратной настройки, как сервер веб-сайта) не занят, но использование ЦП между 60% и 100% ...
То, что я думаю о проблемах с установкой IIS или конфигурации web.config (для веб-сайта или веб-службы) Но я не могу найти решение для этого ... или объяснение, почему это происходит. Этот простой код никогда не должен быть проблемой в моих глазах?
Обновление: Когда я удаляю цикл из веб-службы ... нет проблем, как кажется. Поэтому, как только в методе webservice требуется небольшой расчет, среднее время обработки увеличивается.
Update 2
Дело низкая производительность
Мы бежим в вопросах производительности с нашего сайта. Мы установили тестовую среду, чтобы определить, где возникают проблемы. Тестовая среда состоит из 3 серверов. (2 для front-end (веб-сайт) en 1 для внутренних (wcf webservices)). В спецификации серверов:
- Сайт 1: Intel Xeon E5410 (2x) 8GB баран
- Сайт 2: Intel Xeon x3323 4 Гб оперативной памяти
- Webservice: Intel Xeon E5410 (2x) 8GB баран
в WebServices используют net.Tcp оконечные с Jmeter мы посылаем 75 одновременных запрос на 1 странице на сайте 1. в продолжают расти временем реакции около 5 сек, а затем выравниваются. Когда мы переходим на сайт 1 с браузером, веб-сайт имеет высокое время отклика. Когда мы идем на сайт 2, на той же странице, сайт быстро. С netstat -t мы можем видеть, что на веб-сайте 1 всего около 30 подключений к веб-сервису. Связывание конечных точек в сети.конфигурации на сайте выглядит следующим образом:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<bindings>
<netTcpBinding>
<binding name="netTCPBinding" maxReceivedMessageSize="999999999" sendTimeout="00:03:00" closeTimeout="00:03:00" receiveTimeout="00:03:00" maxConnections="65355">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.1.124:21130/ContentService.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" contract="ContentWS.IContentService" name="Default1">
</endpoint>
<endpoint address="net.tcp://192.168.1.124:21131/Service.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" contract="PrijsvrijWS.IService" name="Default">
</endpoint>
</client>
</system.serviceModel>
Это конфиг из WebService:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="netTCPBinding" maxReceivedMessageSize="999999999" sendTimeout="00:03:00" closeTimeout="00:03:00" receiveTimeout="00:03:00" maxConnections="65355">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ajaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="serviceWithMetadata">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
<services>
<service behaviorConfiguration="serviceWithMetadata" name="WcfService.Service">
<endpoint address="net.tcp://localhost:21131/Service.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" name="Default" contract="WcfService.IService" />
</service>
<service behaviorConfiguration="serviceWithMetadata" name="WcfService.ContentService">
<endpoint address="net.tcp://localhost:21130/ContentService.svc" binding="netTcpBinding" bindingConfiguration="netTCPBinding" name="Default" contract="WcfService.IContentService" />
</service>
</services>
</system.serviceModel>
Мы пытались servicethrottling, но это, кажется, не имеют эффекта. Во время использования теста CPU на серверах выглядит следующим образом:
- Сайт 1: около 60%, с максимальной 90%
- Сайт 2: 1%
- веб-сервиса: около 25%, при этом не более 50 %
Мы работаем с максимальным количеством веб-сайта 1 или нам не хватает некоторых настроек?
Я думаю, что «угадать», где проблема, является упражнением в бесполезности. Вам нужно сделать такой инструмент, как «Ants Profiler» и запустить его с обеих сторон, и посмотреть, есть ли проблема с горячими путями в коде или, возможно, утечками памяти. Если нет, вы можете начать думать о IIS. Сначала я бы посмотрел на ваш собственный код. Вы можете получить 14-дневную версию трейла, чтобы заставить вас прокатиться. Только мои два цента. –
Я соглашаюсь сначала взглянуть на свой собственный код ... но кода почти нет. Вебсервис - это то, что вы видите в моем сообщении, и веб-сайт вызывает только этот веб-сервис. – BvdVen
Уверен, но это ** Операция вычисления с вычислением **, что означает, что она свяжет поток до завершения операции. Все остальные запросы просто сидят и ждут, когда CPU освободится, чтобы обслуживать их запрос. – Josh