1 测量耗时指标体系:核心指标定义、数据口径、采集粒度
测量阶段耗时分析的第一步,是建立统一的指标体系。本章聚焦三个基础层次:核心指标定义澄清每个指标的业务含义;数据口径规定如何采集原始数据;采集粒度决定数据的最小时间片段。三者共同构成可量化、可对比的耗时分析基础。
1.1 核心指标定义
所有耗时指标均从原始时钟记录中推导。下表列出本期课程使用的五个核心指标及其业务解释:
| 指标名称 | 定义 | 业务含义 |
|---|---|---|
| 总耗时 | 从测量启动到测量结束的完整时钟时间 | 反映整体测量效率,包含所有等待与有效操作 |
| 阶段耗时 | 单一子阶段(如“探头定位”“数据采集”)的持续时钟时间 | 用于识别瓶颈阶段,判断耗时是否集中在特定步骤 |
| 有效耗时 | 阶段内真正执行数据采集、转换或计算占用的 CPU 时间 | 剔除 I/O 等待、调度延迟后的纯处理时间 |
| 等待耗时 | 阶段内 CPU 空闲或阻塞(等待资源、锁、I/O 完成)的时间 | 用于评估系统资源争抢、外部依赖延迟问题 |
| 耗时占比 | 阶段耗时 ÷ 总耗时 × 100% | 快速识别耗时集中区域,指导优化优先级 |
关键认知:“耗时”指标若不加说明,默认指时钟时间(wall‑clock time)。在需要区分 CPU 时间时,必须显式使用“有效耗时”或“等待耗时”名称,避免数据误解。
1.2 数据口径
数据口径决定了原始数据的来源与统计方式。本课程统一使用以下三种口径:
- 时钟时间口径(wall‑clock):取操作系统
clock_gettime(CLOCK_MONOTONIC)或std::chrono::steady_clock记录。适用于总耗时、阶段耗时。 - CPU 时间口径(per‑process):通过
getrusage()或sysconf(_SC_CLK_TCK)获取用户态+内核态 CPU 周期。适用于有效耗时。 - 事件采样口径(event‑sample):基于硬件 PMU 计数或
perf事件的周期采样,用于等待耗时和微架构分析。
口径不一致是耗时分析中最常见的错误源。例如,将时钟时间直接当作有效耗时分析,会人为放大“等待”的假象。
1.3 采集粒度
采集粒度决定最小时间分辨率与数据量。根据分析目的不同,选择以下粒度之一:
- 阶段级(phase‑level):每个测量子阶段记录一次起止时刻,粒度通常为毫秒~秒。适合宏观效率评估。
- 任务级(task‑level):每个独立测量任务(如一次探针触发、一次数据写入)记录耗时,粒度微秒级。适合瓶颈定位与优化验证。
- 连续流级(stream‑level):以固定时间窗口(如 100 ms)持续记录瞬时耗时,生成时间序列。适合周期性波动、瞬时卡顿分析。
粒度选择需平衡数据量与细节。课程后续章节将演示如何根据目标动态切换粒度。
1.4 指标、口径与粒度的关系
下图直观展示了三者如何共同构成完整的时间量测框架:
1.5 实际测量配置示例
在一个典型的测量系统中,采集参数通过 JSON 配置文件指定。以下片段展示了如何同时定义口径与粒度:
{
"measurement": {
"phase": "data_capture",
"time_source": "CLOCK_MONOTONIC",
"granularity": "task",
"cpu_time": true,
"output": "timeseries"
}
}
该配置指定:时钟时间源为单调时钟,粒度精确到任务级,同时记录 CPU 时间,输出为时间序列(连续流级)。
常见陷阱:采集粒度设定为“任务级”但未开启
cpu_time,则只能得到时钟时间,无法区分有效与等待耗时。务必在配置中同时声明所需口径。
1.6 本章小结清单
- 掌握 5 个核心指标:总耗时、阶段耗时、有效耗时、等待耗时、耗时占比。
- 区分三种数据口径:时钟时间、CPU 时间、事件采样。
- 理解三种采集粒度:阶段级、任务级、连续流级。
- 记住指标、口径、粒度三者必须配合定义,缺一不可。
- 实际配置中通过 JSON/YAML 显式声明
time_source、granularity和cpu_time字段。