【问题标题】:The whole site is blocked while one page is waiting for blocking operation (PHP, ASP.NET). Why?整个站点被阻塞,而一个页面正在等待阻塞操作(PHP,ASP.NET)。为什么?
【发布时间】:2010-03-13 13:27:24
【问题描述】:

美好的一天!

我发现 LAMP 堆栈和 ASP.NET 的有趣行为。

场景:

在 2-3 分钟内有页面执行任务(为 ASP.NET 制作 HttpWebRequest 为 PHP 制作 curl)。在处理此页面时,不会处理来自同一浏览器的所有其他对该虚拟主机的请求(即使我在一台机器上使用不同的浏览器)。我使用了两个用 PHP 和 C# 编写的页面。

我已经在 Windows 和 Debian 的 mod_php 和 fast_cgi 模式下使用 Apache+PHP 进行了测试。 对于 ASP.NET,我使用 IIS6(此站点具有专用应用程序池和默认应用程序池)和集成模式下的 IIS7。

我知道对此类事情使用异步调用会更好,但我只是好奇为什么单个页面会阻塞整个站点而不仅仅是处理请求的线程?

提前致谢!

【问题讨论】:

    标签: php asp.net apache iis


    【解决方案1】:

    您似乎打开了在请求结束之前一直打开的标准 php 会话。这意味着会话文件被锁定。如果您不需要会话数据,请尽快使用 session_write_close()。

    【讨论】:

    • 是的,您是对的,问题已通过session_write_close() 解决,我只是忘记在此处发布解决方案。谢谢!
    【解决方案2】:

    我不认为它会阻止网站;我怀疑打开的连接会阻止客户端发出更多请求。您是否证明在您的长时间运行的请求正在进行时其他机器无法使用该站点?

    【讨论】:

    • 我试图在同一台机器上使用另一个浏览器(不是另一个窗口,另一个程序)。据我了解,这应该为新请求创建另一个处理线程。
    • 除非您的本地计算机已经与同一端口上的同一服务器建立了开放连接。我重复我的问题:您是否证明其他机器不能使用该站点?我认为您尚未证明服务器已被阻止。
    • 我在附近的其他电脑上进行了测试。当我的页面正在执行 HttpWebRequest 时,该站点也被此 PC 阻止。两台电脑都在同一个 NAT 盒子后面
    【解决方案3】:

    如果您只看到应用程序收到一个请求,那么我唯一能想到的就是管道中某处的全局锁。

    锁可以是显式的(您编写了 lock 语句)或隐式的。如果您可以看到多个请求 - 这可能是由于线程池耗尽。

    请记住,除了用于处理传入 Web 请求的线程数上限之外,通过 HttpWebRequest 同时传出 Web 请求的数量还有一个单独的上限,默认情况下这个限制非常低 - 如果我记得的话每个 CPU 正确 2 个。我不记得 web.config 中设置的名称,但会尝试查找。

    在任何情况下,发布代码都会让我们有更好的机会为您提供帮助

    【讨论】:

    【解决方案4】:

    我在调试 ASP.NET 应用程序时肯定注意到了这种行为,但我一直认为这是一个调试配置问题。您是否在发布模式下构建所有内容并在 web.config 中关闭了调试功能?

    【讨论】:

    • 是的,我已经关闭了调试功能。
    【解决方案5】:

    ASP.NET 应用程序具有全局会话锁。

    对 WebForms 使用 EnableSessionState="ReadOnly",对 MVC 使用 [SessionState(SessionStateBehavior.ReadOnly)]。它将防止锁定(当然您不能向只读会话写入任何内容)。

    I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2023-03-28
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多