Skip to content

谱分析 = 频域视角看系统行为 ​

解决什么问题:如何识别系统行为中的周期性模式—— 不是看单个时间点的数据,而是看数据在不同频率上的能量分布。

业务问题 ​

真实场景 ​

场景 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 对位 ​

核心:频谱分析 = 在事件流中找规律——IDDD 事件监控 + cybernetics 频谱分析同构。

从名家方法论与工程化思路中蒸馏出自己的工程体系。