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

一、业务bug查找

1、了解bug情况,大概发生时间,玩家信息
2、通过阿里云日志查看该时间段内有无Error日志
3、通过业务关键字和玩家id搜索bug相关的异常日志
4、通过日志分析业务代码,找出可能出问题的点,包括:逻辑漏洞、并发问题、极值问题、策划配置问题等等

二、cup占用过高

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

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

3、将线程id转成16进制,printf "%x\n" <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 <pid> 打印jvm堆中对象详细占用情况,按照占用空间排序
2、jmap -dump:format=b,file=heap.bin <pid> dump堆快照到文件heap.bin中
或者配置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump/heap.bin当发生OutOfMemoryError时自动dump内存快照
3、通过eclipse Memory Analyzer查看对象的内存占用状况,下载

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  每秒钟接收的多播数据包

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值