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

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

在这里插入图片描述

jps -l  查看java相关进程

在这里插入图片描述

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

  • cpu:vmstat
    在这里插入图片描述
    在这里插入图片描述

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

  • cpu: pidstat

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

  • 硬盘: df
    在这里插入图片描述
  • 磁盘IO: iostat,pidstat
查看额外: pidstat -d 采样间隔秒数 -p 进程号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 网络IO:fstat
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
# 查看网络连接数
netstat -nat | grep -i '8080' | wc -l

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

  • 整体思路
    在这里插入图片描述

  • 先用top命令找出cpu占比最高的
    在这里插入图片描述

  • ps -ef 进一步定位
    在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述
top -H :查看每个线程的性能信息
在这里插入图片描述
这里可以分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脚本,自动抓取 日志。
在这里插入图片描述
在这里插入图片描述

(6) jcmd jcmd --help 查看帮助
在这里插入图片描述
(7) jconsole

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值