如何统计或记录每个请求的CPU和内存消耗量,以 asp.net mvc为单位

本文关键字:消耗量 内存 CPU 为单位 mvc net asp 请求 统计 何统计 记录 | 更新日期: 2023-09-27 17:56:56

我想记录每个请求对CPU和内存等资源的消耗,用于检查问题

如何统计或记录每个请求的CPU和内存消耗量,以 asp.net mvc为单位

没有简单的方法来测量内存消耗,但可以测量 CPU 消耗。

您需要:

  • 将处理请求的托管线程的线程关联设置为操作系统线程。这可以通过Thread.BeginThreadAffinity完成 - 不要忘记在请求结束时将其与Thread.EndThreadAffinity配对。
  • 从 Windows API 调用QueryThreadCycleTime,用于查询当前线程 CPU 周期。在请求的开头和结尾执行此操作,然后获得两者之间的区别。
  • 在优化方面,您还可以通过QueryPerformanceFrequency调用并进行正确的数学运算,将 CPU 周期转换为时间。

我将帮助程序类的完整代码附加为 Gist https://gist.github.com/felix-b/7cda7d4f44d05e66874b4b2dad4fd3d2#file-threadcputimeutility(我在这里粘贴代码时遇到了麻烦,由于某种原因它被扭曲了)。

由于有很多方法可以将代码挂接到请求的开头和结尾(请注意 ASP.NET 管道并非完全在同一线程上执行 - 如果您需要进一步的帮助,请告诉我)。现在,我将只关注需要做的事情。

在请求启动中:

 Thread.BeginThreadAffinity();
 _startCpuCycles = ThreadCpuTimeUtility.GetTheadCycles();

在请求端(必须与上述代码在同一线程上运行):

 var endCpuCycles = ThreadCpuTimeUtility.GetTheadCycles();
 Thread.EndThreadAffinity();
 var cpuMicroseconds = ThreadCpuTimeUtility.GetThreadCpuMicroseconds(
     _startCpuCycles, 
     endCpuCycles);