【问题标题】:How to trace overhead added by Application Request Routing?如何跟踪应用程序请求路由增加的开销?
【发布时间】:2013-11-12 15:54:20
【问题描述】:

我们有一个需要启用 SSL 的 Delphi SOAP 服务。我选择使用 IIS ARR 反向代理来进行 SSL 卸载,以便于配置(与 OpenSSL 和手动证书 + 密码管理相比)。 ARR 有效,但它增加了大量的开销...... 18 个服务请求的响应时间从 不到 2 秒到 19 秒(压缩后总计约 60Kb)。

我为客户端和服务器添加了时间戳日志记录,用于发送和接收消息。它显示从客户端发送到服务接收之间通过 ARR 的每个请求路由增加了大约 1 秒。响应很快被路由回来,只有通过 ARR 的请求路由很慢(见下图)。

如何追踪开销的来源? ARR 不适合这个用例吗?我尝试调整和禁用大多数设置,包括缓存。我尝试了具有干净 IIS 设置的不同主机,包括生产 Windows Server 2012。SSL 本身不是开销,只是使用 ARR HTTP 反向代理会导致延迟。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:8987/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

来自 Fiddler 的请求和响应示例:

【问题讨论】:

  • 不应该看到这种类型的延迟。首先想到的是您的应用程序池超时设置,它们是否正在关闭并且延迟是池在每个请求时启动?确保它们永远不会因为空闲而关闭。
  • @dirt 感谢您的回复。我的应用程序池空闲关闭设置为两天,并且仅在内存使用限制违规时回收。我目前在“无托管代码”和集成管道上。 IIS 跟踪显示延迟在 ARR 的 EXECUTE_REQUEST_HANDLER 上(我在您的评论之后添加了图像)。
  • @carlmon 只是想知道你是否解决了这个问题?我怀疑我的环境中的 ARR 性能(虽然没有这么糟糕),ps:我看到 ARR 3.0 刚刚发布了 beta 版。
  • 没有解决办法。这都是 ARR 3.0。我们发布时没有使用 SSL,并且可能会在下一次更新中使用 Delphi 中的 OpenSSL 来支持 SSL。
  • 在重写操作 URL 中将 localhost 更改为 127.0.0.1 将加载时间显着减少。

标签: iis soap iis-7 arr iis-arr


【解决方案1】:

我们有同样的问题。我找到了根,它在 System.Net.Sockets.Socket.DoConnect 问题与 IPv6 有关:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/203b6230-e4c0-477c-9a0a-0c21a7ad1615/strange-onesecond-delay-with-tcpconnections-to-localhost?forum=clr

http://msdn.microsoft.com/en-us/library/115ytk56.aspx

"如果启用了 IPv6 并且调用了 TcpClient(String, Int32) 方法以连接到同时解析为 IPv6 和 IPv4 地址的主机,则将首先尝试连接到 IPv6 地址,然后再尝试 IPv4 地址。这可能如果主机未在侦听 IPv6 地址,则会延迟建立连接的时间。"

要解决环回请求,您需要在机器上禁用 IPv6,请参阅第 4-5-6 页: https://stackoverflow.com/a/12403731

【讨论】:

  • 我没有禁用 ipv6,而是使用了 127.0.0.1,因此它与 ipv4 连接并获得了预期的响应时间。
  • 至少 30 分钟研究这个并将我的重写从 localhost 更改为 127.0.0.1 解决了它,谢谢!
【解决方案2】:

我的建议:对应用程序使用 IIS,对代理使用 Apache HTTP Daemon。

过去,我曾使用各种软件和硬件进行 SSL 卸载(我认为是从 2003 年的某个地方开始)。每个都有自己的定价水平和功能。在过去的几年里,我已经转而只使用 Apache HTTP Daemon 来实现这个目的。即使与 IIS 和 Windows 结合使用。一旦您有一个正在运行的示例,Apache 就很容易配置,并且通过转发和重命名更容易扩展到更复杂的场景。

有关如何在 Windows 上使用 Apache HTTP Daemon 作为 SSL 卸载引擎的一些说明可以在 http://www.invantive.com/about-invantive/news/entryid/897/ssl-offloading-for-apache-tomcat 上找到。

【讨论】:

  • 感谢 Guido,但我无法控制部署环境,这将我限制为 IIS 反向代理或在我的 Delphi 进程中手动使用 OpenSSL(这很痛苦)。我确实在其他网站上使用 Apache SSL 卸载,它就像一个魅力。
  • 嗨,好的,我明白了,至少在过去很难正常工作。祝你好运!
【解决方案3】:

按照 Dmitry 的建议关闭 IPv6,为我解决了这个问题。

你也可以在你的重写中使用 127.0.0.1,而不是 localhost,来强制 IPv4。

【讨论】:

  • 感谢您的反馈,但您应该通过勾选 Dmitry 的正确答案并删除此答案来表明这一点。
  • 感谢您的反馈,但我不是原始发帖人。我确实已经赞成 Dmitri 的回答,但我也建议了我的替代解决方案:)
  • 对不起,我一定丢了!
【解决方案4】:

我会说你的设置有问题。我们目前为 SSL 卸载运行 ARR 并进行了大量吞吐量测试,ARR 对吞吐量几乎没有影响。

我同意 Brock 的观点,并说首先检查您的应用程序池设置。基本上,ARR 应用程序池应设置为永不回收。

我建议从以下位置开始观看第 32-38 集: http://dotnetslackers.com/articles/iis/Bindings-and-Rules-for-Application-Request-Routing-ARR-Week-32.aspx

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2019-02-12
    • 2015-02-06
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多