1.明确问题
线上问题产生后,先不要慌,冷静的吟听问题,如果反馈的问题不明确,最好能和第一反馈人直接沟通。
2.定位问题的思路
熟悉业务、系统架构、实现都能有效的帮助解决问题。
排查线上的问题有一定的技巧和经验规律。虽然不同的系统排查问题的侧重点有所不同,但是在不考虑差异的情况下,一般可以网络、CPU、内存、磁盘空间四个方面通过排除来定位问题。
3.网络问题
网络问题一般来说是比较好排查的。如果张三无法正常访问,李四、王五都可以正常访问题,那么很有可能就是网络问题(不考虑限流,服务端主动拒绝的情况),这是查询一下服务端CPU、内存、磁盘空间是否正常,如果是,基本上就可以断定是网络问题了。网络问题一般来说也有三种情况:
- 服务入口带宽过小,这种情况一般比较少,可以最后排查。
- 运营商限速,例如手机超过套餐流量后会降速,降速后很多APP该问都会超时。
- 运营商之间的壁垒。之前在线上就碰到这种情况,公司拉的是电信的光迁,系统上线后,除北京移动以外的所有地区三大运营商都能正常访问。解决这类问题最快的解决方案是再拉一根移动的光迁,问题立马解决。当然要是考虑成本的话可以向运营商反馈,他们也会解决,但是这个周期无法预料。
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向管理员发送预警信息。