生产环境不同问题定位及分析

    在实际的程序运行中,有很多问题只有在线上或者预发布环境才会出现,而线上又不能调试代码,所以线上问题定位只能看日志,系统状态和dump线程。

一. 生产环境服务器变慢,诊断思路和性能评估

  • 系统日志:/var/log/messages
    /var/log/messages 存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志,在做故障诊断时可以首先查看该文件内容。

  • JVM启动参数配置
    -Xms4g -Xmx4g:JVM堆的最小,最大值设置为相等。
    虽然最小堆大小设为4g,但不是说项目一启动立马会申请4g内存,而是有个预热过程(堆内存小于最小值)。可以设置启动时直接向操作系统申请足够的内存:-XX:+AlwaysPreTouch
    另外,为了规避程序中System.gc()带来的Full GC风险,可以通过 -XX:+DisableExplicitGC禁止程序显示调用GC方法

java -server jvm的各种参数 -jar 自己的jar/war包名

生产环境不同问题定位及分析_第1张图片

jps -l  查看java相关进程

生产环境不同问题定位及分析_第2张图片

  • 整机: top 查看每个进程的情况,不要用ctrl+c退出top,按英文字母 q
    生产环境不同问题定位及分析_第3张图片
    load average: 系统的平均负载值,0.06 0.03 0.05 分别表示1min,10min,15min的负载
    %Cpu(s): 多核,可以使用 lscpu查看cpu核数生产环境不同问题定位及分析_第4张图片
    99.8 id idle:空闲率,值越大越好
    command: 表示启动当前进程的命令
    按数字键盘 1 查看每个cpu的性能数据
    生产环境不同问题定位及分析_第5张图片
    低配版top:uptime 系统性能命令的精简版
    在这里插入图片描述

  • cpu:vmstat
    生产环境不同问题定位及分析_第6张图片
    生产环境不同问题定位及分析_第7张图片

  • cpu: mpstat -P ALL 2 查看所有cpu核信息

  • cpu: pidstat

# 查看每个进程使用cpu的用量分解信息
pidstat -u 1 -p 进程编号

生产环境不同问题定位及分析_第8张图片

  • 内存:free,pidstat
pidstat -p 进程号 -r 采样间隔秒数

生产环境不同问题定位及分析_第9张图片
生产环境不同问题定位及分析_第10张图片

  • 硬盘: df
    生产环境不同问题定位及分析_第11张图片
  • 磁盘IO: iostat,pidstat
查看额外: pidstat -d 采样间隔秒数 -p 进程号

生产环境不同问题定位及分析_第12张图片
生产环境不同问题定位及分析_第13张图片
生产环境不同问题定位及分析_第14张图片

  • 网络IO:fstat
    生产环境不同问题定位及分析_第15张图片
    生产环境不同问题定位及分析_第16张图片
    生产环境不同问题定位及分析_第17张图片
# 查看网络连接数
netstat -nat | grep -i '8080' | wc -l

二. 假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位

  • 整体思路
    生产环境不同问题定位及分析_第18张图片

  • 先用top命令找出cpu占比最高的
    生产环境不同问题定位及分析_第19张图片

  • ps -ef 进一步定位
    生产环境不同问题定位及分析_第20张图片

  • 定位到具体线程或者代码

ps -mp 进程 -o THREAD,tid,name
-m 显示所有的线程
-p pid 进程使用cpu的时间
-o 该参数后是用户自定义格式

生产环境不同问题定位及分析_第21张图片

  • 将十进制的线程ID转换为16进制英文小写格式
printf  "%x\n"  十进制线程ID
  • jstack
# 将线程dump下来查看,然后用16进制的线程ID去dump里找到对应的线程
jstack 进程ID > /home/log/dump 
jstack 进程ID | grep tid(16进制线程ID小写英文) -A60

生产环境不同问题定位及分析_第22张图片
top -H :查看每个线程的性能信息
生产环境不同问题定位及分析_第23张图片
这里可以分3种情况:
(1) 某个线程cpu利用率一直100%,则说明这个线程有可能死循环,记住这个PID;
(2) 某个线程一直在TOP10的位置,说明这个线程可能有性能问题;
(3) cpu利用率高的几个线程在不停变化,说明并不是某一个线程导致cpu偏高。

# 查找日志
grep -rn ''关键字" a.log

三. 对于JDK自带的JVM监控和性能分析工具用过哪些?一般你是怎么用的?

  • 是什么
    https://docs.oracle.com/javase/8/docs/technotes/tools/

  • 性能监控工具
    (1) jps: 虚拟机进程状况工具
    (2) jinfo: 配置信息工具
    (3) jmap: 内存映像工具 ,生成Java应用程序的堆快照和对象的统计信息
    映射堆快照: jmap -heap 进程ID
    抓取堆内存: 生成 hprof 文件并下载到本地,MAT分析插件工具
    (4) jstat: 统计信息监视工具,类加载统计,编译统计,垃圾回收统计

jstat[-命令选项][VM进程ID] 间隔时间(单位毫秒) 查询次数

(5) jstack: 堆栈异常跟踪工具
在排查问题时,可以通过此命令 间隔性查看jvm线程情况(间隔时间 == 响应时间),多次结果比对,找出可能的线程,或者可以 自己编写个 自动化 shell脚本,自动抓取 日志。
生产环境不同问题定位及分析_第24张图片
生产环境不同问题定位及分析_第25张图片

(6) jcmd jcmd --help 查看帮助
生产环境不同问题定位及分析_第26张图片
(7) jconsole

你可能感兴趣的:(JVM)