【问题标题】:Bad performance on Azure for Owin/IIS applicationAzure for Owin/IIS 应用程序性能不佳
【发布时间】:2016-05-16 13:40:11
【问题描述】:

我们测量了一些性能测试,我注意到 CPU 在内核模式下运行了很多时间。我想知道这是为什么。

应用程序:它是经典的 Azure 云服务 Web 角色,Owin 在 IIS 下侦听,Owin 本身只提供缓存在内存中的静态文件(因此应该只有一点性能损失和一切都应该很快)。内容通过await stream.CopyToAsync(response.Body)复制到输出流。

测试本身在加特林中看起来像这样:

val openLoginSet = exec(http("ROOT")
      .get("/")
      .headers(Headers105Test2.headers_0)
      .resources(
        http("MED: arrow-down-small.png").get(uriIconAssets + "/arrow-down-small.png").headers(Headers105Test2.headers_1),
        http("MED: arrow-up-small.png").get(uriIconAssets + "/arrow-up-small.png").headers(Headers105Test2.headers_1),
        http("MED: close-medium.png").get(uriIconAssets + "/close-medium.png").headers(Headers105Test2.headers_1),
        http("MED: decline-medium.png").get(uriIconAssets + "/decline-medium.png").headers(Headers105Test2.headers_1),
        http("MED: help-medium.png").get(uriIconAssets + "/help-medium.png").headers(Headers105Test2.headers_1),
        http("MED: submit-medium.png").get(uriIconAssets + "/submit-medium.png").headers(Headers105Test2.headers_1),
        http("MED: delete-medium.png").get(uriIconAssets + "/delete-medium.png").headers(Headers105Test2.headers_1),
        http("MED: en-us.js").get("/en-us.js").headers(Headers105Test2.headers_8),
        http("MED: cloud_logo_big.png").get("/assets/cloud_logo_big.png").headers(Headers105Test2.headers_1),
        http("MED: favicon.ico").get("/favicon.ico").headers(Headers105Test2.headers_0))

val httpProtocol = http
  .baseURL("https://myurl.com")
  .inferHtmlResources()

val openLoginSenario = scenario("OpenOnly").exec(repeat(400, "n") {
    exec(openLoginSet).pause(3,6)
})

setUp(openLoginSenario.inject(rampUsers(150) over (3 minutes)))
  .protocols(httpProtocol)
  .maxDuration(3 minutes)

(我将测试缩短为运行 3 分钟只是为了捕捉数据以显示在这里) 有 3 台计算机运行此加特林测试,每台计算机最多 150 个并发线程,因此总共 450 个线程。

我看到内核中有很多正在运行的代码,而 W3wp 进程并没有占用大部分 CPU:

刚开始测试时捕获的CPU(添加新线程时cpu正在上升):

在测试快结束时捕获的 CPU:

内核模式看起来很糟糕,我不确定是什么原因造成的。应该几乎不涉及锁。在阅读其他可能导致高内核模式的原因时,我发现 DPC 可能会导致它。所以我也捕获了一些 DPC 数据,但我不确定什么是正常的,什么不是。无论如何,DPC 最大次数的图表也包含在截图中。

vmbus.sys 占用所有 DPC 的大部分时间。这意味着 Azure 实例不是任何裸机(并不令人惊讶),并且该实例与其他实例共享它的计算能力。据我了解, vmbus.sys 负责例如之间的通信。网卡本身和托管的 HyperV 实例。 在 HyperV 中运行可能是导致性能低下的主要原因吗?

我想知道在哪里查找以及如何找出在我的情况下导致内核模式的原因。


更多数据:

部分 DPC 数据测试开始时(在 30 秒内拍摄):

Total = 17887 for module vmbus.sys
Elapsed Time, >        0 usecs AND <=        1 usecs,    137, or   0.77%
Elapsed Time, >        1 usecs AND <=        2 usecs,   2148, or  12.01%
Elapsed Time, >        2 usecs AND <=        4 usecs,   3941, or  22.03%
Elapsed Time, >        4 usecs AND <=        8 usecs,   2291, or  12.81%
Elapsed Time, >        8 usecs AND <=       16 usecs,   5182, or  28.97%
Elapsed Time, >       16 usecs AND <=       32 usecs,   3305, or  18.48%
Elapsed Time, >       32 usecs AND <=       64 usecs,    786, or   4.39%
Elapsed Time, >       64 usecs AND <=      128 usecs,     85, or   0.48%
Elapsed Time, >      128 usecs AND <=      256 usecs,      6, or   0.03%
Elapsed Time, >      256 usecs AND <=      512 usecs,      1, or   0.01%
Elapsed Time, >      512 usecs AND <=     1024 usecs,      2, or   0.01%
Elapsed Time, >     1024 usecs AND <=     2048 usecs,      0, or   0.00%
Elapsed Time, >     2048 usecs AND <=     4096 usecs,      1, or   0.01%
Elapsed Time, >     4096 usecs AND <=     8192 usecs,      2, or   0.01%
Total,                                                 17887

部分 DPC 数据测试结束时(在 30 秒内拍摄):

Total = 141796 for module vmbus.sys
Elapsed Time, >        0 usecs AND <=        1 usecs,   7703, or   5.43%
Elapsed Time, >        1 usecs AND <=        2 usecs,  21075, or  14.86%
Elapsed Time, >        2 usecs AND <=        4 usecs,  17301, or  12.20%
Elapsed Time, >        4 usecs AND <=        8 usecs,  38988, or  27.50%
Elapsed Time, >        8 usecs AND <=       16 usecs,  32028, or  22.59%
Elapsed Time, >       16 usecs AND <=       32 usecs,  11861, or   8.36%
Elapsed Time, >       32 usecs AND <=       64 usecs,   7034, or   4.96%
Elapsed Time, >       64 usecs AND <=      128 usecs,   5038, or   3.55%
Elapsed Time, >      128 usecs AND <=      256 usecs,    606, or   0.43%
Elapsed Time, >      256 usecs AND <=      512 usecs,     53, or   0.04%
Elapsed Time, >      512 usecs AND <=     1024 usecs,     26, or   0.02%
Elapsed Time, >     1024 usecs AND <=     2048 usecs,     11, or   0.01%
Elapsed Time, >     2048 usecs AND <=     4096 usecs,     10, or   0.01%
Elapsed Time, >     4096 usecs AND <=     8192 usecs,     53, or   0.04%
Elapsed Time, >     8192 usecs AND <=    16384 usecs,      3, or   0.00%
Elapsed Time, >    16384 usecs AND <=    32768 usecs,      1, or   0.00%
Elapsed Time, >    32768 usecs AND <=    65536 usecs,      5, or   0.00%
Total,                                                141796

% DPC 从测试开始到结束的时间

我们还怀疑我们达到了网络限制 - 因此测试“下载”了如此多的数据,以至于达到了网络适配器的限制。这在测试结束时可能是正确的(当有最大数量的线程时),但这并不能解释为什么即使在测试开始时也有如此多的内核模式时间。

只是为了显示发送了多少数据 - 发送的数据量(青色线)比网络适配器的容量低 2 个数量级。

【问题讨论】:

    标签: c# performance azure cpu-usage


    【解决方案1】:

    这可能无法直接帮助您。但是在将应用程序迁移到云端后,我们遇到了一些性能问题。请在此处找到讨论:

    Huge performance drop after moving to Azure

    经过大量调查,最终我们发现问题出在瞬态故障处理机制上。它过去每次都会去读取web.config,这会导致巨大的 CPU 使用率,这在非云环境中使用相同的代码不是问题。我们通过在它周围使用单例模式来处理它。

    希望它可以帮助您了解应用程序是否存在任何此类问题。

    干杯。 :)

    【讨论】:

    • 感谢您的评论。但是,我的问题要简单得多,可以很好地衡量,但不知道是什么原因。我认为这与 HyperV 有关,但没有人证实...
    【解决方案2】:

    自 IIS 6 以来,许多请求都在内核模式下处理,这通常比用户模式更快。

    more on IIS kernel mode

    在您的情况下,静态内容似乎由内核模式缓存处理,因此这些请求不涉及用户模式代码。在大多数情况下,由于性能更好等原因,这是可取的。

    more on content that can/cannot be handled by kernel mode

    more on configuring/monitoring IIS output caching to verify its use in your test

    still more

    祝你好运!

    【讨论】:

    • 好的,我会通读的。顺便提一句。当前性能是每秒 数百 (600-800) 个请求;平均响应大小为几十 KB。这些结果非常令人失望,这就是我试图找到原因的原因。
    • Azure 实例为 A3(也称为大型)-azure.microsoft.com/en-us/documentation/articles/… 表示 4 核,7GB 内存。
    • 此外,内容也没有缓存在 IIS 中,因为我看到曾经请求登录到应用程序并从应用程序缓存中提供服务。
    • 感谢您的回答。你的可能更接近原来的问题,所以 150 分是你的;)
    • 谢谢 stej!我希望您解决了根本问题……或者至少了解现在发生了什么?
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多