[英]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.