性能测试诊断(CPU, 内存)
目录
1. 性能诊断
1.1 性能测试分类
1.1.1 前端
1.1.2 后端
1.1.3 中间件
1.1.4 重点关注:http接口测试
1.2 诊断定位
1.2.1 CPU问题排查套路
(1)排查通用套路
(2) Windows环境1
(3) Windows环境2
(4)Linux环境
(5)补充知识点
1.2.2 内存问题排查套路
(1)JVM
(2)内存异常
(3)如何判断一个对象是否可以被回收
(4)堆区内存分类 - 怎么回收对象
(5)监控年轻代、年老代、元数据空间变化情况
(6)JVM内存问题排查套路
1.3 练习:JForum环境准备
1.3.1 JForum环境配置 (配置在tomcat中)
1.3.2 通过JMeter脚本,压测JForum, 进行CPU和内存诊断
1. 性能诊断
1.1 性能测试分类
1.1.1 前端
(1)App性能:App本身 ,接口(后端)
(2)小程序性能
(3)PC
(4)TW
1.1.2 后端
(1)http接口
(2)rpc接口
补充:什么是RPC?
RPC(Remote Procedure Call)是远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
1.1.3 中间件
(1)db
(2)mq (消息中间件)
(3)nginx
1.1.4 重点关注:http接口测试
(1)监控指标
1)CPU
2)Memory
3)Network
4)IO
5)JVM:线程状态,堆栈信息,垃圾回收,内存泄漏/内存溢出(大对象)
(2)用户指标
1)RT(Response Time) 响应时间
2)TPS/QPS 每秒事务数
3) 并发用户数
4)思考时间
5)ERROR rate
1.2 诊断定位
1.2.1 CPU问题排查套路
(1)排查通用套路
1)发现CPU高的进程,一般来说是我们的被测应用
2)通过进程找对应消耗CPU高的线程
3)占用CPU高的线程在干嘛(进制转换,做映射)
(2) Windows环境1
1)发现某个应用程序(JAVA 后端应用)占用CPU比较多。
2)使用Process Explorer查看对应进程的线程信息,如下图。
3)找到占用CPU比较多的线程的TID。
4)将3中的TID转换为16进制 -> ${tid16}。
5)打开jvisualVM工具,dump出线程信息,查找${tid16}。
6)反编译/直接看代码定位问题。
(3) Windows环境2
1)发现某个应用程(JAVA 后端应用)序占用CPU比较多。
2)使用Process Explorer查看对应进程的线程信息,如下图。
3)找到占用CPU比较多的线程的tid。
4)将3中的TID转换为16进制 -> ${tid16}。
5)jstack ${pid} > pid.log 。(跟上一种方法的区别)
6)在 pid.log 中查找${tid16}相关堆栈信息。
7)反编译/直接看代码定位问题。
(4)Linux环境
1)通过top发现应用程序(JAVA 后端应用)占用CPU比较多的进程pid。
2)使用 top -Hp ${pid} 查看对应进程的线程信息。 结果列表中,看CPU和Time+(该线程实际耗时)
3)找到占用CPU比较多的线程的TID
4)将3中的TID通过命令 printf "%X\n" ${tid} 转换为16进制 -> ${tid16}
5)jstack ${pid} > pid.log
6)在 pid.log 中查找${tid16}相关堆栈信息
7)反编译/直接看代码定位问题
(5)补充知识点
1) cpu工作是分片的。简单说就是某个时间节点,只会执行一个任务。让人感觉很多任务同时进行,是因为把时间分片了,时间分片很小,让人感觉不出来区别,所以会觉得每个时刻都有很多任务同时进行。
2)topcpu脚本。用来自动获取多个线程信息,并自动完成一些转换(比如进制转换等): ./topcpu.sh -p ${pid} 5(表示要展示的个数)
1.2.2 内存问题排查套路
(1)JVM
1)CPU和内存的交互
---内存存在的意义:cpu非常快,物理磁盘慢,内存的速度介于两者之间。
---高速缓存的意义:内存越来越跟不上cpu的速度,因此在cpu和内存之间加了高速缓存。
---延伸:volatile。一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,则就具备了两层语义:一是保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。二是禁止进行指令重排序。
---常说的堆栈,其实就是指栈。
---思考: 用两个栈来模拟队列。
---常见的八种数据结构。
---堆涉及内存泄漏等,是我们比较关注的信息。
---配置jvm内存,用来测试内存溢出。
2)5大内存区域
定义:Java内存模型(Java Memory Model, JMM), 就是一种复合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java路径在各种平台下对内存的访问都能保证效果一致的机制和规范。
程序计数器(独有)
本地方法栈:底层调用C或者C++, 管理用另种语言写的方法的调用情况(独有)
Java栈(虚拟机栈):Java应用程序相关的(独有)
堆:new出来的对象放在堆里。堆是所有线程共享的,同时伴有线程安全的问题,所以可能会对一些对象上锁。重点!!!(共有)
方法区:存储反射时的一些class类,对象(共有)
(2)内存异常
1)StackOverflowError:堆栈溢出
2)OutOfMemoryError:内存溢出
(3)如何判断一个对象是否可以被回收
思考:如何判断哪些可以被可以被回收
1)引用计数法: 深入理解一下!!!
存在一定缺陷: 循环引用
2)根搜索法 / 可达性分析法:
通俗的说,就是某个对象/方法A,从最开始的对象/引用等,可以有一条路径比如getXXX到达A, 那么A就是可达的,就不会被回收。
GC Roots
虚拟机栈中引用的对象,就是平时说的Java对象
方法区中的静态属性引用的对象,一般是static修饰的对象
方法区中引用的对象
本地方法栈JNI引用的对象
3)GC算法
(4)堆区内存分类 - 怎么回收对象
1) 标记 / 清楚算法(祖先)
2)年轻代:复制算法
分几个区: Eden,FromServivor, ToServivor.
对象先放Eden区,满了之后放入Servivor
当一个对象连续存活17次之后,就放到年老区里
3)年老代:标记 / 整理算法
年轻代和年老代,分别用不同的算法来进行回收。
(5)监控年轻代、年老代、元数据空间变化情况
jstat查看堆内存整体使用情况:jstat -gcutil $pid 1000
jmap查看堆内存使用详情: jmap -heap $pid
jmap去dump对象详情:jmap -dump:format=b,file=${fileName}.dump $pid
1) jstat查看堆内存整体使用情况:jstat -gcutil $pid 1000
解析:
结果中,S0和S1代表两个servivor, E代表Eden区,O代表年老区,YGC年轻代的回收等信息
1000表示间隔1秒
这个命令的功能类似jvisualvm中的visualVM插件的功能
2)jmap查看堆内存使用详情: jmap -heap $pid
解析:展示该进程的内存信息,线程信息, Eden区,年老代等等
3) jmap去dump对象详情:jmap -dump:format=b,file=${fileName}.dump $pid
(6)JVM内存问题排查套路
1)通过命令导出dump文件: jmap -dump:format=b,file=${fileName}.dump $pid
---实现了 dump 堆内存对象详情
---在哪个目录下操作,导出的文件就在该目录下
2)将步骤1中的dump结果导入到MAT工具中进行分析。
3)查找大对象(和我们写的代码相关的)并进行分析。
4)常用选项:
---Biggest Objects By Retained Size
---Histogram
---Dominator Tree
---Top Consumer
---Leak Suspects
5)内存问题,因为都是基于JVM, 所以最常推荐去看大对象。
---Biggest Objects By Retained Size
---Histogram
---Dominator Tree
---Top Consumer
---Leak Suspects
1.3 练习:JForum环境准备
1.3.1 JForum环境配置 (配置在tomcat中)
(1)下载解压classes.7z。将解压出来的classes文件替换原来老的classes。
路径为: ${TOMCAT_HOME}\webapps\jforum-1.1.9\WEB-INF\classes
(2)启动Tomcat。
(3)编写JMeter脚本,脚本要求:访问随机板块和最新主题, 3个并发线程。
(4)执行脚本定位问题。
(5)延伸: 在centOS7中配置好环境,操作一遍。
1.3.2 通过JMeter脚本,压测JForum, 进行CPU和内存诊断
略
性能测试诊断(CPU, 内存)相关推荐
- 【Android真机app的性能测试(CPU,内存,启动时间)】
Android真机app的性能测试(CPU,内存占用,启动时间) 查看app启动时间 查看app的内存占用情况 查看app的CPU占用情况 查看app启动时间 与设备进行adb连接后,输入命令 adb ...
- 处理器仿存带宽_linux服务器CPU内存硬盘读写带宽等性能测试方法
如何对一个VPS主机进行CPU内存,硬盘IO读写,带宽速度等项目测试,像UnixBench和压力测试则可以综合反映一个VPS的性能水平,方便大家对照参考. VPS性能测试:CPU内存,硬盘IO读写,带 ...
- 性能测试监控——CPU
性能测试监控--CPU 为了全面详细的分析系统运行状态,发现隐藏的性能瓶颈.性能测试期间,全面监视CPU运行状态是很有必要的. 本文侧重分析性能测试期间需要监控的CPU运行状态指标,对比相关查询命令的 ...
- ssd测试软件和实际 速度,测出真相!实测CPU/内存对SSD性能的影响
1解析CPU,内存和硬盘三者关系 [PConline 评测]不同于传统的机械硬盘,固态硬盘的组成很"简单",主控+闪存+PCB+外壳(缓存有些SSD直接省去).那实际影响SSD性能 ...
- 调整jmeter5内存_松勤软件性能测试-修改JMeter内存以适应更高的并发测试
原标题:松勤软件性能测试-修改JMeter内存以适应更高的并发测试 Jmeter做并发测试时,报错 java.lang.OutOfMemoryError:gc overhead limit excee ...
- KVM - 调整cpu内存、网卡
1.查看母机里面的子机情况 [root@bogon ~]# virsh list --all Id Name State ---------- ...
- 高cpu_实用脚本:检查高 CPU / 内存消耗进程 | Linux 中国
本教程中包含两个脚本,它们可以帮助你确定 Linux 上高 CPU/内存消耗进程的运行时间. • 来源:linux.cn • 作者:Magesh Maruthamuthu • 译者:geekpi • ...
- 一个用了统计CPU 内存 硬盘 使用率的shell脚本
一个用了统计CPU 内存 硬盘 使用率的shell脚本 一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 代码如下: #!/bin/bash #This script is use ...
- Intel CPU内存屏障
CPU内存屏障用于保障有序性. volatile禁止指令重排序,可以保证有序. CPU内存屏障,Intel设计得比较简单,总共只有3条指令: ①sfence:也就是save fence,写屏障指令.在 ...
- Ubuntu查看系统任务管理器(cpu+内存资源占用)+查看虚拟机分配核心数
Ubuntu查看系统任务管理器(cpu+内存资源占用) 命令: gnome-system-monitor 打开ubuntu下的任务管理器,启动桌面管理,显示系统cpu,内存占用情况. 参考:https ...
最新文章
- Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...
- php设计模式课程---9、桥接模式是什么
- 用php向MySQL的datetime类型插入数据
- Oracle 数据库管理脚本 命名规范
- 启动rrt什么意思_面试官:你来说一下springboot启动时的一个自动装配过程吧!...
- jest单元测试-匹配器
- Android你可能要用到的自定义View分享
- SpringMVC基础配置
- burpsuite的基本操作_burpsuite安装与基本使用
- 激光雷达的KPI与技术方案
- Proteus 8.13 安装教程
- java排查full gc_一次full gc的排查经历
- 校友全剧透CMU :ME + 转CS + 其他主要项
- matlab 线性拟合polyfit_Matlab 线性拟合 非线性拟合_matlab非线性拟合函数
- 1395786-30-7,DBCO Maleimide,DBCO-Mal
- Maltab GUI课程设计——LSTM长短期记忆网络回归预测
- Android安全:禁止APP录屏和截屏
- Android开发 之《最强大脑》“数字华容道”
- 2022-2028年全球冷轧钢卷行业供需分析及发展前景研究报告
- 什么是repo文件?