常见生产环境问题及排查方法

陆续解决过很多生产问题,每次没有记录过一段时间就忘记了

  1. 服务启动的时候运行卡住了

    • case by case 解决,有时候需要把日志级别改为debug才能看到真正的原因
    • 有一次是因为mysql连接密钥错误,导致启动hold住,也没有任何提示
    • 有一次是因为封装了BeanDefinitionBuilder来自定义bean,实例类的一个属性变量executor增加了@Setter和@Getter注解,所以要求必须注入一个bean对象,程序定义了多个线程池对象不知道使用哪个,无限循环创建这个bean最后会内存溢出。
      • 解决方案一:给某个主线程池加上@Primary注解
      • 解决方案二:这个属性不需要直接设为null,beanDefinitionBuilder.addPropertyValue(“excecutor”, null);
  2. 服务内存溢出

  • 查看监控可以看到线程数在不断的增加
    • 查看线程总数
      • 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();清理异常堆栈
    在这里插入图片描述
  1. RabbitMQ消息堆积1
  • 查看监控看到有少数线程blocked状态,时间点和停止消费时间点吻合
  • 结论:connetcion断开导致consumer的消费线程blocked,应该是RabbitMQ的broker出现故障导致, 参考rabbitmq异常导致线程blocked
  • 重启服务问题才解决
  1. RabbitMQ消息堆积2
  • 查看监控tidb更新平均时间达到了600ms,导致消费速度低于生产速度
  • 先临时扩容消费者,再根据tidb集群监控看到CPU使用率达到100%, 去tidb管理界面看到另外一条业务线用了很多慢查询,联系他们修正sql
  1. RocketMQ消息没有发送成功
  • RocketMQ Producer没有找到namesrvaddress导致发送失败,失败没有剖出异常
  • producer没有设置instancename,rocketmq开源版本的clientConfig实例之间需要靠instance name来区分,否则会复用同一个底层的instance对象。实际是由于有一个consumer没有设置namesrvaddress导致producer的namesrvaddress时效了
  1. Mongodb查询超时
  • 给一个复杂查询的所有字段都设置了索引,因为有一个字段用了$in查询,所以导致索引失效
  • 解决方案:索引中删除$in查询的字段

优秀的排查文章

Java系统线上生产问题排查一把梭


版权声明:本文为liufang1991原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。