java性能问题排查思路分享
两个关键指标
- 吞吐量: 单位时间内处理的事务(TPS)
- 时延:请求到响应花费的时间
软件性能模型
- 横坐标:用户量
- 绿线:资源利用率
- 紫线: 吞吐量(TPS)
- 红线:延时
做压力测试找到合适的位置
定位思路
- 系统层面
- 应用层面
排查问题流程
cpu -> 内存 -> 磁盘 -> 网络 -> 程序
CPU问题排查
CPU负载: 正常值在CPU核心数的0.7左右
load average : 1分钟 5分钟 15分钟
CPU用户态,内核态占比:
Cpu(s): 用户态 us 内核态 sy
按 1 可以展示所有CPU的运行情况
重点关注 CPU0: 内核调度,线程切换主要由CPU0操作
按 shift+c 对CPU使用率从高到低排序
找到CPU占比高的几个进程,进行排查
内存
free命令
buff/cache : CPU在读的时候会把一些数据先放到cache里去
数据在内存和磁盘转换,为了提高效率
磁盘:
df: 查看磁盘容量
du: 查看大文件
iostat:
r/s w/s : 每秒读写的次数
rKB/s wKB/s : 每秒读写数据块的大小
awati: 读写等待时间
svctm: 服务时间 (svctm >> awati 说明磁盘达到了瓶颈)
agvqu-sz : 读写队列大小
iotop:
查看占用磁盘io最大的几个进程
网络:
业务进程问题排查
线程:
java自带工具:
注意: jmap -dump 会stop the world ,不要在生产环境使用,会影响使用
常用工具
arthas: 阿里开源java诊断工具
MAT: 内存分析
ibm jca (线程分析工具)
实战案例1: 连接池被占满,调大连接数,过了一会仍被占满
实战案例2: 微服务不能平行扩展, tps上不去
实战案例3: 备机房的tps不稳定
实战案例4: 系统tps不稳定