陆续解决过很多生产问题,每次没有记录过一段时间就忘记了
服务启动的时候运行卡住了
- case by case 解决,有时候需要把日志级别改为debug才能看到真正的原因
- 有一次是因为mysql连接密钥错误,导致启动hold住,也没有任何提示
- 有一次是因为封装了BeanDefinitionBuilder来自定义bean,实例类的一个属性变量executor增加了@Setter和@Getter注解,所以要求必须注入一个bean对象,程序定义了多个线程池对象不知道使用哪个,无限循环创建这个bean最后会内存溢出。
- 解决方案一:给某个主线程池加上@Primary注解
- 解决方案二:这个属性不需要直接设为null,beanDefinitionBuilder.addPropertyValue(“excecutor”, null);
服务内存溢出
- 查看监控可以看到线程数在不断的增加
- 查看线程总数
- jstack -l {pid} |grep java.lang.Thread.State|wc -l
- top -Hp {pid}
- ps huH p {pid}| wc -l
- cat /proc/{pid}/status
- pstreee -p {pid} |wc -l #需要安装:yum -y install psmisc
- ls -l /proc/{pid}/task|wc -l
- 查看线程总数
- 统计最多的线程名字,看到带有"EDS"名字的线程数很多,这个是订阅服务的线程,原因是每次执行方法都开启了一个服务订阅线程导致
- dump内存使用MemoryAnalyzer分析,mac上安装mat软件分析
case1:写了一个循环处理上亿的数据发现内存得不到泄露,java.lang.StackTraceElement对象有很多,最后用memoryAnalyzer分析出应该是cat记录了所有异常的堆栈信息导致OOM,处理过程中可以调用Cat.getManager().reset();清理异常堆栈
- RabbitMQ消息堆积1
- 查看监控看到有少数线程blocked状态,时间点和停止消费时间点吻合
- 结论:connetcion断开导致consumer的消费线程blocked,应该是RabbitMQ的broker出现故障导致, 参考rabbitmq异常导致线程blocked
- 重启服务问题才解决
- RabbitMQ消息堆积2
- 查看监控tidb更新平均时间达到了600ms,导致消费速度低于生产速度
- 先临时扩容消费者,再根据tidb集群监控看到CPU使用率达到100%, 去tidb管理界面看到另外一条业务线用了很多慢查询,联系他们修正sql
- RocketMQ消息没有发送成功
- RocketMQ Producer没有找到namesrvaddress导致发送失败,失败没有剖出异常
- producer没有设置instancename,rocketmq开源版本的clientConfig实例之间需要靠instance name来区分,否则会复用同一个底层的instance对象。实际是由于有一个consumer没有设置namesrvaddress导致producer的namesrvaddress时效了
- Mongodb查询超时
- 给一个复杂查询的所有字段都设置了索引,因为有一个字段用了$in查询,所以导致索引失效
- 解决方案:索引中删除$in查询的字段
优秀的排查文章
版权声明:本文为liufang1991原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。