SQL Server 性能计数器评估指南:SQL Assessment API 中 Performance Probe 的配置、数据变换与多实例实战
发布时间:2026/9/25 3:42:50来源:尧图网络
示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载SQL Assessment API 提供了一套可扩展的机制来评估 SQL Server 实例配置是否符合最佳实践。Performance probe性能探针是其中用于采集 Windows 性能计数器Performance Counter数据的核心探针类型其返回的多条样本数据需要配合performance 数据变换Data Transformation计算平均值、比率、速率等派生值最终由检查规则Rule的条件表达式判定合规性。读完本文你将掌握 Performance probe 的完整 JSON 配置语法、计数器别名与实例过滤技巧、五种派生值函数的数学含义与适用场景以及在同一检查中正确使用多个计数器并规避多实例结果错位陷阱的实战方案。Performance probe 是什么Performance probe 的类型代码Type code为Performance用于读取目标机器上的性能计数器值如Buffer Manager、Latches、Databases、Memory Node、Access Methods等性能对象下的计数器。它并不是一个独立的检查而是作为数据源供规则引用探针负责取数performance 数据变换负责把多份样本加工成单个派生值规则条件再基于该值做出合规性判断。从 SQL Assessment API 的探针体系看Performance是众多探针类型中的一种。在 Probe 文档 中列出的可用探针类型还包括 AzGraph、AzMetadata、CMD、External、PowerShell、Registry、SQLT-SQL与 WMI。其中 T-SQL 探针从动态管理视图DMV取数而 Performance 探针与 WMI 探针一样数据来自操作系统层因此它适合捕捉 T-SQL 查询无法直接暴露的运行时指标例如缓冲区命中率、闩锁等待时间、每秒事务数等。samples/manage/sql-assessment-api/docs/Reference/Probes/Performance.mdImplementation 属性采样频率与计数器清单Performance probe 的implementation部分包含三个参数参数是否必填类型默认值说明numberOfSamples可选number2采集的样本数量interval可选number1两次采样之间的时间间隔秒counters必填object—需要采集的性能计数器清单numberOfSamples探针会对每个计数器连续采样 N 次。默认 2 次意味着拿到两个样本足以支撑差值型派生值如 rate、delta_ratio、ratio的计算某些场景如求平均值可提高采样次数以获得更稳定的统计结果。interval相邻样本的采集间隔秒。默认 1 秒。对于瞬态波动明显的计数器如Pages Allocated/sec合理调整采样间隔能反映更真实的负载特征。counters必填。这是一个 JSON 对象其每个属性名对应一个性能对象Performance Object例如Latches、Databases、Buffer Manager每个性能对象的值又是一个 JSON 对象其中的每个属性代表该对象下的一个性能计数器。Performance probe 的整体结构可参考仓库中的结构图 BasicPerformanceProbeStructure.svg计数器别名与实例过滤计数器名称常常包含空格和其他非字母数字字符例如Pages Allocated/sec无法直接在条件表达式和消息模板中引用。因此每个计数器都必须指定一个别名alias——别名将作为该计数器在检查条件与消息中使用的变量名。此外计数器可选地声明一个感兴趣的实例列表instances。例如 SQL Server 的Databases性能对象下Transactions/sec计数器会为每个数据库实例分别报告值其中_Total代表汇总实例而Memory Node对象下的计数器则按 NUMA 内存节点实例报告。示例一最简单的单对象单计数器下面的配置为Access Methods对象下的Pages Allocated/sec计数器采样并把结果以pages_allocated变量提供给检查使用{ type: Performance, implementation: { Counters: { Access Methods: { Pages Allocated/sec: pages_allocated } } } }示例二调整采样次数为Memory Node对象下的Free Node Memory (KB)计数器只采集 1 个样本此时该计数器只适合使用average、min、max这类不依赖多个样本的派生函数{ type: Performance, implementation: { NumberOfSamples: 1, Counters: { Memory Node: { Free Node Memory (KB): free_node_memory } } } }示例三多对象、别名与实例过滤的组合同时采集Memory Node与Access Methods两个性能对象其中Free Node Memory (KB)通过对象式写法指定alias为free_node_memory且instances限定为[000]仅取编号为000的 NUMA 节点实例而Target Node Memory (KB)则使用字符串简写形式{ type: Performance, implementation: { NumberOfSamples: 1, Counters: { Memory Node: { Free Node Memory (KB): { alias: free_node_memory, instances: [000] }, Target Node Memory (KB): target_node_memory }, Access Methods: { Pages Allocated/sec: pages_allocated } } } }可见计数器值的两种写法等价字符串简写计数器名: 别名与对象写法计数器名: { alias: ..., instances: [...] }。需要过滤实例时使用对象写法。完整 ruleset 示例五个基于性能计数器的检查下面是一份完整可用的规则集 JSON与文档保持一致它同时定义了 5 个针对Server目标的规则以及一个名为PerformanceProbe的探针定义。通过这个例子可以完整看到规则rules 探针probes 变换transform三者如何协作{ schemaVersion: 1.0, name: Performance Checks Example, version: 1.0, rules:[ { target: { type: Server }, id: TotalPages, itemType: definition, displayName: Buffer Manager Total pages, description: Use \average\, \min\, or \max\ for counter type PERF_COUNTER_LARGE_RAWCOUNT(65792)., message: Total pages ({total_pages}) is greater than 0, condition: { lt: [total_pages, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { total_pages: average } } } ] }, { target: { type: Server }, id: CacheHitRatio, itemType: definition, displayName: Buffer Manager cache hit ratio, description: Use \ratio\ for counter type PERF_LARGE_RAW_FRACTION(537003264) and specify base PERF_LARGE_RAW_BASE(1073939712)., message: Cache hit ratio ({cache_hit_ratio:P0}) is greater than 0, condition: { lt: [cache_hit_ratio, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { cache_hit_ratio: { type: ratio, base: cache_hit_ratio_base } } } } ] }, { target: { type: Server }, id: LatchWaitTime, itemType: definition, displayName: Average Latch Wait Time, description: Use \delta_ratio\ for counter type PERF_AVERAGE_BULK(1073874176) and base PERF_LARGE_RAW_BASE(1073939712)., message: Average Latch Wait Time ({latch_wait_time}ms.) is greater than 0, condition: { lt: [latch_wait_time, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { latch_wait_time: { type: delta_ratio, base: latch_wait_time_base } } } } ] }, { target: { type: Server }, id: TransactionsPerSec, itemType: definition, displayName: Database Transactions per sec, description: Use \rate\ for counter type PERF_COUNTER_BULK_COUNT(272696576)., message: Transactions per sec ({transactions_sec:0.##}sec.) for database {instance_name} is greater than 0, condition: { or: [{eq: [instance_name, _Total]}, {le: [transactions_sec, 0]}] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { transactions_sec: rate } } } ] }, { target: { type: Server }, id: TotalTransactionsPerSec, itemType: definition, displayName: Total Database Transactions per sec, description: Use \rate\ for counter type PERF_COUNTER_BULK_COUNT(272696576)., message: Total Transactions per sec ({transactions_sec:0.##}sec.) is greater than 0, condition: { lt: [transactions_sec, 0] }, probes: [ { id: PerformanceProbe, transform: { type: performance, counters: { transactions_sec: { type: rate, instance: _Total } } } } ] } ], probes:{ PerformanceProbe: [{ type: Performance, implementation: { Counters: { Buffer Manager: { Buffer cache hit ratio: cache_hit_ratio, Buffer cache hit ratio base: cache_hit_ratio_base, Target pages: total_pages }, Latches: { Average Latch Wait Time (ms): latch_wait_time, Average Latch Wait Time Base: latch_wait_time_base }, Databases: { Transactions/sec: transactions_sec } } } }] } }逐规则要点解读TotalPagesTarget pages属于PERF_COUNTER_LARGE_RAWCOUNT(65792)类型的原始计数值适合用average或min/max派生条件lt: [total_pages, 0]即总页数小于 0 则告警。CacheHitRatioBuffer cache hit ratio属于PERF_LARGE_RAW_FRACTION(537003264)比例型计数器必须配套其 base 计数器Buffer cache hit ratio base类型PERF_LARGE_RAW_BASE(1073939712)在变换中使用ratio类型并指定base。消息模板{cache_hit_ratio:P0}中的P0表示按百分比格式显示。LatchWaitTimeAverage Latch Wait Time (ms)属于PERF_AVERAGE_BULK(1073874176)平均型计数器同样需要 base 计数器使用delta_ratio类型派生。TransactionsPerSecTransactions/sec属于PERF_COUNTER_BULK_COUNT(272696576)速率型计数器使用rate派生。由于它按数据库实例分别报告条件用or组合instance_name等于_Total时跳过或transactions_sec 0时告警。{transactions_sec:0.##}表示保留两位小数的数值格式。TotalTransactionsPerSec在变换层用instance: _Total直接过滤出汇总实例条件只需比较单一值。关于condition中使用的运算符lt、or、eq、le等可参考 Operators 参考文档其中还包含match正则匹配、interval区间取值等更复杂的判定手段。规则的其他属性message模板、displayName、description、itemType的完整语义见 Rule 文档。performance 数据变换五种派生值函数Performance probe 返回的是包含多次样本的表格而检查需要一个派生值。performance变换详见 DataTransformation/performance.md为每个计数器计算指定的派生值。相关符号约定n— 该计数器的样本数量c₁、c₂— 该计数器的样本值t₁、t₂— 样本的时间戳b₁、b₂— base 计数器的样本值类型参数公式适用计数器类型average—(1/n) · ΣcᵢPERF_COUNTER_LARGE_RAWCOUNT(65792)等原始计数值delta_ratiobase_counter(c₂ − c₁) / (b₂ − b₁)PERF_AVERAGE_BULK(1073874176)如平均闩锁等待时间需配 basemin/max—所有样本的最小值 / 最大值原始计数值用于极值监控rate—(c₂ − c₁) / (t₂ − t₁)PERF_COUNTER_BULK_COUNT(272696576)每秒计数类ratiobase_counter(c₂/b₂ c₁/b₁) / 2PERF_LARGE_RAW_FRACTION(537003264)如缓存命中率需配 base要点rate 与 average 的区别rate计算的是两个样本的差值 ÷ 时间戳差值即真正的每秒速率适用于Transactions/sec这类本身就是每秒次数的计数器average则是多个样本的算术平均适用于静态量如总页数。ratio 与 delta_ratio 的区别ratio是两次采样的比值取平均delta_ratio是两次采样差值的比值两者都要求指定base计数器且 base 计数器必须与主计数器同时出现在探针的Counters配置中如示例中的Buffer cache hit ratio base。在performance变换中指定派生类型有两种写法字符串简写total_pages: average或对象写法cache_hit_ratio: { type: ratio, base: cache_hit_ratio_base }后者还可附加instance参数如{ type: rate, instance: _Total }在变换层过滤实例。变换的整体结构见 BasicPerformanceTransformStructure.svg一个检查使用多个计数器多实例结果的错位陷阱在实际使用中同一检查往往需要同时观察多个计数器例如批量请求速率batch_request_sec与锁请求速率lock_requests_sec。但当这些计数器来自不同的实例时直接合并会得到意外结果。看下面的反例把两个计数器放进同一个 probe referencebatch_request_sec不指定实例lock_requests_sec指定_Totalprobes: [ { id: PerformanceProbe, alias: b, transform: { type: performance, counters: { batch_request_sec: rate, lock_requests_sec: { type: rate, instance: _Total } } } } ]变换结果返回两行数据每行只填充了其中一个计数器的值batch_request_seclock_requests_secinstance_name123snull未选择实例Null456s_Total条件表达式是按行逐一求值的第一行对batch_request_sec求值并可能触发一条消息第二行对lock_requests_sec求值并触发另一个错误——这显然不符合两个指标共同判定的预期。解决方案用别名alias拆分引用正确做法是将同一 Performance probe 引用两次各自通过变换只取一个计数器并用alias区分结果。alias是探针引用的任意别名其机制详见 ProbeReference 文档中的 alias 一节probes: [ { id: PerformanceProbe, alias: b, transform: { type: performance, counters: { batch_request_sec: rate } } }, { id: PerformanceProbe, alias: l, transform: { type: performance, counters: { lock_requests_sec: { type: rate, instance: _Total } } } } ]此时传给检查的数据结构变为b::batch_request_secb::instance_namel::lock_requests_secl::instance_name123s无实例456s_Total两个计数器各自独立成行条件可以同时、无歧义地引用它们。变量名有三种等价写法在无歧义场景下PerformanceProbe::batch_request_sec b::batch_request_sec batch_request_sec其中b::batch_request_sec形式通过别名 双冒号精确定位到指定引用产生的数据是处理同一探针被多次调用时的标准做法ProbeReference 文档 中还有把探针 A 的数据作为参数传给探针 B 的进阶用法。引擎视角Performance probe 的执行语义了解探针引擎的执行语义有助于写出高效的规则。根据 Probe 文档 的说明探针是 JSON 属性值为实现数组属性名即探针 ID值是一个探针实现probe implementation数组。引擎会选择第一个与目标模式target pattern匹配的实现因此实现顺序很重要。Performance probe 也可以与其他类型的实现如 T-SQL、WMI混合构成一个探针。探针应设计为无副作用side-effect free的函数引擎不保证探针的调用顺序甚至可能为降低对目标 SQL Server 的负载而重排调用当没有任何检查需要某个探针的数据时该探针根本不会被调用。默认规则集中的探针只读取元数据不读取用户表数据也不向实例写入任何内容。性能计数器的采样开销Performance probe 需要按numberOfSamples × interval的时间窗口在目标机器上持续采样这与其他一次性取数的探针如单条 T-SQL 查询不同。在自定义规则时应合理控制采样次数与间隔避免在高负载实例上叠加额外的采样开销。与默认规则集的衔接仓库中的 DefaultRuleset.csv 提供了默认规则集的可读版本455 行规则可直接在仓库中浏览与筛选其中包含大量与性能相关的检查例如HighCPUUsage评估服务器整体 CPU 与 SQL Server 进程 CPU 占用阈值参数默认 70PlansUseRatio评估计划缓存中单次使用计划的比例用于判断是否应启用 Optimize for ad hoc workloads一系列 TempDB 文件配置检查TempDBFilesNotLess8、TempDBFiles1PerCPU等。这类运行时指标类检查正是 Performance probe 与 performance 变换的典型应用场景。读者可以结合 MakingCustomChecks_sample.json自定义规则集示例与 DisablingBuiltInChecks_sample.json按 ID / 标签禁用内置规则示例来编写自己的性能监控规则。更完整的概念体系探针、规则、变换、消息模板、局部变量可继续阅读 Customization 目录 下的文档。小结Performance probe 是 SQL Assessment API 中连接操作系统性能计数器与配置合规性判定的桥梁。本文覆盖了其三个 implementation 参数numberOfSamples、interval、counters、计数器别名与实例过滤的两种 JSON 写法、五种派生值函数average、min/max、rate、ratio、delta_ratio的公式与计数器类型对应关系以及多计数器多实例场景下按行求值的陷阱与基于别名拆分的标准解法。在动手自定义性能规则时建议对照 performance 数据变换文档 与 ProbeReference 文档 协同阅读并结合默认规则集观察真实生产级规则的写法。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐SQL Assessment API 自定义探测指南用 T-SQL Probe 驱动 SQL Server 配置评估SQL Assessment API 自定义探测指南用 T SQL Probe 驱动 SQL Server 配置评估 SQL Assessment API 通示例工程数据库教程后端SQL Assessment API 深度指南用规则集评估 SQL Server 与 Azure SQL 托管实例配置sql-server-samplesSQL Assessment API 深度指南用规则集评估 SQL Server 与 Azure SQL 托管实例配置sql server samples示例工程数据库教程后端sql-server-samples 实战指南使用 SQL Assessment API 客户端评估 SQL Server 配置最佳实践sql server samples 实战指南使用 SQL Assessment API 客户端评估 SQL Server 配置最佳实践 SQL Assess示例工程数据库教程后端上一篇Rust跨平台编译终极指南使用Cross实现零配置多架构支持下一篇MCP代理内存使用分析终极指南Valgrind实战教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网