java服务器线上问题排查思路

30

一、CUP占用过高

1、通过top命令找出线程占用高的Java进程

2、通过top -Hp <pid>找到进程占用CPU高的线程id

3、将线程id转成16进制,printf "%x\n" <pid>  得到<tid> 上面例子:10544的十六进制就是0x2930

4、通过jstack <pid> | grep <tid> -A 30 打印线程调用栈信息

至此就定位到了占用CPU高的代码了。

二、死锁问题

如果线上进程出现很多线程死锁,那么死锁的线程进入BLOCKED状态,导致可用的线程变少,其他线程就会繁忙,任务处理不过来,前端的表现就是变卡了。
可以通过jstack定位死锁问题jstack <pid> | grep deadlock -A 30

可以发现sleep-loop1线程和sleep-loop2线程互相等待对方释放锁。

三、GC问题分析

前面通过CPU占用过高的例子分析出业务代码存在问题,还有一种情况是gc线程频繁gc占用CPU,这个时候就需要分析gc日志的情况来定位问题,可能是jvm参数设置不合理等等
1、通过jhsdb jmap --heap --pid <pid> 命令查看jvm信息

2、通过jstat打印gc情况 jstat -gc <pid> 2000 10 每两秒打印一次,总共打印十次

3、查看gc日志,前提是需要加jvm启动参数

-Xlog:gc*,safepoint:gc.log:time,uptime:filecount=100,filesize=50M

可以通过在线gc分析工具分析gc情况

四、内存泄露

发现随着进程运行时间推移,内存占用越来越大,但是在线玩家数却没有增加;或则观察负载日志的关键对象数量和实际在线玩家情况不对称,应该就是内存泄露了。
通过dump jvm的内存快照分析对象的个数可以大致判断泄露的点

1、jmap -histo 打印jvm堆中对象详细占用情况,按照占用空间排序
2、jmap -dump:format=b,file=heap.bin dump堆快照到文件heap.bin中
或者配置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump/heap.bin当发生OutOfMemoryError时自动dump内存快照
3、通过eclipse Memory Analyzer查看对象的内存占用状况,https://www.eclipse.org/mat/downloads.php

4、或者通过jvisualVM分析内存快照,文件->装入

五、磁盘问题

1、检查磁盘空间 df -h

2、检测磁盘IO
使用iostat和pidstat分析
2.1. 安装sysstat软件包,yum install sysstat
2.2. 使用iostat查看整个系统的文件IO消耗情况 iostat 2 3 //每隔2秒刷新显示,且显示3次

2.3. 查看具体进程IO消耗 pidstat -d -t -p <pid> 1 3 //每1秒刷新一次,且显示3次

六、网络IO

1、查看服务器网络连接情况 netstat -antp

2、显示tcp各个状态数量 netstat -ant |awk '{print $6}'|sort|uniq -c

常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关。
3、查看并修改Linux系统文件最大打开数量,Linux系统建立一个tcp连接需要打开一个文件句柄,如果限制了文件打开数量,那么连接数量上不去

ulimit -a 查看当前用户可使用系统资源的一些参数,包括可打开的最大文件数量
ulimit -n 直接查看当前进程可以打开文件的最大数量
ulimit -a 65535 可以修改最大文件数量,但是只限于当前shell环境
 
//设置单个进程最大打开文件数
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
//设置整个系统最大打开文件数
修改/etc/sysctl.conf,增加fs.file-max=35942900

4、采用sar来分析网络IO的消耗情况 sar -n ALL 1 2

IFACE 本地网卡接口的名称
rxpck/s 每秒钟接受的数据包
txpck/s 每秒钟发送的数据库
rxKB/S 每秒钟接受的数据包大小,单位为KB
txKB/S 每秒钟发送的数据包大小,单位为KB
rxcmp/s 每秒钟接受的压缩数据包
txcmp/s 每秒钟发送的压缩包
rxmcst/s 每秒钟接收的多播数据包

其他文章:

(62条消息) JAVA线上故障排查全套路_Coder-CSDN博客_java 线上问题排查

(62条消息) java:线上问题排查常用手段_weixin_34146410的博客-CSDN博客