快速定位Java线上环境问题

1.明确问题

线上问题产生后,先不要慌,冷静的吟听问题,如果反馈的问题不明确,最好能和第一反馈人直接沟通。

2.定位问题的思路

熟悉业务、系统架构、实现都能有效的帮助解决问题。
排查线上的问题有一定的技巧和经验规律。虽然不同的系统排查问题的侧重点有所不同,但是在不考虑差异的情况下,一般可以网络、CPU、内存、磁盘空间四个方面通过排除来定位问题。

3.网络问题

网络问题一般来说是比较好排查的。如果张三无法正常访问,李四、王五都可以正常访问题,那么很有可能就是网络问题(不考虑限流,服务端主动拒绝的情况),这是查询一下服务端CPU、内存、磁盘空间是否正常,如果是,基本上就可以断定是网络问题了。网络问题一般来说也有三种情况:

  1. 服务入口带宽过小,这种情况一般比较少,可以最后排查。
  2. 运营商限速,例如手机超过套餐流量后会降速,降速后很多APP该问都会超时。
  3. 运营商之间的壁垒。之前在线上就碰到这种情况,公司拉的是电信的光迁,系统上线后,除北京移动以外的所有地区三大运营商都能正常访问。解决这类问题最快的解决方案是再拉一根移动的光迁,问题立马解决。当然要是考虑成本的话可以向运营商反馈,他们也会解决,但是这个周期无法预料。

5.磁盘问题

可通过df命令查询关联应用服务器、数据库磁盘的使用情况。一定要在运行的情况下查看,因为有的时候一停止,空间就释放了,如缓存、一些复杂的数据库查询等。

df -h

6.CPU

CPU占用率高:如果是数据库服务器的CPU占用率高,基本可以确实是由SQL导致的,可以通过系统表v$sql查看耗时比较长的sql,这里不就不展开了。这里主要分析因Java运行导致的情况,推荐使用阿里开源的分析脚本show-busy-java-threads.sh,可将占用CPU线程高的堆栈打印出来。

7.内存

这里的内存指的是JVM运行时内存,包括方法区(8之后取消)、堆、虚拟机栈及本地方法栈。
对应的内在溢出情况如下:
方法区内存溢出:Java.lang.OutOfMemoryError:PermGen space, 一般是两种原因导致,一是 方法区配置过小; 一 是在运行过程中动态加载了过多的类;
栈内存溢出:StackOverflowError, 绝大部份情况是因为循环或递归次数过多导致。
堆内存溢出:OutofMemoryError:Java heap Space,堆内存溢出的情况就比较多了,配置过小,配置不合理,创建了太多对象,创建了大对象等等。
元数据区溢出:OutofMemoryError:MetaSpace,加载的类过多导致,一般是在运行过程中,动态加载的类过多导致,因为如果是在启动过程中溢出,服务是无法启动的,一般在启动环节就解决了。
GC不给力导致的溢出:java.lang.OutOfMemoryError: GC overhead limit exceeded,花了98%的时间,但是最多回收了不到2%的空间。
用了NIO但是Direct buffer不够 :java.lang.OutOfMemoryError: Direct buffer memory ,换ARP直接复制基本上就不存在这种情况了;
操作系统线程限制:java.lang.OutOfMemoryError: unable to create new native thread,一种是数量的限制,创建了大多的线程了; 一种是空间的限制:创建单个线程占用空间太大了。

9.npgstack环境监控

npgstack可以对集群或分布试系统中各个服务应用进行监控,包括CPU、内存、磁盘、IO、负载等参数进行监控,并且可以提供对外的接口,预警服务可以通过这些对外的接口定期检测服务器的健康情况,对于超过阀值的服务可以触发一些额外的保护措施,如限流,熔断等,并可以通过短信或IM向管理员发送预警信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值