我们测量了一些性能测试,我注意到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上升):

c# - Azure对于Owin/IIS应用程序的性能不佳-LMLPHP

测试接近快结束时捕获的CPU:

c# - Azure对于Owin/IIS应用程序的性能不佳-LMLPHP

内核模式看起来很糟糕,我不确定是什么原因导致的。应该几乎不涉及任何锁。在阅读可能导致高内核模式的其他内容时,我发现DPC可能导致它。因此,我也捕获了一些DPC数据,但是我不确定什么是正常的,什么不是正常的。无论如何,具有DPC最大时间的图形也包含在快照中。

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

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

一些数据:

测试开始时djt_rstrong(在30秒内拍摄)的DPC数据的一部分:
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时间

c# - Azure对于Owin/IIS应用程序的性能不佳-LMLPHP

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

仅显示发送的数据量-发送的数据量(青色线)比网络适配器的容量低2个数量级。

c# - Azure对于Owin/IIS应用程序的性能不佳-LMLPHP

最佳答案

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

Huge performance drop after moving to Azure

经过大量调查,最终我们发现问题出在 transient 故障处理机制上。它曾经每次都要去读取web.config,从而导致大量的CPU使用,这在非云环境中使用相同的代码并不是问题。我们通过在其周围使用Singleton模式来处理它。

希望它可以帮助您找出应用程序是否存在此类问题。

干杯。 :)

关于c# - Azure对于Owin/IIS应用程序的性能不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37053294/

10-10 10:47