对 ARR 版本 2.0 或更高版本中的缓存项进行故障排除
适用于: Internet Information Services
概述
在本演练中,可以了解如何在请求通过 ARR 时跟踪请求,并将其发送到下一层服务器,并查看可获取的信息以确定请求的发送位置以及从何处提供服务。
此疑难解答中使用的工具
- ARR 帮助程序
- 失败的请求跟踪 (FREB)
- IIS 高级日志记录
- 网络监视器
了解场的体系结构
第一步是了解环境的体系结构,包括以下内容。
- ARR 场拓扑(有多少服务器、如何配置路由、其他设备)
- URL 重写规则到位
在本演练中,可以使用以下配置来跟踪请求。
磁盘缓存配置
以下代码片段显示了配置最大大小为 100 GB 的本地驱动器。
<diskCache>
<driveLocation path="E:\temp$\arrcache" maxUsage="100" />
</diskCache>
全局缓存控制规则
当不存在缓存控制指令时,此规则定义为缓存 60 分钟。
<rule name="ARR_CacheControl_b5aec65d-6327-407f-a28c-b34e48c5cda2" enabled="true" patternSyntax="Wildcard">
<match url="*" />
<serverVariables>
<set name="ARR_CACHE_CONTROL_OVERRIDE" value="0,max-age=3600" />
</serverVariables>
</rule>
生成数据收集计划
本部分将引导你完成缓存命中和未命中流,因为它们通过 ARR 传输,并识别可用于调查请求的任何工具或日志。 以下步骤概述了以前未使用作为参考提供的配置和每个步骤中使用的工具缓存的内容的请求流。
请求的内容未在本地找到(既不在内存中,也没有在子节点上的磁盘上)。
- FREB 日志
- IIS 内置日志记录
- 网络监视器
该请求转发到下一层缓存节点(父节点)。
- FREB 日志
- IIS 高级日志记录模块
- IIS 内置日志记录
- 网络监视器
在下一层缓存节点上找不到请求的内容(既不在内存中,也不在磁盘上)。 根据缓存层次结构重复点 2 的次数。
该请求转发到源服务器。
- FREB 日志
- IIS 内置日志记录
- 网络监视器
收集数据
请求的内容未在本地找到(既不在内存中,也不在磁盘上)
在这里,可以在 IIS 日志或 FREB 日志中标识缓存命中或未命中。 FREB 日志提供了其他详细信息,例如请求的路由位置,如果有多个下层服务器,这一点很重要。
IIS 日志条目 - 可以在 cs-uri-query 字段中找到以下条目,用于标识缓存命中或未命中和请求的 GUID,可用于标识下层服务器上的请求。
X-ARR-CACHE-HIT=0
0 = Cache miss, 1 = Cache hit
X-ARR-LOG-ID=62a3161c-b4f5-408e-9ce7-55d25c018aea
Guid identifying this request. This can be used to track as the request is passed to Parent nodes.
FREB 日志条目 - 缓存未命中由条目 ARR_DISK_CACHE_GET_FAILED
找到。
类型 | 条目 | 详细信息 |
---|---|---|
r | ARR_DISK_CACHE_GET_FAILED 警告 | FilePath="\?\C:\ARRCache\localhost\iisstart.htm.full", ErrorCode="系统找不到指定的文件。 (0x80070002)", IsRangeEntry="false", RangeOffset="0", RangeSegmentSize="0" |
标识将请求路由到的服务器。 观察要发送到服务器 W2K8WEBSERVER2
的请求,该请求将是下一级服务器进行数据评审。
类型 | 条目 | 详细信息 |
---|---|---|
i | ARR_SERVER_ROUTED | RoutingReason="LoadBalancing", Server="W2K8WEBSERVER2", State="Active", TotalRequests="8", FailedRequests="0", CurrentRequests="1", BytesSent="1127", BytesReceived="6441379", ResponseTime="31351" |
以下标头将添加到要转发的请求中。 如果某些名称与默认名称(例如 X-Forwarded-For
, X-ARR-ClientCert
)不同,并且 X-ARR-LOG-ID
已在服务器场代理设置中自定义名称。
头文件 | 详细信息 |
---|---|
GENERAL_SET_REQUEST_HEADER | HeaderName="Max-Forwards", HeaderValue="10", Replace="true" |
GENERAL_SET_REQUEST_HEADER | HeaderName="X-Forwarded-For", HeaderValue="127.0.0.1:62489", Replace="true" |
GENERAL_SET_REQUEST_HEADER | HeaderName="X-ARR-SSL", HeaderValue="", Replace="true" |
GENERAL_SET_REQUEST_HEADER | HeaderName="X-ARR-ClientCert", HeaderValue="", Replace="true" |
GENERAL_SET_REQUEST_HEADER | HeaderName="X-ARR-LOG-ID", HeaderValue="fe9d20da-a571-4451-8ef3-0e7faf1a463a", Replace="true" |
请求将转发到下一层缓存节点(父节点)
在上一步中,你已将此服务器标识为 W2K8WEBSERVER2
。 在此步骤中,可以检查此服务器上的以下数据。 可以使用多个数据点。 使用 X-ARR-LOG-ID
时,可以确定请求是否已到达此服务器。
FREB 日志 - 请求可由从子节点发送来标识 X-ARR-LOG-ID
。 在上一步中标识了该 fe9d20da-a571-4451-8ef3-0e7faf1a463a
信息。
头文件 | 详细信息 |
---|---|
GENERAL_REQUEST_HEADERS | Headers="Connection: Keep-Alive Accept: */* Host: localhost Max-Forwards: 10 X-Original-URL: /iisstart.htm X-Forwarded-For: 127.0.0.1:62489 X-ARR-LOG-ID: fe9d20da-a571-4451-8ef3-0e7faf1a463a |
IIS 高级日志记录模块 - 通过使用高级日志记录,可以根据标头X-Forwarded-For
X-ARR-LOG-ID
添加自定义日志记录字段,然后使用筛选仅记录这些标头。
#Software: IIS Advanced Logging Module
#Version: 1.0
#Start-Date: 2009-10-16 18:42:51.494
#Filter: ((ARRLogID isPresent ) || (xforward isPresent ))
#Fields: date time cs-uri-stem cs-uri-query s-contentpath sc-status s-computername cs(Referer) sc-win32-status sc-bytes cs-bytes X-ARR-LOG-ID X-Forwarded-For
2009-10-16 18:51:29.983 /iisstart.htm - "C:\inetpub\wwwroot\iisstart.htm" 200 "W2K8WEBSERVER2" - 0 1680 219 "fe9d20da-a571-4451-8ef3-0e7faf1a463a" "127.0.0.1:62489"
网络监视器 - 使用跟踪来标识 X-ARR-LOG-ID
特定请求,以及 X-Forwarded-For
是否要跟踪特定请求。
ARR 帮助程序 - 此模块将 X-Forwarded-For
标头添加到 C-IP
字段,并将 X-ARR-LOG-ID
标头添加到 cs-uri-query
默认 IIS 日志的字段。
注意
Microsoft目前不支持 ArrHelper。
针对多个缓存级别重复步骤 1 和步骤 2
如果服务器父节点 W2K8WEBSERVER2
设置了 ARR 和缓存功能,则可能需要检查 IISLOGS 或 FREB,以查看是否存在缓存命中或未命中,并决定根据缓存的条目状态继续执行的位置。
该请求转发到源服务器
此步骤可以被视为正常的 HTTPS 请求,并可以使用以下工具进行跟踪:
- 网络监视器 - 捕获源服务器上的跟踪,以验证是否收到请求。
- IIS 日志 - 检查 IIS 日志中是否有要跟踪的内容的 HTTP 响应代码。
- IIS FREB 日志 - 如果在网络跟踪中找到请求,并且 HTTP 响应代码不是 200,则可能需要再次使用 FREB 来解决问题。
排查缓存失败问题
检查缓存控制标头
验证从客户端收到的 Cache-Control 标头。 这可以与检查缓存控制规则结合使用,因为可以将标头配置为替代标头。
查看 ARR 中的缓存控制规则
检查 ARR 中的缓存控制规则,以验证是否启用了 ARR 缓存。
验证 HTTP.SYS 设置
有关内容在内核中HTTP.sys缓存的原因的详细信息,请参阅HTTP.sys不缓存内容的实例。
磁盘缓存故障
当发生磁盘故障并将磁盘标记为不正常时,ARR 会将事件记录到应用程序事件日志。
Log Name: Application
Source: Application Request Routing
Date: 11/2/2009 5:26:59 PM
Event ID: 1006
Task Category: None
Level: Warning
Keywords: Classic
User: N/A
Computer:
Description: Drive with path '\?\E:\temp$\arrcache\' is being marked unhealthy. The data contains the error code.
Event Xml: