请求限制
上次修改时间: 2015年3月9日
适用范围: SharePoint Foundation 2010
本文内容
请求限制概述
限制控制系统初始化
确定是否阻止请求
注册的性能计数器
请求分类器
健康评分计算器
本主题介绍在前端 Web 服务器太忙而无法处理所有进入的请求时用于限制 HTTP 请求的 Microsoft SharePoint Foundation 系统的说明。
请求限制概述
SharePoint Foundation 包括一个系统,用于监视各种 Windows Server 2008 性能计数器,并在任一计数器指示服务器太忙而无法处理其接收的所有请求时限制(即阻止)HTTP 请求。通过管理中心应用程序或使用 SharePoint Management Shell 中的 PowerShell 命令可针对特定 SharePoint Foundation Web 应用程序打开或关闭该监视和限制系统。可通过 SharePoint Foundation 对象模型或 SharePoint Management Shell 中的 cmdlet 修改该系统。
提示 |
---|
在尝试针对 SharePoint Foundation 的监视和限制对象模型编程之前,您应熟悉性能计数器的 Windows Server 2008 系统以及类别(也称为性能对象)、计数器 和实例 的概念。有关这些问题以及创建自己的性能计数器的详细信息,请参阅以下主题:
|
限制控制系统初始化
限制控制系统在首个对特定前端 Web 服务器上特定工作进程的 HTTP 请求的 BeginRequest 事件期间初始化。之后对相同进程的请求重复使用在首次请求中初始化的实体和线程。如果重置了该 Web 应用程序,系统会在重置后使用第一个请求重新初始化。初始化中的两个主要步骤在以下小节中说明。
创建性能检查器
每个前端 Web 服务器上的每个 Web 应用程序的每个工作进程都具有其自己的性能检查器,该检查器通过来自 Web 应用程序的 HttpThrottleSettings 属性的信息进行初始化。该检查器由以下主要部分组成:
一组健康评分,监控的每个性能计数器有一个评分。这些评分是 0 到 10 的 Int32 值,其中 0 是最健康的得分,而 10 是最不健康的得分。
进程的整体健康评分也是 0 到 10 的 Int32 值。
对于监控的每个计数器,从计数器读取(取样)的一组原始性能值。它们按从最旧到最新取样的顺序排列。
一个服务器状态检查线程,用于定期对计数器值取样。
一项刷新间隔时间设置,确定对计数器重复取样的频率。默认为 5 秒。
启动服务器状态检查线程
创建检查器时,会创建服务器状态检查线程。该线程按检查器的刷新间隔所指定的时间间隔循环执行以下步骤。
获取 Web 应用程序的 HttpThrottleSettings 属性中的 SPHttpThrottleSettings 对象。(该对象可能在上次循环后发生变化;例如,可能已更改刷新间隔或向所监控的性能计数器列表添加了其他计数器。)
确认自上次循环后请求限制未关闭。
使用来自 SPHttpThrottleSettings.RefreshInterval 的值设置检查器的刷新间隔。
调用 GenerateMonitors() 方法。该方法为需要监控的每个性能计数器创建一个 SPSystemPerformanceCounterMonitor 对象。关于哪些服务器计数器需要监控的信息由一组永久性 SPPerformanceMonitorCreationData 对象提供。每个需要监控的计数器均对应其中一个对象。这些创建数据对象中的每一个都有一个关键 SPHealthScoreCalculator 子对象。该对象可以将性能计数器值转换为 0 到 10 的健康评分。(它还可以取多个性能值的数学函数结果并将其转换为健康评分。)
每个监视程序从其监控的计数器获取最新值采样,然后将该值存储到检查器的对应计数器的一组原始性能值中。
每个监视程序更新其监控的计数器的健康评分。此步骤包括以下子步骤:
太旧而相关性较低的取样值将会从原始性能值集中被删除。仅保留最近的 n 个值,其中 n 是 HttpThrottleSettings.NumberOfSamples 属性的值。
一个数学函数应用到剩余值,以得出这些值的加权平均数。值越新,权重越大。
监视程序使用其健康评分计算器根据加权平均数计算出 0 到 10 的健康评分。
该工作进程的整体健康评分设置为各监视程序得分中的最高(最不健康)得分。
设置限制级别要遵循以下规则:
如果进程的整体健康评分低于 10,则无需限制请求,因此限制级别设置为 Normal。
如果整体健康评分是 10(最高可能得分及最不健康得分),但在 10 分的位置少于 60 秒,则限制级别将设置为 FirstStage。这意味着系统会阻止某些特定类别的 HTTP 请求并向客户端发送 HTTP 503 错误("服务不可用")。此限制仅影响分配给相同工作进程的请求。有关系统如何确定阻止哪些请求类别,及其如何确定给定请求所属的类别的信息,请参阅下面的确定是否阻止请求。
如果整体健康评分是 10 且处于 10 的位置至少 60 秒,则限制级别将设置为 SecondStage。这意味着系统将阻止其他类别的请求。
检查线程等到刷新间隔时间过后,再重复检查。
备注
如果限制级别为 FirstStage 或 SecondStage,则继续对该工作进程进行限制,直到其整体健康评分在检查线程的某个周期中重新设置为 10 以下的值。
确定是否阻止请求
如果为特定 Web 应用程序打开了监视和限制系统,则在给定 HTTP 请求的 PostResolveRequestCache 事件期间会确定是否阻止该请求。具体地说,要执行以下步骤:
初始化 HTTP 响应对象并将包含工作进程整体健康评分的标头添加到该对象。
检查该进程的限制级别以确定是否为 FirstStage 或 SecondStage。如果不是上述二者,则该进程不处于限制模式,将跳过剩余步骤。
如果该进程处于限制模式,则请求由 Web 应用程序的每个限制分类器进行检测。限制分类器是存储在 HttpThrottleSettings.ThrottleClassifiers 属性中的永久性对象。每个限制分类器实质上是一个 HTTP 请求类别的定义。您可以使用 HTTP 请求的任何特性组合来于定义类别,包括所请求资源的文件扩展名、特定标头的值、用户代理以及 HTTP 方法(例如,"GET"或"POST")。分类器具有一个 ThrottleLevel 属性,该属性指定是将属于该类别的请求限制在 FirstStage、SecondStage 中,还是根本不限制。请求阻止与否取决于如下规则:
如果工作进程具有限制级别 FirstStage,则具有限制级别 FirstStage 的类别中的所有请求,以及不属于任何定义类别的请求 将被阻止。
如果工作进程具有限制级别 SecondStage,则除了工作进程具有限制级别 FirstStage 时被阻止的那些请求外,具有限制级别 SecondStage 的类别中的请求也会被阻止。
备注
因为不匹配任何分类器的请求在 FirstStage 限制模式中会被阻止,所以您必须以编程方式为不希望在第二阶段之前被阻止的每种请求创建一个分类器对象,并使用 SecondStage 的 ThrottleLevel 构建该对象。类似地,如果有一类请求永不应阻止,则您必须使用 Never 的 ThrottleLevel 构建分类器对象。有关分类器对象的详细信息,请参阅本主题后面的请求分类器。
对于任何被阻止的请求,会向其客户端发送 HTTP 503 错误。
备注
如果一个请求属于多个类别,而这些类别的限制级别不相同,则将按照最严格的限制类别限制该请求。例如,如果一个请求同时属于限制级别为 FirstStage 的类别和仅在达到 SecondStage 才会被限制的类别,则它将会在第一阶段受到限制。
注册的性能计数器
初次安装 SharePoint Foundation 时,可能会在初始的"SharePoint – 80"Web 应用程序上自动注册某些性能计数器,以供监视和限制系统进行跟踪。可通过编程方式或通过使用 SharePoint Management Shell 中的 cmdlet 在系统中添加或删除计数器。若要获取任何给定 Web 应用程序的已注册计数器列表,请使用 SharePoint Management Shell 中的以下 cmdlet。
Get-SPWebApplicationHttpThrottlingMonitor –identity http://<Web application URL>
下表是 SharePoint Foundation 管理员可能希望为 Web 应用程序监视的计数器的典型列表。
性能类别 |
计数器 |
实例名称(如果超过一个) |
---|---|---|
Memory |
Available Mbytes |
此计数器仅有一个实例。 |
ASP.NET |
Requests Queued |
此计数器仅有一个实例。 |
ASP.NET |
Request Wait Time |
此计数器仅有一个实例。 |
Processor |
Interrupts/sec |
_Total |
有关如何以编程方式注册或取消注册 Web 应用程序的性能计数器的信息,请参阅如何:注册或取消注册性能计数器。
请求分类器
HTTP 请求分类器是派生自 SPRequestThrottleClassifier 的类对象。这些对象作为 HttpThrottleSettings.ThrottleClassifiers 属性的值永久保留在配置数据库中。在对象模型中有一些 SPRequestThrottleClassifier 派生的类。这些类的属性只读,因此您无法更改现有的请求分类器对象,但您可以将具有不同属性值的新分类器对象添加到存储并删除旧的分类器对象。这些类是封装类;但您可以创建每个类的新对象,并可以从 SPRequestThrottleClassifier 派生您自己的分类器类。下表显示各个类以及每个类可用于定义的请求类别类型。该表还显示默认限制级别,除非在创建分类器对象时指定了不同的级别,否则将在默认限制级别下限制匹配请求。
类型 |
类别 |
默认限制级别 |
---|---|---|
对具有特定文件扩展名的资源的请求 |
||
包含特定标头的请求 |
||
具有特定用户代理或使用特定 HTTP 方法的请求 |
||
来自搜索爬网程序的请求 |
备注
对于不匹配任何分类器的请求,系统默认在第一阶段阻止它们,因此对于应从限制中排除的任何请求,您必须专门创建一个具有 Never 限制级别的分类器对象。
有关以编程方式注册和取消注册请求分类器对象的详细信息,请参阅如何:创建和注册或取消注册请求分类器。有关新建分类器类别的信息,请参阅如何:创建新的请求分类器。
健康评分计算器
健康评分计算器将来自性能计数器的原始值(或某个函数应用到多个原始值的结果)转换为 0 到 10 的健康评分,其中 0 表示计数器最健康的可能状态,10 代表最不健康的状态。计算器是派生自 SPHealthScoreCalculator 的某个类的对象。在对象模型中已经有一个这样的类:SPBucketHealthScoreCalculator。该类的对象将计数器的可能值范围划分为子范围,称为"Bucket"。该对象具有一个 CalculateScore(Double) 方法,此方法基于值所处的 Bucket 将健康评分分配到某个值。仅在最不健康 Bucket 中的值获得最不健康的得分 10。
Bucket(即子范围边界)是在构建 SPBucketHealthScoreCalculator 对象时定义的,可通过 SetScoreBuckets([]) 方法进行更改。
重要信息 |
---|
定义要传递给 SPBucketHealthScoreCalculator 对象的 Bucket 时,请注意以下问题:
因此,如果有必要在给定计数器的加权平均值达到某特定值时打开限制,请确保您所定义的 Bucket 能使该值处于最不健康的 Bucket 中。 |
如果您希望 CalculateScore(Double) 方法具有不同行为的 Bucket 式计算器,或如果您需要根本不使用 Bucket 系统的健康评分计算器,请根据需要从 SPHealthScoreCalculator 派生一个新类并实现 CalculateScore(Double) 方法。
健康评分计算器对象作为 SPPerformanceMonitorCreationData 对象的一个属性永久保存在配置数据库中。
有关创建健康评分计算器以及将其分配到监视创建数据对象的详细信息,请参阅如何:创建、修改和更改区域样式运行状况分数计算器。