Java服务分析和调优

一、Java服务分析和调优思路

整体思路如下:
在这里插入图片描述

1.1、CPU诊断

top命令监控Linux系统状况,显示各个进程的资源占用情况。可查看系统平均负载、CPU使用率、状态。
vmstat命令查看CPU的上下文切换次数。

1.1.1、top命令

类似win的任务管理器。

top [选项]
选项有:
-b      以批处理模式操作
-c      显示完整的治命令
-d      屏幕刷新间隔时间
-I       忽略失效过程
-s      保密模式
-S      累积模式
-i<时间>    设置刷新间隔时间
-u<用户名>    指定用户名
-p<进程号>    指定进程
-n<次数>   循环显示的次数

输入命令
[root@localhost ~] # top -d 3
在这里插入图片描述

第一行:当前系统时间,系统运行总时间,当前登录用户个数,load average是1分钟、5分钟、15分钟的负载情况。
第二行:总进程数,运行的进行1个,99个在休眠,0个停止和僵尸。
第三行:0.2 us是用户空间占用CPU的百分比;0.2 sy是内核空间占用CPU百分比;0.0 ni是改变过优先级的进程占用CPU百分比; 99.7 id是空闲CPU百分比; 0.0 wa是IO等待占用CPU百分比;
第四行:内存状态。 total是物理内存总量;free是空闲内存总量;buff/cache是缓存的内存量。 【可用内存计算:free+buff+cache】
第五行:swap交换分区。total是交换区总量; free是空闲交换区总量;
第七行:各进程的状态监控。
PR:进程优先级
NI:负值是高优先级
VIRT:进程使用的虚拟内存总量,kb
RES:进程使用的、未被换出的物理内存大小。

1.1.2、vmstat命令

Java 线程上下文切换主要来自共享资源的竞争。但在一个访问频度高,对多个对象连续加锁的代码块中就可能出现大量上下文切换,成为系统瓶颈。

vmstat [选项]
选项有:
-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000102410000001048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。

输入命令【每5秒输出一次】
[root@localhost ~] # vmstat 5
在这里插入图片描述

r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
b: 等待IO的进程数量
swpd: 使用虚拟内存大小
注意:如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
注意:如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
si: 每秒从交换区写到内存的大小,由磁盘调入内存
so: 每秒写入交换区的内存大小,由内存调入磁盘
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
us: 用户进程执行时间百分比(user time)
注意: us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time)
注意:sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比
注意:wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比

1.2、memory诊断

使用free -m命令。其实用top命令也是可以看的。
在这里插入图片描述

1.3、I/O诊断

通过 iostat 可以查看磁盘的读写情况,通过 CPU 的 I/O wait 可以看出磁盘 I/O 是否正常.

1.4、应用代码诊断

通过应用层监控报警,定位有问题的功能和代码;通过top+jstat+jstack+jmap来定位异常的进程id、实时监控分析和抓取JavaCore和Head dump文件来定位问题。
top可以找到异常的进程id;
jstat -gcutil pid 可以查看这个进程GC、堆内存等情况;
“jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一致统计)”
如果Eden、S0、S1、FullGC等明显增加,那么初步判断“内存溢出”,抓取Head dump文件,使用 jmap命令;
加粗样式“jmap -dump:format=b,file=filename 进程ID”
如果只是CPU飙升比较高,GC变化不大,可以抓取JavaCore文件,使用jstack命令。
“jstack -l pid >> /root/*.txt”

二、实际线上基本分析思路

2.1、线上系统出现缓慢且不可用

有哪些原因会导致系统缓慢?
是否网络原因;
涉及外部系统的接口慢引起该系统慢,连锁反应;
内存使用过高,频繁GC导致CPU占满;
内存使用不高,出现了死循环场景;
发生死锁。
CPU飙升哪些原因引起
大量计算业务,虽然会使CPU飙升,但不会达到100%,这种需要关注就行;
CPU升高且堆内存溢出;
CPU升高,内存使用不高,但进入了死循环;
COU升高,内存使用不高,但出现了死锁。
一般解决方法:
(A)一般是用”top -c”找到CPU利用率高的进程;
再利用”top -Hp pid”查找哪个线程id占CPU高;
可以用”jstack pid | grep 16进制线程id”查看那个占CPU高的线程是什么状态;
(B)实际生产中,一般利用”top -c”找到CPU利用率高的进程,然后利用”jstack -l pid >> **.log”命令输出异常期间几次的JavaCore文件;
©可以使用“jstat -gcutil pid 统计间隔毫秒 统计次数(缺省代表一致统计)”命令查看堆内存、gc百分比变化、“jstat -gc pid 统计间隔毫秒 统计次数(缺省代表一致统计)”是查看。
通过YGC、Full GC等次数来确定是否堆内存溢出,如果Full GC明显次数再增多,这时候需要生成Head dump文件来定位哪块内存溢出。可以使用“jmap -dump:format=b,file=filename 进程ID”将生成Head dump文件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBoy_W.W.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值