【问题标题】:Poor performance of simple webservice简单的Web服务性能不佳
【发布时间】:2014-02-03 15:54:17
【问题描述】:

我的问题是关于一个简单测试网站的性能。

为了测试性能,我使用jMeter 在此页面上模拟 75 个用户(连续)。 该页面仅对 GetHello() 进行 Web 服务调用并打印结果。

webservice 方法做的不多:

public string GetHello(){
    int count = 0;
    foreach(int i = 0; i < 10000000; i++){
       count++;
    }
    return "hello world "+ count;
}

但在性能结果中,我看到平均加载时间越来越长……这对我来说似乎不合逻辑。我不知道去哪里解决这个问题。

网站服务器(2个四核处理器2.33Ghz,8G内存)内存和CPU不忙,Web服务服务器(与网站服务器相同的硬件设置)内存不忙但CPU使用率介于60% 和 100%...

我想到的是 IIS 设置问题或 web.config 配置(用于网站或 web 服务)但我找不到任何解决方案......或者解释为什么会发生这种情况。 这种简单的代码在我眼里应该不会是问题吧?

更新: 当我从网络服务中删除循环时......看起来没有问题。所以只要在 webservice 方法中需要一点计算,平均处理时间就会增加。


更新 2

情况变慢

我们的网站遇到了性能问题。 我们已经设置了一个测试环境来确定问题发生在哪里。 测试环境由 3 台服务器组成。 (2 代表前端(网站)和 1 代表后端(wcf webservices))。 服务器规格:

  • 网站 1:英特尔至强 e5410 (2x) 8GB 内存
  • 网站 2:英特尔至强 x3323 4GB 内存
  • Web 服务:Intel Xeon e5410 (2x) 8GB 内存

网络服务正在使用 net.tcp 端点 使用 Jmeter,我们向网站 1 上的 1 个页面发送 75 个并发请求。 响应时间持续增加约 5 秒,然后趋于平稳。 当我们使用浏览器访问网站 1 时,该网站的响应时间很长。 当我们转到网站 2,同一页面时,网站速度很快。 使用 netstat -t 我们可以看到网站 1 只有大约 30 个与 Web 服务的连接。 网站web.config中的endpoint绑定如下:

<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>

这是网络服务的配置:

<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%
  • Web 服务:大约 25%,最大 50%

我们是在网站 1 的最大值下运行还是缺少一些设置?

【问题讨论】:

  • 我认为“猜测”问题出在哪里是徒劳的。你需要做的是得到一个像Ants Profiler 这样的工具并在两边运行它,看看代码中的热路径是否存在问题,或者内存泄漏。如果没有,您可以开始考虑 IIS。我会先看看你自己的代码。您可以获得 14 天试用版,让您滚动。只是我的两分钱。
  • 我同意先看我自己的代码……但几乎没有代码。网络服务就是你在我的帖子中看到的,网站只调用这个网络服务。
  • @Josh - 在英特尔架构中,每个内核有两个线程,因此 4 个内核将是 8 个线程。管道的某些部分是共享的,所以它不是真正的 8 个线程,但是......只是说:)
  • 如果您正在进行计算密集型工作,那么可以。通常,您会为这类事情设置一个单独的应用程序服务器集群。否则,大多数 Web 服务通常只是从数据库中访问一些信息,进行一点处理并通过网络发送信息。因此,在 CPU 上花费的时间充其量是最少的。
  • @BvdVen - 是的,这很正常,对于具有计算绑定操作的大规模生产系统来说,这是一个真正的问题。您可以做的是使用Task 对象将处理请求的线程的数学运算卸载到线程池中的线程。这不会完全解决您的问题,因为Tasks 仍将绑定到 CPU。它将允许将 HTTP 处理与 CPU 绑定线程分开,因此这些可以并行发生。

标签: asp.net performance web-services jmeter


【解决方案1】:

您是否检查过 JMeter JVM 的健康状况?有时 JVM GC 可能是我们忽略的高响应的原因。

【讨论】:

  • JMeter 没有与测试网站或 web 服务在同一台机器上运行
  • 尽管 JMeter 与测试网站不在同一台机器上运行,但 JMeter 可能会遇到 GC 问题,进而导致响应时间过长。使用一些工具,如 google 的 jvmtop - code.google.com/p/jvmtop 来检查 JMeter 的 JVM 健康状况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多