RuntimeViewCompiler 和 PageActionInvoker / PageResult 之间存在显着延迟

问题描述 投票:0回答:1

在 asp.net razor 页面应用程序中,请求和响应之间存在显着的延迟。该应用程序查询数据库并在

cshtml
剃刀页面中显示文本。数据库查询速度快,5毫秒内完成。应用程序在 Visual Studio 调试模式下运行,没有任何问题。但当发布到生产服务器时,每个请求有大约 10 秒的延迟。该应用程序发布在同一服务器上的 5 个不同域上,但延迟仅发生在其中一个上。所有域的所有配置、IIS 设置、web.config、appsettings.json 均相同。唯一的区别是域名和数据库。

使用 MiniProfiler 进行调查,我得到了以下结果快照。 MiniProfiler 中的 Result: PageResult 存在明显延迟。

启用并检查跟踪日志后,我得出以下摘录。类别条目

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RuntimeViewCompiler
(已定位编译视图...)和
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker
(执行操作后... PageResult)之间始终存在大约 10 秒的间隙,这两个事件之间没有日志条目。在这两个事件之前和之后,请求的所有其他条目都会在几毫秒内完成。

{
    "Timestamp": "11:29:25",
    "EventId": 5,
    "Category": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.RuntimeViewCompiler",
    "Message": "Located compiled view for view at path \u0027/Pages/Shared/_References.cshtml\u0027.",
    "Path": "/Pages/Shared/_References.cshtml",
    "RequestPath": "/"
    "ActionName": "/Index"
}
{
    "Timestamp": "11:29:34",
    "EventId": 6,
    "Category": "Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker",
    "Message": "After executing action result Microsoft.AspNetCore.Mvc.RazorPages.PageResult.",
    "ActionResult": "Microsoft.AspNetCore.Mvc.RazorPages.PageResult",
    "RequestPath": "/"
    "ActionName": "/Index"
}

我尝试在

appsetting.json
中使用以下跟踪日志:

"Default": "Trace",
"Microsoft.AspNetCore": "Trace",
"Microsoft": "Trace",
"Microsoft.Hosting.Lifetime": "Trace",
"Microsoft.AspNetCore.Mvc.Razor.Internal": "Trace",
"Microsoft.AspNetCore.Mvc.Razor.Razor": "Trace",
"Microsoft.AspNetCore.Mvc.Razor": "Trace",
"Microsoft.AspNetCore.Mvc": "Trace",
"Microsoft.AspNetCore.Routing": "Trace",
"Microsoft.AspNetCore.Server": "Trace",
"Microsoft.AspNetCore.StaticFiles": "Trace",
"Microsoft.AspNetCore.HostFiltering": "Trace",
"Microsoft.AspNetCore.Hosting": "Trace"

我注意到的另一件事是,如果我向页面添加图像(全部低于 100kb,托管在 wwwroot 下的同一服务器上),延迟会增加大约 100%。每个图像延迟 10 秒,即 3 个图像的总延迟约为 40 秒 (10+(3*10))。我的 Program.cs 初始化如下:

var builder = WebApplication.CreateBuilder(args);
builder.Services
    .AddRazorPages()
    .AddRazorRuntimeCompilation();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});
builder.Services.AddMiniProfiler(options =>
{
    ...
});
builder.Services.AddControllers();

var app = builder.Build();
app.UseStaticFiles();
app.UseMiniProfiler();
app.UseRouting();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
app.MapControllers();
app.Run();

之前的申请

TargetFramework
net7.0
。我已将其更新为
net8.0
,但问题仍然存在。所有软件包都是最新的。应用程序在 IIS 10 下的 Windows Server 2019 (1809) 上运行。

我不知道如何以及在哪里进一步调查以找出延迟的原因。

asp.net-core razor-pages
1个回答
0
投票

在使用 ASP.NET 应用程序尝试了很多不同的操作并从应用程序和 MiniProfiler 内进行日志记录后,我尝试将注意力转移到应用程序之外。我在 IIS 中启用了网站失败请求跟踪并分析日志发现问题与 ASP.NET 代码/应用程序或配置无关。

我已经在生产服务器上安装了ModSecurity(Web应用程序防火墙)。在网络上搜索 ModSecurity 减慢网站速度的原因时,发现该网站用于日志记录的大型

ip.pag
文件。对于这个特定的域,该文件已增长到大约 1 GB,这导致了所有延迟。为了解决这个问题,我必须:

  • 暂时关闭 ModSecurity
  • 在 ModSecurity 日志中备份
    ip.pag
    文件
  • 删除
    ip.pag
    文件
  • 再次打开 ModSecurity

网站再次启动,没有任何问题,并在几毫秒内做出响应。

我希望这对其他面临类似问题的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.