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%

  image

  为了找到哪段代码执行CPU使用率高,我们可以使用dotnet-trace工具来收集

  去官网下载我们需要的工具:

  下载dotnet-tracehttps://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-counters

  我们可以直接下载linux下的可执行文件,把它放到dotnet的安装目录即可。(切记,版本需要对应上,如果对不上,命令在执行的时候会相对应的提示需要什么版本

  程序再执行期间,我们也可以通过dotnet-trace命令查看可以收集的进程信息:sudo ./dotnet-trace ps

  image

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

   image

  收集一段时间后退出,就拿到了nettrace文件,如果我们要查看哪个方法CPU占用最高,只需简单的一行命令即可:

    sudo ./dotnet-trace report demo_20251116_154500.nettrace topN -n 100
    # demo_20251116_151807.nettrace是生成的文件名
    # topN -n即输出最高的的前n项

  结果大致如下:

  image

  很明显,图中已经给我指出来了哪个方法有问题了

  

   总结

   就说这么多吧,举例是很简单的,但是生产环境可能就是另外一种情况了,这里我都是采用命令来诊断和查看,现实中,我们往往使用VS工具来诊断查看,这个就不做过多介绍了。

   另外,官网还给出了使用perf收集分析高CPU使用率的方法,个人觉得多数时候使用dotnet-trace就够了.

  对perf感兴趣可以参考下面的地址:https://learn.microsoft.com/en-us/dotnet/core/diagnostics/debug-highcpu?tabs=linux#tabpanel_1_linux

posted @ 2025-11-16 16:09  没有星星的夏季  阅读(26)  评论(0)    收藏  举报