2014-02-03 3 views
1

Мой вопрос о производительности простого тестового веб-сайта.Плохая производительность простого 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 или нам не хватает некоторых настроек?

+1

Я думаю, что «угадать», где проблема, является упражнением в бесполезности. Вам нужно сделать такой инструмент, как «Ants Profiler» и запустить его с обеих сторон, и посмотреть, есть ли проблема с горячими путями в коде или, возможно, утечками памяти. Если нет, вы можете начать думать о IIS. Сначала я бы посмотрел на ваш собственный код. Вы можете получить 14-дневную версию трейла, чтобы заставить вас прокатиться. Только мои два цента. –

+0

Я соглашаюсь сначала взглянуть на свой собственный код ... но кода почти нет. Вебсервис - это то, что вы видите в моем сообщении, и веб-сайт вызывает только этот веб-сервис. – BvdVen

+0

Уверен, но это ** Операция вычисления с вычислением **, что означает, что она свяжет поток до завершения операции. Все остальные запросы просто сидят и ждут, когда CPU освободится, чтобы обслуживать их запрос. – Josh

ответ

0

Вы проверили здоровье JMM JVM? Иногда JVM GC может быть причиной высокой реакции, которую мы упускаем.

+0

JMeter не работает на той же машине, на которой протестирован веб-сайт или веб-сервис – BvdVen

+1

Eventough JMeter не работает на той же машине, что и на тестируемом веб-сайте, JMeter может страдать от проблем с GC, что, в свою очередь, вызывает высокие времена отклика. Используйте некоторые инструменты, такие как jvmtop, из google - https://code.google.com/p/jvmtop/, чтобы проверить работоспособность JMM JMeter. – Santosh

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