Go pprof 实战:一个内存泄漏的定位全过程
服务内存每 6 小时涨 1G,重启就好了——典型的 goroutine 泄漏。用 pprof 火焰图、goroutine 栈、heap profile 一步步定位到根因,完整过程复盘。
服务内存每 6 小时涨 1G,重启就好了——典型的 goroutine 泄漏。用 pprof 火焰图、goroutine 栈、heap profile 一步步定位到根因,完整过程复盘。
Go 的错误处理不是’写 if err != nil’,是’设计错误’:错误分类、包装链、哨兵错误、错误码与日志——一套让错误’可定位、可分类、可恢复’的体系。
为什么 RR 隔离级别下你读不到别人未提交的数据?MVCC、隐藏列、undo log、Read View——把 InnoDB 的读一致性问题一次讲透。
微服务拆出来第一件事不是写代码,是定通信标准。proto 目录结构、错误码、trace、鉴权、兼容性规范,这一套标准定了,后面 20 个服务才没乱。
发布是最高危的操作。流水线化:提交即构建、PR 即测试、合并即部署——GitHub Actions 与自建流水线的完整设计,从手动到一键的演进。
不要用锁解决问题,用通信。Worker Pool、Fan-out/Fan-in、超时控制、优雅退出——Go 并发编程的四个高频模式,每个都附可直接用的代码。
HPA 配置 10 分钟,调好却要一星期。指标选型、稳定窗口、冷却时间、压测验证——把水平自动伸缩从’能用’调到’真的好用’。
微服务排查的痛:一个请求经过 8 个服务,日志散在 8 个文件里。Trace ID 贯穿、Span 采集、采样策略——从’拼日志’到’一键看全链路’的落地。
每天早上 9 点的招聘高峰,投递请求像潮水一样打过来,数据库直写必死。RabbitMQ 异步削峰 + 消费端限流 + 幂等消费,把峰值写入平滑成恒定吞吐。
日志不是越多越好:每天 5TB 日志,存储成本惊人。日志规范(级别/字段/内容)、采样、归档、成本预算——日志治理是 ELK 之后必须补的第二课。