启动慢的问题

最近在优化一个线上业务的启动后就会有大量报错的问题。

总结下, 一下顺序根据问题发现的顺序来。

启动后大量 timeout ,报错, 会有哪些原因

预建连接

启动后,发现报错堆栈报在redis 缓存上, 以为是redis 建连接慢,所以给 redis 预先建连接,结果发现。

其实连接200-300个连接 在线上内网环境下,耗时不过 300ms。

缓存穿透

由于是对外接口,后面发现,其实是业务上的缓存穿透了,流量穿透到了db, 造成了以上问题

解决了这个问题,启动的 timeout 数量减少大部分,单启动时仍有连接的超时。

tcp 慢启动

由于我们的缓存用的 redis, 启动时,虽然连接建立好了,但是由于 tcp 慢启动,一开始还有有点慢的

  1. 通过 tcpdump,查看 windows 增长过程。
  2. 对redis 连接建立好后发 一定数量的 ping(30-40个) 包让窗口变大。

netty 连接

上面都结局了后,发现启动时,调用 rpc 的服务还是有些 timeout。

由于我们用了 netty4, netty4 与 3 的一大不同就是将 bytebuf 池化了。

那么启动时, 池里面没有 bytebuf ,需要像系统申请, 这个申请的过程会加锁 具体架构可以参考这里

只要并发数量超过了配置的 iosize 数量,就会锁住。

所以 也预申请bytebuf 到pool内, rpc 就不会卡了, qps 也上去了。

总结

修复这种问题,一般效果最显著的是从业务上梳理,一般是缓存穿透,查db了, 修复了业务上的可以提升90%, 然后才是 其他的。

avatar

lelouchcr's blog