怎樣配置blazor才能提高吞吐量
怎樣配置blazor才能提高吞吐量
為了提高 Blazor 應(yīng)用的吞吐量,可以從以下幾個方面進(jìn)行配置和優(yōu)化:
1. 啟用響應(yīng)壓縮:通過壓縮傳輸?shù)臄?shù)據(jù)量來減少帶寬消耗。
2. 配置 SignalR:調(diào)整 SignalR 的配置以提高數(shù)據(jù)傳輸效率。
3. 優(yōu)化 Circuit 選項:調(diào)整 Blazor Server 的 Circuit 配置以提高性能。
4. 使用靜態(tài)文件緩存:配置靜態(tài)文件緩存以減少服務(wù)器負(fù)載。
5. 使用 HTTP/2:啟用 HTTP/2 以提高傳輸效率。
以下是具體的配置示例:
```
var builder = WebApplication.CreateBuilder(args);
// 啟用響應(yīng)壓縮
builder.Services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
});
builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
// 配置 SignalR
builder.Services.AddRazorComponents().AddInteractiveServerComponents()
.AddCircuitOptions(a =>
{
a.JSInteropDefaultCallTimeout = TimeSpan.FromMinutes(2);
a.MaxBufferedUnacknowledgedRenderBatches = 20;
a.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(10);
a.DisconnectedCircuitMaxRetained = 200;
})
.AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = 10 * 1024 * 1024;
options.ClientTimeoutInterval = TimeSpan.FromSeconds(60);
options.HandshakeTimeout = TimeSpan.FromSeconds(30);
options.StreamBufferCapacity = 20;
});
// 啟用 HTTP/2
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5000, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseResponseCompression();
}
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
}
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.MapRazorComponents<App>().AddInteractiveServerRenderMode().AddAdditionalAssemblies([typeof(JovenRes.Shared._Imports).Assembly]);
app.Run();
```
具體優(yōu)化點(diǎn)說明:
SignalR 配置:調(diào)整 MaximumReceiveMessageSize、ClientTimeoutInterval、HandshakeTimeout 和 StreamBufferCapacity 等參數(shù),提高數(shù)據(jù)傳輸效率。
-
MaximumReceiveMessageSize 參數(shù)用于配置 SignalR 服務(wù)中,服務(wù)器端可以接收的單個消息的最大大小。這個參數(shù)的作用是控制服務(wù)器端能夠處理的最大消息大小,以防止過大的消息導(dǎo)致服務(wù)器資源耗盡或性能問題。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 32 KB (32 * 1024 字節(jié))。
? 作用:當(dāng)客戶端發(fā)送的消息大小超過 MaximumReceiveMessageSize 的值時,服務(wù)器端將拒絕處理該消息,并拋出異常。調(diào)整建議
? 增大值:如果你的應(yīng)用需要處理較大的消息(例如文件上傳或大數(shù)據(jù)傳輸),可以考慮增大這個值。
? 減小值:如果你希望限制消息大小,以防止過大的消息影響服務(wù)器性能,可以考慮減小這個值。 -
ClientTimeoutInterval 參數(shù)用于配置 SignalR 服務(wù)中,服務(wù)器等待客戶端響應(yīng)的最大時間間隔。這個參數(shù)的作用是控制服務(wù)器在等待客戶端發(fā)送消息或心跳信號時的超時時間。如果在指定的時間內(nèi)沒有收到客戶端的消息或心跳信號,服務(wù)器將認(rèn)為客戶端已斷開連接。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 30 秒。
? 作用:當(dāng)服務(wù)器在指定的時間內(nèi)沒有收到客戶端的消息或心跳信號時,服務(wù)器將斷開與客戶端的連接。調(diào)整建議
? 增大值:如果你的應(yīng)用需要處理較長時間的操作,或者網(wǎng)絡(luò)延遲較大,可以考慮增大這個值,以避免誤判客戶端斷開連接。
? 減小值:如果你希望更快地檢測到客戶端斷開連接的問題,可以考慮減小這個值。 -
HandshakeTimeout 參數(shù)用于配置 SignalR 服務(wù)中,服務(wù)器等待客戶端完成握手的最大時間間隔。握手是客戶端和服務(wù)器之間建立連接的初始步驟,HandshakeTimeout 控制服務(wù)器在等待客戶端完成握手時的超時時間。如果在指定的時間內(nèi)握手未完成,服務(wù)器將斷開連接。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 15 秒。
? 作用:當(dāng)服務(wù)器在指定的時間內(nèi)沒有收到客戶端的握手完成消息時,服務(wù)器將斷開與客戶端的連接。調(diào)整建議
? 增大值:如果你的應(yīng)用需要處理較長時間的握手操作,或者網(wǎng)絡(luò)延遲較大,可以考慮增大這個值,以避免誤判客戶端握手失敗。
? 減小值:如果你希望更快地檢測到握手失敗的問題,可以考慮減小這個值。 -
StreamBufferCapacity 參數(shù)用于配置 SignalR 服務(wù)中,服務(wù)器為客戶端上傳流緩沖的最大項數(shù)。這個參數(shù)的作用是控制服務(wù)器在處理客戶端上傳流時,可以緩沖的最大項數(shù)。如果達(dá)到此限制,服務(wù)器將阻止處理調(diào)用,直到服務(wù)器處理完一些緩沖項。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 10。
? 作用:當(dāng)客戶端上傳流數(shù)據(jù)時,服務(wù)器會將數(shù)據(jù)項緩存在內(nèi)存中。如果緩沖的項數(shù)超過 StreamBufferCapacity 的值,服務(wù)器將暫停處理新的數(shù)據(jù)項,直到處理完一些緩沖項。調(diào)整建議
? 增大值:如果你的應(yīng)用需要處理大量的流數(shù)據(jù),可以考慮增大這個值,以減少服務(wù)器因緩沖區(qū)滿而暫停處理的情況。
? 減小值:如果你希望限制服務(wù)器的內(nèi)存使用,或者希望更快地檢測到緩沖區(qū)滿的問題,可以考慮減小這個值。
Circuit 選項:調(diào)整 JSInteropDefaultCallTimeout、MaxBufferedUnacknowledgedRenderBatches、DisconnectedCircuitRetentionPeriod 和 DisconnectedCircuitMaxRetained 等參數(shù),優(yōu)化 Blazor Server 的性能。
-
JSInteropDefaultCallTimeout 參數(shù)用于配置 Blazor Server 應(yīng)用中,異步調(diào)用 JavaScript 函數(shù)的最大等待時間。這個參數(shù)的作用是控制從 Blazor 服務(wù)器端調(diào)用 JavaScript 函數(shù)時,等待 JavaScript 函數(shù)執(zhí)行完成的最大時間。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 1 分鐘。
? 作用:當(dāng) Blazor 服務(wù)器端調(diào)用 JavaScript 函數(shù)時,如果在指定的時間內(nèi)沒有收到 JavaScript 函數(shù)的響應(yīng),調(diào)用將超時并拋出異常。調(diào)整建議
? 增大值:如果你的 JavaScript 函數(shù)執(zhí)行時間較長,可以考慮增大這個值,以避免調(diào)用超時。
? 減小值:如果你希望更快地檢測到 JavaScript 函數(shù)執(zhí)行超時的問題,可以考慮減小這個值。 -
MaxBufferedUnacknowledgedRenderBatches 參數(shù)用于配置 Blazor Server 應(yīng)用中,服務(wù)端在內(nèi)存中可以暫存的最大未確認(rèn)渲染批次的數(shù)量。這個參數(shù)的作用是控制服務(wù)端在等待客戶端確認(rèn)渲染批次時,可以暫存的最大渲染批次數(shù)量。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 10。
? 作用:當(dāng)客戶端處理速度較慢時,服務(wù)端會暫存渲染批次。如果暫存的渲染批次數(shù)量超過 MaxBufferedUnacknowledgedRenderBatches 的值,服務(wù)端將停止渲染新的批次,直到客戶端處理完一些批次并發(fā)送確認(rèn)。調(diào)整建議
? 增大值:如果你的應(yīng)用有大量的渲染操作,并且客戶端處理速度較慢,可以考慮增大這個值,以減少服務(wù)端因等待客戶端確認(rèn)而停止渲染的情況。
? 減小值:如果你的應(yīng)用內(nèi)存有限,或者你希望更快地檢測到客戶端處理速度慢的問題,可以考慮減小這個值。
這些配置和優(yōu)化可以幫助提高 Blazor 應(yīng)用的吞吐量和整體性能。 -
DisconnectedCircuitRetentionPeriod 參數(shù)用于配置 Blazor Server 應(yīng)用中,每個 Circuit 斷聯(lián)之后在內(nèi)存中保持狀態(tài)的最大時間。這個參數(shù)的作用是控制當(dāng)客戶端斷開連接時,服務(wù)器端保留該客戶端狀態(tài)的時間長度,以便客戶端重新連接時可以恢復(fù)狀態(tài)。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 3 分鐘。
? 作用:當(dāng)客戶端斷開連接時,服務(wù)器端會保留該客戶端的狀態(tài)。如果客戶端在指定的時間內(nèi)重新連接,服務(wù)器端將恢復(fù)該客戶端的狀態(tài)。如果超過這個時間,服務(wù)器端將釋放該客戶端的狀態(tài),客戶端重新連接時將無法恢復(fù)之前的狀態(tài)。調(diào)整建議
? 增大值:如果你的應(yīng)用需要在客戶端斷開連接后較長時間內(nèi)保持狀態(tài),可以考慮增大這個值。
? 減小值:如果你希望更快地釋放斷開連接的客戶端狀態(tài),以節(jié)省服務(wù)器資源,可以考慮減小這個值。 -
DisconnectedCircuitMaxRetained 參數(shù)用于配置 Blazor Server 應(yīng)用中,服務(wù)器端在內(nèi)存中可以保留的斷開連接的 Circuit 的最大數(shù)量。這個參數(shù)的作用是控制服務(wù)器端在內(nèi)存中保留的斷開連接的客戶端狀態(tài)的數(shù)量上限。
參數(shù)說明
? 默認(rèn)值:默認(rèn)情況下,這個值是 100。
? 作用:當(dāng)客戶端斷開連接時,服務(wù)器端會保留該客戶端的狀態(tài)。如果斷開連接的客戶端數(shù)量超過 DisconnectedCircuitMaxRetained 的值,服務(wù)器端將開始丟棄最早斷開連接的客戶端狀態(tài),以確??倲?shù)量不超過這個上限。調(diào)整建議
? 增大值:如果你的應(yīng)用需要在客戶端斷開連接后保留更多的客戶端狀態(tài),可以考慮增大這個值。
? 減小值:如果你希望更快地釋放斷開連接的客戶端狀態(tài),以節(jié)省服務(wù)器資源,可以考慮減小這個值。
如何監(jiān)控 Blazor 應(yīng)用的性能以進(jìn)一步優(yōu)化吞吐量?
監(jiān)控 Blazor 應(yīng)用的性能是優(yōu)化吞吐量的重要步驟。以下是一些方法和工具,可以幫助你監(jiān)控和分析 Blazor 應(yīng)用的性能:
-
使用 Application Insights
Application Insights 是一個強(qiáng)大的監(jiān)控工具,可以幫助你收集和分析應(yīng)用的性能數(shù)據(jù)。
安裝和配置 Application Insights在 Program.cs 文件中添加以下代碼:
using Microsoft.ApplicationInsights.AspNetCore.Extensions; var builder = WebApplication.CreateBuilder(args); // 添加 Application Insights 服務(wù) builder.Services.AddApplicationInsightsTelemetry(builder.Configuration["ApplicationInsights:InstrumentationKey"]); var app = builder.Build(); // 啟用 Application Insights 請求跟蹤 app.UseApplicationInsightsRequestTelemetry(); app.UseApplicationInsightsExceptionTelemetry(); app.Run();確保在 appsettings.json 文件中添加 Application Insights 的 Instrumentation Key:
{ "ApplicationInsights": { "InstrumentationKey": "your-instrumentation-key" } } -
使用瀏覽器開發(fā)者工具
- 瀏覽器開發(fā)者工具(如 Chrome DevTools)可以幫助你分析前端性能。你可以使用以下功能:
? Network:查看網(wǎng)絡(luò)請求的時間和大小。
? Performance:記錄和分析頁面的性能。
? Memory:監(jiān)控內(nèi)存使用情況,查找內(nèi)存泄漏。
- 使用 .NET Core 性能工具
- .NET Core 提供了一些性能工具,可以幫助你分析和診斷應(yīng)用的性能問題:
? dotnet-counters:實(shí)時監(jiān)控 .NET Core 應(yīng)用的性能計數(shù)器。
? dotnet-trace:收集 .NET Core 應(yīng)用的跟蹤日志。
? dotnet-dump:收集和分析 .NET Core 應(yīng)用的內(nèi)存轉(zhuǎn)儲。
- 優(yōu)化建議
- 根據(jù)監(jiān)控結(jié)果,你可以進(jìn)行以下優(yōu)化:
? 減少組件重渲染:避免不必要的組件重渲染,使用 ShouldRender 方法控制渲染。
? 優(yōu)化數(shù)據(jù)加載:使用分頁、緩存等技術(shù)優(yōu)化數(shù)據(jù)加載。
? 減少 JavaScript 互操作調(diào)用:盡量減少與 JavaScript 的互操作調(diào)用,使用批量調(diào)用或減少調(diào)用頻率。
? 使用異步方法:盡量使用異步方法,提高應(yīng)用的響應(yīng)速度。
通過以上方法和工具,你可以有效監(jiān)控 Blazor 應(yīng)用的性能,并根據(jù)監(jiān)控結(jié)果進(jìn)行優(yōu)化,從而提高應(yīng)用的吞吐量。
關(guān)聯(lián)項目
FreeSql QQ群:4336577
BA & Blazor QQ群:795206915
Maui Blazor 中文社區(qū) QQ群:645660665
知識共享許可協(xié)議
本作品采用 知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議 進(jìn)行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務(wù)必保留文章署名AlexChow(包含鏈接: https://github.com/densen2014 ),不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布。如有任何疑問,請與我聯(lián)系 。
轉(zhuǎn)載聲明
本文來自博客園,作者:周創(chuàng)琳 AlexChow,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/densen2014/p/18749750
AlexChow
今日頭條 | 博客園 | 知乎 | Gitee | GitHub


浙公網(wǎng)安備 33010602011771號