技术文章
记录真实线上问题的定位过程,包括当时的误判。
8 个 goroutine 各写各的计数器,没有锁,比单线程慢 13 倍
八个 goroutine,每个只写自己那一格,互不重叠,没有锁,没有 channel,`-race` 跑出来干干净净。它比一个 goroutine 从头干到尾**慢十三倍**。
我的网关一个字段都没改,订单号却变了
没有报错、没有 panic、没有超时,`Unmarshal` 返回 nil,`Marshal` 也返回 nil,日志从头到尾干干净净。数据就这么安安静静地错了——一个只做转发的网关,代码里一行都没碰过 `order_id`,订单号却在它手里变成了另一个数。
服务内存涨到 OOM,可我真的没有内存泄漏
内存曲线一路只涨不跌,最后被 OOM Killer 干掉。可我翻遍 pprof 的 heap profile,找不到任何一处「忘了释放」——每个对象看起来都该在。没有泄漏,它就是在漏。
我把 Redis 的 IO 多线程打开,QPS 不升反降了 20%
一个写在 redis.conf 里、官方注释明明白白教你开的性能开关,我照着开了,QPS 没涨,反而掉了两成。这一篇是我自己交的学费。
我们给 Go 服务限了 CPU,P99 反而涨了 3 倍
给容器加一条再正常不过的 CPU 限制,尾延迟不降反升,涨了 3 倍。这一篇讲清楚它为什么会这样,以及我当时是怎么一步步想错的。