![循环法与粘性 IP 如何影响性能](https://linux22.com/image/527913/%E5%BE%AA%E7%8E%AF%E6%B3%95%E4%B8%8E%E7%B2%98%E6%80%A7%20IP%20%E5%A6%82%E4%BD%95%E5%BD%B1%E5%93%8D%E6%80%A7%E8%83%BD.png)
我正在分析负载平衡 WSS 3.0 站点上的性能问题。
该站点使用循环负载平衡和带有 NTLM 的 Windows 身份验证。
问题之一似乎是 http 401.2 响应过多。有时会出现五个 401.2 响应,然后是一个 401.1 响应,接着是一个 200 响应。请求的每个文件都会进行此握手。
我想知道循环是否导致了额外的 401.2 响应。
答案1
也许这是因为如果您需要有状态的连接,则每个请求的身份验证都不好。当负载平衡器设置为使用循环时,我见过类似的情况。发生的情况是,WSS 上的 ViewState 针对服务器进行身份验证,并且使用机器密钥对 ViewState 进行加密。如果这些密钥未在组内的所有服务器上同步视图状态会很差,并强制重新进行身份验证……这种情况会一直发生,直到对同一台服务器发出 2 或 3 个请求。第一个请求未获得授权(请求 1),我们知道这是因为这是一个新用户,因此下一个请求发送身份验证(请求 2),下一个请求发送在请求 1 上发送的请求,但视图状态良好(请求 3)。如果在此请求链中的任何时候您被发送到另一台服务器,它将重新开始。
检查系统日志,您是否有一堆因视图状态错误而产生的 asp.net 错误?奇怪的加密错误?我不知道 WSS 是否在它们到达该日志之前捕获了这些错误,在许多 .net 应用程序中,这些错误不会被捕获,但可以在事件查看器中看到。
解决这个问题的方法是同步密钥或使用粘性。
答案2
我不清楚您是在谈论循环 DNS 负载平衡,还是在使用对 HTTP 会话进行循环负载平衡的第 7 层负载平衡器。我也不清楚您是否允许客户端使用 HTTP/1.1 持久连接到应用服务器。
简而言之,DNS 负载平衡不应该导致您看到的行为。第 7 层负载平衡肯定会导致这种情况,特别是如果您不允许客户端保持与应用程序服务器的持久连接。
在 NTLM-over-HTTP 环境中,客户端请求出现一定数量的 401 响应是正常的。NTLM-over-HTTP 握手如下:
- 客户发出请求
- 服务器以“401.2 未授权”和“WWW-Authenticate: NTLM”响应标头进行响应
- 客户端使用另一个带有“Authorization: NTLM”标头和初始 NTLM 身份验证响应的请求进行响应
- 服务器以“401.1 Unauthorized”和包含 NTLM 质询的“WWW-Authenticate: NTLM”响应标头进行响应
- 客户端使用另一个带有“Authorization: NTLM”标头的请求进行响应,并且 NTLM 响应
- 服务器满足客户端的请求(即通过了身份验证)
您可以通过以下网址获取更深入的背景信息http://www.innovation.ch/personal/ronald/ntlm.html(包括标题的逐字节描述等)。
NTLM-over-HTTP 身份验证会验证每个连接,因此需要连接保持活动或 HTTP/1.1 持久会话。假设您没有使用持久连接,而是在不同的 IIS 服务器之间随机弹跳客户端请求和对 NTLM 质询的响应,那么您将遇到问题(坦率地说,我无法想象它甚至会起作用)。