.NET 6升级至.NET 8后ARM64机器CPU占用异常升高问题咨询
.NET 6 gRPC微服务升级至.NET 8后ARM64平台CPU占用异常问题
我们近期将.NET gRPC微服务从.NET 6.0升级至.NET 8.0后,发现运行于Amazon Linux 2系统的ARM64机器上的Pod CPU占用有所升高;但部署在x86_64机器上时,CPU占用和延迟相比.NET 6.0均有显著改善。
已执行的排查操作
- 测试了ASP.NET运行时镜像8.0.0至8.0.14的所有补丁版本
- 将代码库从
Grpc.Core迁移至grpc-dotnet库 - 完成了从
Newtonsoft.Json到System.Text.Json的切换
性能统计数据(dotnet-counters收集)
| 指标 | .NET 6 ARM64 | .NET 8 ARM64 | .NET 8 x86_64 |
|---|---|---|---|
| % Time in GC since last GC (%) | 0 | 0 | 0 |
| Allocation Rate (B/sec) | 5,733,520 | 3,972,864 | 8,970,032 |
| CPU Usage (%) | 3 | 2.989 | 3.233 |
| Exception Count (/sec) | 0 | 0 | 0 |
| GC Committed Bytes (MB) | 65 | 64.561 | 87.323 |
| GC Fragmentation (%) | 26.295 | 22.849 | 56.653 |
| GC Heap Size (MB) | 33 | 39.809 | 40.187 |
| Gen 0 GC Budget (MB) | 24 | 16 | 41 |
| Gen 0 Size (B) | 24 | 0 | 20,793,720 |
| Gen 1 Size (B) | 442,744 | 802,200 | 1,583,296 |
| Gen 2 Size (B) | 27,047,808 | 21,647,752 | 26,886,096 |
| IL Bytes Jitted (B) | 1,696,372 | 2,626,920 | 4,686,141 |
| LOH Size (B) | 16,601,704 | 15,774,992 | 10,049,816 |
| Monitor Lock Contention Count (/sec) | 76 | 28 | 36 |
| Number of Active Timers | 16 | 15 | 16 |
| Number of Assemblies Loaded | 171 | 187 | 189 |
| Number of Methods Jitted | 22,990 | 34,315 | 135,674 |
| POH (Pinned Object Heap) Size (B) | 379,072 | 1,947,392 | 4,036,232 |
| ThreadPool Completed Work Item Count (/sec) | 1,397 | 1,630 | 2,856 |
| ThreadPool Queue Length | 0 | 0 | 0 |
疑问
总体来看,无配置或代码变更的情况下,ARM64机器上的Pod CPU占用高于AMD64机器。我们已卡在此次升级一个多月,尝试多种方法仍未找到根因或可行解决方案,特此咨询:是否遗漏关键排查环节,或该现象为.NET 6 gRPC服务升级至.NET 8 ARM64环境下的预期行为?
内容的提问来源于stack exchange,提问作者Balaji Nadar
相关产品推荐
相关产品推荐

