Skip to content

可观测性与动态追踪

1. 三层监控体系

业务层

  • 成功率、吞吐、p95/p99;
  • 核心转化或任务完成量;
  • 按区域、租户、版本、实例拆分。

应用层

  • 请求队列、线程池、连接池;
  • GC、锁、缓存、下游调用;
  • 错误码与分阶段耗时;
  • trace、profile 和结构化日志。

系统层

  • CPU/调度/PSI;
  • 内存/回收/OOM;
  • I/O 延迟与队列;
  • 网络丢包、重传和连接;
  • cgroup 限制与节流。

三层必须使用统一时间和实例标签,才能关联。

2. 工具选择阶梯

mermaid
flowchart LR
    A["指标/日志"] --> B["进程与协议统计"]
    B --> C["采样 profiler"]
    C --> D["火焰图"]
    D --> E["定向动态追踪"]
    E --> F["源码/内核验证"]

越往右信息越细、成本和专业要求越高。只在左侧无法回答问题时继续深入。

3. perf 与火焰图

适合:

  • CPU hotspot;
  • 用户态/内核态调用栈;
  • 对比优化前后热点宽度;
  • 低频采样线上短时取证。
bash
perf record -F 49 -g -p <PID> -- sleep 30
perf script > perf.script

解读:

  • 自下而上看调用路径;
  • 横向宽度代表采样占比,不是时间轴;
  • 最宽函数可能是“等待发生处”,不一定是业务根因;
  • [unknown] 先检查符号、JIT 和栈展开。

4. ftrace、eBPF/BCC 与 SystemTap

工具优势约束
ftrace内核自带、函数/事件追踪数据量大,需熟悉内核
perf通用、稳定、采样成本可控定制事件关联能力有限
eBPF/BCC/bpftrace灵活聚合、低侵入定向观测内核/BTF/权限/验证器/版本
SystemTap旧企业内核生态可用模块与调试符号部署复杂
语言 profiler能理解运行时和业务符号只覆盖对应语言与进程

课程评论反复出现 BCC 安装和符号问题。工具不可用时,回到原理和相邻证据,不要把“装不上新工具”当作无法排障。

5. 生产使用安全

  • 限定 PID/cgroup/端口/设备;
  • 限定采样频率和持续时间;
  • 优先内核侧聚合,不逐事件输出;
  • 监控工具 CPU、内存和落盘;
  • 避免记录业务敏感参数;
  • 先在相同内核的预生产环境验证。

6. 自动证据包

告警时自动保留:

text
业务 SLI 与发布事件
主机/容器资源快照
关键累计计数的时间差
进程/线程列表
cgroup events/stat
内核 OOM、hung task、conntrack、驱动日志
30 秒低频 profile(高严重度且满足安全条件时)

7. 监控常见误区

  • 只看均值,不看分位数;
  • 只看资源利用率,不看饱和与错误;
  • 把累计 counter 当成当前速率;
  • 容器只看主机平均值;
  • 告警没有实例、版本和变更标签;
  • 只采集“结果”,没有分阶段指标;
  • 高基数标签让监控系统先成为瓶颈。

以原理、实验和证据链构建长期职业资产