【发布时间】: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