跳到正文

测试、pprof 与故障排查 ​

  • 状态:未准备
  • 适用方向:Go 全栈 / Go 后端
  • 最近复习:待填写
  • 下次复习:待安排

一句话回答 ​

测试验证行为与失败路径,race 检测执行路径中的数据竞争,pprof 和 trace 用于找资源瓶颈;先形成证据再决定优化。

原理解释 ​

表驱动测试覆盖正常、空输入、非法参数和依赖失败。HTTP 用 httptest,核心协调逻辑注入可控依赖;mock 通过不等于真实数据库、网络和 provider 集成通过。并发测试用完成信号和可控屏障安排时序,避免靠 Sleep 猜测。

sh
go test ./...
go test -race ./...
go vet ./...
go test -bench=. -benchmem ./...

命令用于实际 Go 源码仓库,不在本 Markdown 资料库运行;race 需要受支持平台及相应工具链,成本更高,只检测实际覆盖路径。

现象先看证据再验证
CPU 高CPU profile、请求量热函数、循环空转、序列化成本
内存持续涨heap、分配量、goroutine 数引用保留、无界队列、泄漏
延迟高但 CPU 低数据库池等待、下游耗时、锁等待慢依赖、连接不足、锁竞争
断连后资源不回落goroutine 栈与活跃连接取消传播、阻塞收发、清理遗漏

CPU profile 看采样热点,goroutine profile 看等待栈;block/mutex profile 需配置采样,trace 更适合观察调度和时间关系。诊断接口应限制访问,避免暴露业务细节或增加公开攻击面。

场景与边界 ​

基准记录工具链、机器、并发、数据规模、预热及基线,报告吞吐、P50/P95、错误率与分配,不把单次耗时当结论。压测期间同时观察下游和业务正确性。

项目中的应用 ​

沿 EinoTalk dispatcher 测试和 SimulSpeak 乱序/停止用例设计失败注入;当前未宣称已运行这些项目测试。

常见追问 ​

  • 覆盖率高就充分? 不能代表断言有效、边界充分或调度被覆盖。
  • race 无错误就没死锁? race 不是死锁与业务原子性证明工具。
  • 线上怎么先恢复? 明确影响范围,限流/降级/回滚,并保留样本供后续定位。

参考资料 ​

理解机制,讲清取舍,用复盘检验掌握。