C#性能优化基础:高CPU使用率(trace)
接上一篇:C#性能优化基础:内存诊断(dump)
内存说完了,另外一个C#性能优化需要关注的点就是高CPU使用率了,所谓高CPU使用率,其实就是程序在执行大量的计算,这些计算也许是正常的,也可能是异常,比如死循环、多线程密集型执行、大量的并发锁等,这就需要我们能排查这样的问题了。
假如我们有如下代码:
public class Program
{
public static void Main()
{
var person = new Person(10000000000m);
var price = 2m;
var totalCount = person.GetQuantity(price);
Console.WriteLine("可购买数据:" + totalCount);
}
}
public class Person
{
public Person(decimal money)
{
Money = money;
}
public decimal Money { get; set; }
public int GetQuantity(decimal price)
{
return Calulate(Money, price);
}
private int Calulate(decimal totalMoney, decimal price)
{
int totalCount = 0;
while (true)
{
totalMoney -= price;
if (totalMoney < 0) break;
totalCount++;
}
return totalCount;
}
}
这段代码逻辑很简单,也非死循环,我们在linux下去运行这段代码,但是运行后,程序会卡住一段时间,单核使用率接近100%

为了找到哪段代码执行CPU使用率高,我们可以使用dotnet-trace工具来收集
去官网下载我们需要的工具:
下载dotnet-trace:https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters
我们可以直接下载linux下的可执行文件,把它放到dotnet的安装目录即可。(切记,版本需要对应上,如果对不上,命令在执行的时候会相对应的提示需要什么版本)
程序再执行期间,我们也可以通过dotnet-trace命令查看可以收集的进程信息:sudo ./dotnet-trace ps

然后使用进程ID执行收集命令:sudo ./dotnet-trace collect -p 630274

收集一段时间后退出,就拿到了nettrace文件,如果我们要查看哪个方法CPU占用最高,只需简单的一行命令即可:
sudo ./dotnet-trace report demo_20251116_154500.nettrace topN -n 100
# demo_20251116_151807.nettrace是生成的文件名
# topN -n即输出最高的的前n项
结果大致如下:

很明显,图中已经给我指出来了哪个方法有问题了
总结
就说这么多吧,举例是很简单的,但是生产环境可能就是另外一种情况了,这里我都是采用命令来诊断和查看,现实中,我们往往使用VS工具来诊断查看,这个就不做过多介绍了。
另外,官网还给出了使用perf收集分析高CPU使用率的方法,个人觉得多数时候使用dotnet-trace就够了.
对perf感兴趣可以参考下面的地址:https://learn.microsoft.com/en-us/dotnet/core/diagnostics/debug-highcpu?tabs=linux#tabpanel_1_linux

浙公网安备 33010602011771号