谱分析 = 频域视角看系统行为
解决什么问题:如何识别系统行为中的周期性模式—— 不是看单个时间点的数据,而是看数据在不同频率上的能量分布。
业务问题
真实场景
场景 1:周期性故障的识别
业务:订单服务每到下午 3 点就慢
时间序列分析(看不出):
[100, 102, 105, 350, 102, 99, 100, ...]
看不出周期性,要看大量数据
频谱分析(看到):
- 主频率 = 24 小时
- 次频率 = 8 小时
- 周期性 = 业务时段(早高峰、午高峰、晚高峰)场景 2:异常检测
业务:监控指标突然出现异常
时间序列:
- 之前:[100, 102, 99, 101, 100, 102, ...] (稳定)
- 现在:[100, 102, 99, 101, 250, 102, ...] (异常)
频谱分析:
- 异常点 = 高频分量
- 正常波动 = 低频分量
- 异常 = 高频能量突然增加场景 3:业务量趋势分析
业务:分析订单量的长期趋势
数据:
- 每天订单量(1 年)
频谱分析:
- 主频率 = 7 天(周周期)
- 次频率 = 365 天(年周期)
- 趋势 = 极低频
→ 提取出"周内每天的规律"和"年内每月的规律"失败的典型做法
做法 1:只看时间序列
✗ 直接看时序数据
✗ 难以识别周期性
后果:错过周期性故障做法 2:固定窗口统计
✗ 简单求平均 / 最大 / 最小
✗ 丢失频率信息
后果:检测不准控制论视角
数学原型
钱学森《工程控制论》Ch 14 §14 引言:
"对于随机输入作用下的系统,我们需要频域分析工具——傅里叶变换把时域信号变成频域表示,让我们看到信号在不同频率上的能量分布。"
"系统的行为可以用功率谱密度 Φ(ω) 描述——它表示信号在不同频率上的功率。"
控制论解法
谱分析的核心:
时域信号 x(t)
↓ 傅里叶变换
频域信号 X(ω) = ∫x(t)·e^(-iωt) dt
功率谱密度:
Φ(ω) = |X(ω)|²
软件工程对位:
- 时域信号 = 业务时序数据
- 频域表示 = 数据在不同频率上的能量
- 主频率 = 业务周期性
- 高频分量 = 异常 / 抖动
- 低频分量 = 长期趋势与业务的对应
| 控制论概念 | 软件工程 |
|---|---|
| 时域信号 x(t) | 业务时序数据 |
| 频域表示 X(ω) | 数据的频率成分 |
| 功率谱密度 Φ(ω) | 不同频率的能量分布 |
| 主频率 | 业务周期性 |
| 高频分量 | 异常 / 抖动 |
| 低频分量 | 长期趋势 |
核心概念
定义
谱分析:通过傅里叶变换把时域信号变成频域表示,分析信号在不同频率上的能量分布。
软件工程对位:通过频域分析识别业务数据中的周期性模式。
谱分析的应用场景
| 场景 | 应用 |
|---|---|
| 周期性识别 | 找出业务的主频率(24h / 7d / 365d) |
| 异常检测 | 高频分量突然增加 = 异常 |
| 趋势分析 | 低频分量 = 长期趋势 |
| 信号去噪 | 过滤高频噪声 |
| 预测 | 周期性外推 |
关键属性
| 属性 | 含义 |
|---|---|
| 频域视角 | 在频域而非时域分析 |
| 全局性 | 看到的是整个时间窗口的模式 |
| 周期性 | 适合识别周期 |
| 可计算 | FFT 算法高效 |
| 可视化 | 频谱图直观 |
谱分析与时域分析的对比
| 维度 | 时域分析 | 频域分析 |
|---|---|---|
| 视角 | 随时间变化 | 随频率变化 |
| 优势 | 直观 / 易理解 | 看到周期性 / 频率特性 |
| 劣势 | 难以识别周期性 | 不直观 |
| 工具 | 时序图 | 频谱图 |
| 应用 | 短期分析 | 周期性识别 |
工程实践
步骤 1:选择分析的数据
数据选择:
- 业务指标(订单量、用户活跃度)
- 技术指标(QPS、延迟、CPU)
- 异常事件(告警、错误)
数据要求:
- 足够长(至少覆盖 1 个周期)
- 均匀采样(不能有缺失)
- 平稳(统计特性稳定)步骤 2:执行 FFT
python
import numpy as np
import matplotlib.pyplot as plt
# 数据
x = [业务数据...]
# FFT
X = np.fft.fft(x)
freqs = np.fft.fftfreq(len(x), d=1.0/采样频率)
# 功率谱
power = np.abs(X) ** 2
# 绘制频谱图
plt.plot(freqs[:len(freqs)//2], power[:len(power)//2])
plt.xlabel('Frequency')
plt.ylabel('Power')
plt.title('Spectrum')步骤 3:识别主频率
主频率识别:
- 找到功率谱的峰值
- 对应频率 = 主频率
例:
- 峰值在 1/24h(24 小时周期)
- → 业务有日周期
- 峰值在 1/7d(7 天周期)
- → 业务有周周期
- 峰值在 1/30d(30 天周期)
- → 业务有月周期步骤 4:异常检测
异常检测:
- 监控高频分量的能量
- 高频能量突然增加 = 异常
例:
- 正常:高频能量占总能量 < 10%
- 异常:高频能量 > 30%
- → 触发告警步骤 5:趋势分析
趋势分析:
- 提取极低频分量
- 这是长期趋势
例:
- 提取 1/365d 频率 = 年度趋势
- 提取 < 1/365d 频率 = 长期演化常见反模式
反模式 1:只做时域分析
症状:
- 只看时序图
- 不做频谱分析
后果:错过周期性模式
正解:时域 + 频域结合反模式 2:FFT 参数设置错误
症状:
- 采样频率不对
- 窗口长度不合适
后果:频谱失真
正解:选择合适的参数反模式 3:忽略非平稳信号
症状:
- 业务剧烈变化
- FFT 结果不稳定
后果:分析失效
正解:用时频分析(小波变换)工程实例
实例 1:周期性故障识别
业务:订单服务每到下午 3 点慢
数据采集:
- 采集 30 天的 QPS 数据
- 每 1 分钟一个数据点
FFT 分析:
- 峰值频率 = 1/24h(日周期)
- 次峰 = 1/8h(业务时段)
- → 周期性故障
根因分析:
- 下午 3 点是批处理任务高峰
- → 错峰调度实例 2:异常检测
业务:监控指标异常
实现:
1. 滑动窗口 FFT(窗口 = 1 小时)
2. 计算高频分量能量
3. 高频能量 > 阈值 → 异常告警
例:
- 正常:高频能量 = 5%
- 异常:高频能量 = 40%
- 告警 P1实例 3:业务量预测
业务:预测下个月订单量
实现:
1. 提取年度周期(1/365d)
2. 提取月度周期(1/30d)
3. 提取周周期(1/7d)
4. 叠加 = 预测
效果:预测准确率 > 85%性能指标
谱分析健康指标
| 指标 | 设计目标 | 衡量方法 |
|---|---|---|
| 主频率识别准确率 | > 95% | 已知周期 vs 识别周期 |
| 异常检测准确率 | > 90% | 准确异常 / 总异常 |
| 预测准确率 | > 80% | 预测值 vs 实际值 |
| 计算延迟 | < 1 分钟 | FFT 计算时间 |
监控设计
关键监控:
- 各指标的频谱
- 高频能量占比
- 主频率稳定性
- 异常检测告警
告警分级:
- P2:高频能量 > 20%
- P1:高频能量 > 40% / 主频率变化
- P0:异常检测失效边界判断
何时不用
场景 1:业务极简
- 数据量小
- 没有周期性
→ 不需要谱分析场景 2:业务完全确定
- 所有数据都已知
- 不需要预测
→ 不需要谱分析场景 3:非平稳信号
- 业务剧烈变化
- 统计特性不稳定
→ 谱分析失效,用其他方法与其他方法论的边界
| 相邻概念 | 区别 |
|---|---|
| 维纳滤波 | 维纳滤波关注"信号去噪";本方法论关注"频率分析" |
| 时序分析 | 时序分析关注"时间模式";本方法论关注"频率模式" |
| 告警分级 | 告警分级关注"阈值";本方法论关注"频率异常" |
何时升级(更复杂的频域分析)
当以下情况出现时,考虑升级:
1. 信号非平稳 → 时频分析(小波变换)
2. 多信号分析 → 互谱分析
3. 高精度预测 → 卡尔曼滤波
4. 实时性要求 → 流式频谱关键洞察
钱学森 Ch 14:谱分析是随机信号处理的核心工具。
软件工程的频域视角智慧:
时域看"是什么",频域看"为什么这样"
- 时域:数据随时间变化
- 频域:数据在不同频率上的能量分布
周期性故障在时域不明显,在频域很明显 异常信号在时域是离群点,在频域是高频分量
好的频域分析 = 时域 + 频域 + 业务理解
相关链接
IDDD 对位
- 频谱 = 事件流分布 → 事件分发与一致性(Ch 8)
- 主频 = 主要事件类型 → 聚合 4 规则(Ch 10):聚合事件是主频
- 滤波 = 业务过滤 → 应用服务 vs 领域服务
核心:频谱分析 = 在事件流中找规律——IDDD 事件监控 + cybernetics 频谱分析同构。