[英]Measuring cpu time for http request in async controller
我正在阅读关于处理过载的谷歌 SRE 书籍章节: https://sre.google/sre-book/handling-overload/
他们提到:
这个难题的一个有趣部分是实时计算每个单独请求所消耗的资源量,特别是 CPU。 对于没有实现每个请求的线程 model 的服务器来说,这种计算特别棘手,其中线程池使用非阻塞 API 在所有请求进入时执行它们的不同部分。
我知道在每个请求的线程 model 中,我们可以简单地调用 getrusage(RUSAGE_THREAD, &r); 但是在具有异步方法的 ASP.net Controller 中,不能保证“await”关键字之前和之后的代码将在同一线程上执行。 即使是这样,线程也有可能为其他 http 请求执行代码。
那么有没有办法测量异步 function 使用了多少 CPU 时间。
托管 memory 分配将导致在其他线程中完成的 GC 工作。 缓存在其他线程中管理。
测量直接依赖于请求的任何内容都是误导性的。
如果您有性能问题,您应该收集指标、ETW 跟踪、memory 转储并分析它们。
找到了一个 Nuget 这提供了这个功能。
https://github.com/devizer/Universe.CpuUsage
使用 class CpuUsageAsyncWatcher
public void Configure(IApplicationBuilder app)
{
// Here is a "middleware" that displays total CPU usage
// of all the Tasks executed by ASP.NET Core pipeline during each http request
app.Use(async (context, next) =>
{
CpuUsageAsyncWatcher watcher = new CpuUsageAsyncWatcher();
await next.Invoke();
watcher.Stop();
Console.WriteLine($"Cpu Usage by http request is {watcher.GetSummaryCpuUsage()}");
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.