【问题标题】:Http Post - long delay at state ExecuteRequestHandlerHttp Post - 状态 ExecuteRequestHandler 的长时间延迟
【发布时间】:2019-01-08 02:15:53
【问题描述】:

我有一个托管在 Windows Server 2012r2 Standard 上的 asp.net mvc 网站,它使用 KnockoutJS 在网格中显示数据。此服务器专用于我遇到问题的进程 - 它不处理任何其他请求。

对控制器的“GetRecords”操作进行了 ajax 调用。这会非常快速地返回几十条记录的数据。

用户可以修改数据并提交更新。淘汰代码进行另一个 ajax 调用,这次发布记录。此时站点“挂起”很长时间(超过 10 分钟),但它确实成功完成并且更新的日期被保存到数据库中。在“挂起时间”期间,IIS 工作进程的 CPU 徘徊在 50% 左右。

我正在尝试找出导致延迟的原因。似乎延迟发生在到达控制器操作的第一行代码之前。我在动作中添加了跟踪语句,我可以看到,一旦执行了第一行,动作就会在几秒钟内完成。

从 IIS 管理器中,我在页面“挂起”期间深入到“工作进程”\“当前请求”,我可以看到状态列为“ExecuteRequestHandler”,模块名称为“托管管道处理程序”。没有显示其他“当前请求”。

使用 Chrome 开发工具,我捕获了为更新发布的 json,它的大小约为 4mb。

我已经排除了由带宽引起的问题,因为我已经从本地运行的浏览器(在网络服务器上)进行了测试,并且我得到了相同的延迟。

此外,当我在我的开发虚拟机上托管的同一个站点上发布相同数量的记录时,它可以正常工作 - 在 3 秒内完成端到端。

我可以采取哪些步骤来提高帖子的性能?

我已经创建了处于“挂起”状态的 IIS 工作进程的进程转储,可在以下位置获得:onedrive link

似乎是“线程 28”导致了问题,因为它的“在用户模式下花费的时间”值超过 2 分钟。我在从网站发出 http post 请求后大约 2 分钟请求了进程转储。大约 20 分钟后,帖子最终完成了 ok

【问题讨论】:

  • 延迟和高 CPU 使用率表明您的 ASP.NET MVC 代码中存在潜在错误。您必须按照 blogs.msdn.microsoft.com/tess/2008/02/22/… 之类的教程来学习如何调试,或者只需通过 support.microsoft.com 打开支持案例寻求帮助。
  • 控制器中的代码是可以的。第一行是一个跟踪语句,但在 Chrome 发布请求后的几分钟内都没有调用它。我还应该补充一点,在我的 Dev VM 上一切正常,端到端不到 3 秒
  • 我已经说了,调试一下,不然没办法知道怎么回事。让别人帮你“猜”出原因是没有意义的。
  • 调试什么?在到达控制器之前发生延迟。
  • 你有没有看过 Tess 写的博文?您是否甚至尝试过按照这些步骤进行操作?在 VS 中调试并且只有你自己的代码是没有用的。

标签: performance iis windows-server-2012-r2


【解决方案1】:

能够绕过 MVC 模型绑定解决此问题。传递给控制器​​方法的视图模型参数 (editBatchVm) 已被替换。所以,而不是:

public void ResubmitRejectedVouchersAsNewBatch(EditBatchViewModel editBatchVm)
    {

我现在有:

public void ResubmitRejectedVouchersAsNewBatch()
{
    string requestData = "";
    using (var reader = new StreamReader(Request.InputStream))
    {
        requestData = reader.ReadToEnd();
    }
    EditBatchViewModel editBatchVm = JsonConvert.DeserializeObject<EditBatchViewModel>(requestData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多