启动慢的问题
最近在优化一个线上业务的启动后就会有大量报错的问题。
总结下, 一下顺序根据问题发现的顺序来。
启动后大量 timeout ,报错, 会有哪些原因
预建连接
启动后,发现报错堆栈报在redis 缓存上, 以为是redis 建连接慢,所以给 redis 预先建连接,结果发现。
其实连接200-300个连接 在线上内网环境下,耗时不过 300ms。
缓存穿透
由于是对外接口,后面发现,其实是业务上的缓存穿透了,流量穿透到了db, 造成了以上问题
解决了这个问题,启动的 timeout 数量减少大部分,单启动时仍有连接的超时。
tcp 慢启动
由于我们的缓存用的 redis, 启动时,虽然连接建立好了,但是由于 tcp 慢启动,一开始还有有点慢的
- 通过 tcpdump,查看 windows 增长过程。
- 对redis 连接建立好后发 一定数量的 ping(30-40个) 包让窗口变大。
netty 连接
上面都结局了后,发现启动时,调用 rpc 的服务还是有些 timeout。
由于我们用了 netty4, netty4 与 3 的一大不同就是将 bytebuf 池化了。
那么启动时, 池里面没有 bytebuf ,需要像系统申请, 这个申请的过程会加锁 具体架构可以参考这里。
只要并发数量超过了配置的 iosize 数量,就会锁住。
所以 也预申请bytebuf 到pool内, rpc 就不会卡了, qps 也上去了。
总结
修复这种问题,一般效果最显著的是从业务上梳理,一般是缓存穿透,查db了, 修复了业务上的可以提升90%, 然后才是 其他的。