• 1. 性能测试分享
  • 2. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 3. 性能测试分类定义 通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 并发测试 多线程/进程模拟多用户发起压力,体现性能问题 压力测试 逐步增加负载,使系统某些资源达到饱和甚至失效 负载测试 负载测试是通过逐步加压的方式来确定系统的处理能力和能够承受的各项阈值。例如,通过逐步加压得到“响应时间不超过10秒”、“服务器平均CPU利用率低于85%”等指标的阈值。 疲劳测试 系统能稳定运行的前提下,以最大并发持续执行一段时间,确定系统处理最大工作量强度
  • 4. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 5. 流程开发评估 测试目标交易、期望指标:包括主要表名、新增/存量数据量、响应时间、tps、cpu等 测试评估 开发提交的性能指标是否合理(线上——数据增长频度、用户量、时间窗口) 性能测试设计 根据评估后的结果、测试交易特性设计(一般考虑使用平率最高的几种情况) 性能测试执行 录制脚本,执行测试(jmeter/loadrunner/grinder/gatling) 性能测试报告 根据模板出具性能测试报告,描述测试环境,测试过程、结果及部分问题分析
  • 6. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 7. jmeter基本概念 1. 线程组 2. 取样器——http/java请求
  • 8. jmeter基本概念 3. 配置元件 http cookie管理器 http/java默认值(请求配置) Csv data set config(参数化)
  • 9. jmeter基本概念 4. 监听器 5.其他 逻辑控制器 前置处理器 后置处理器 定时器 断言
  • 10. jmeter压测脚本 1.手工编写脚本(java请求——Normandy): 1.1 类必须实现JavaSamplerClient或者继承AbstractJavaSamplerClient,并重写以下四个方法 getDefaultParameters():设置参数及默认值 SetupTest():每个线程执行前运行一次,做初始化 runTest():循环执行体,测试内容放这 teardownTest():每个线程退出前执行,善后 1.2 写好后,打包成jar,放在JMETERHOME/lib/ext目录下,重启jmeter后生效 2.通过录制得到脚本( http协议——信审): Badboy录制后导入jmeter(只支持ie): http://www.badboy.com.au/ jmeter设置代理(ie/chrome)录制脚本
  • 11. jmeter测试执行和监控结果 1. 新建测试计划 2. 添加各类元件 Java request sampler Csv data control (参数化) Result tree Aggregate report Cookie manager:需要用到cookie时用 哨兵 PTP平台
  • 12. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 13. linux常用监控命令Vmstat 1. 进程(process) r——分配到cpu的进程数,对应top命令的load,显示cpu负载,超过cpu核数就会有瓶颈 b——阻塞进程数 2. 内存 (memory) Swpd——已使用虚拟内存大小,一般为0,如果大于0说明物理内存不足或泄露 Free——空闲物理内存 Buff——已使用缓存大小 Cache——文件系统使用缓存大小 3. 交换页(page) Si/so——每秒从磁盘读入虚拟内存/虚拟内存写入磁盘的大小,如果大于0,说明物理内存不足 4. IO bi/bo——反映磁盘繁忙程度 5. 系统调用 In ——系统中断次数 Cs ——调用系统方法、线程切换等会导致上下文切换。该值过大说明cpu在上下文切换上有瓶颈 6. cpu Us——用户cpu时间 Cs——系统cpu时间 Id——空闲cpu时间 Wa——等待io时间 St——stolen time
  • 14. linux常用监控命令top load average——与cpu内核数有关 Top显示1分钟/5分钟/15分钟内运行队列的平均任务数 单核——0.5表示用了一半资源;1代表满负载;2则代表一半的线程在等待 N个cpu,每个cpu m个核心——load <= n*m
  • 15. jvisualvm优点 Java自带的图形化监控工具 监控内存泄露 跟踪GC情况 内存分析 Cpu分析 线程分析
  • 16. jvisualvm配置 1. 远程机器上新建 jstatd.all.policy ,内容如下: grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;}; 2.启动jstatd nohup jstatd -J-Djava.security.policy=jstatd.all.policy & 3.修改服务端jvm启动参数(自动化部署平台 ->实例管理->jvm) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9999 -Djava.rmi.server.hostname=10.165.124.137 -Dspring.profiles.active=test.auto  4. 本地启动jvisualvm %JAVA_HOME%\bin\jvisualvm.exe 5.配置远程连接 Jvisualvm左边栏右键选择“远程”,新建远程连接(10.165.124.137) 新增jmx连接,注意端口号与jvm设置一致(9999)
  • 17. jvisualvmJmx连接
  • 18. jvisualvm内存分析——一般有内存泄露时用 1. jvm正常时曲线呈锯齿装,发生内存泄露时曲线会上扬 2.点击“堆 dump” 保存heapdump文件(右图) 3. 有权限用户登录到主机将dump下载到本地 4. “文件—载入”加载dump文件(下图) 5. 当怀疑有内存泄露时,可以选择在不同时间点产生几份heapdump文件做比较,来得到增长较快的对象做重点分析
  • 19. jvisualvm线程分析——是否有线程阻塞 四种状态: 运行(Running):说明该线程正在执行代码,没有问题。 休眠(Sleeping):调用了Thread.sleep后的状态,说明线程正停在某个Thread.sleep处 等待(Wait):手动调用了wait方法,或者某些IO操作,在阻塞中等待数据。 监视(Monitor):表示线程想执行一段synchronized中的代码,但是发现已经有其它线程正在执行,自己被block了,只能无奈地等待。如果这种状态多,说明程序需要好好优化。 表、详细信息tab页可以详细查看线程运行情况
  • 20. jvisualvmThreaddump 线程dump快照可以查看线程具体执行的代码,与命令jstack –l pid一样
  • 21. jmcJava mission control 非常强大,可以实时监控各项系统指标;检测死锁等;阈值报警 介绍视频:https://www.youtube.com/watch?v=azshjd5Vsv0 配置 1.与jvisualvm类似,需要启动jstatd监听 2.Jvm添加: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder  -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints 3. 本地启动jvisualvm %JAVA_HOME%\bin\jmc.exe
  • 22. jmc死锁(两种方法) 1.Mbean浏览器->threading->DeadlockedThreadCount 2.线程->死锁检测
  • 23. jmc飞行记录器 记录执行时系统快照 包括cpu、内存、io、堆栈调用、系统信息等
  • 24. 其他工具nmon Ibm出品,记录系统各指标数据,可以以图形化展示监控结果 Jprofile 检测cpu高和内存泄露工具
  • 25. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 26. JVM运行时数据区程序计数器 线程所执行的字节码的位置指示器 不会发生OOM 虚拟机栈 方法栈,执行方法时会压栈,执行结束时出栈; 所需方法栈深度大于定义的栈深时报stack overflow 本地方法栈 同虚拟机栈,调用的Native方法,如c语言的方法 方法区(Perm区) 存储类信息、常亮、静态变量、编译后的代码等信息; 动态生成大量class的应用可能会发送OOM 堆 为对象实例分配内存,存放对象实例
  • 27. 堆分代收集(堆大小=新生代+老生代) 新生代 Eden区+2个survivor区(from/to) 在eden区初始化分配 Minor gc Survivor区总有一个是空的,对称,from和To每次gc后调换身份(复制算法) 老生代 存放的生命周期较长的对象。 Major gc / full gc 永久代  用于存放静态文件,如Java类、方法等。
  • 28. 堆——内存申请一般流程
  • 29. 判断回收对象标准:有无对象引用 1. 可达性分析算法 通过一系列称为”GC ROOTS”的对象为起点 遍历,可达对象则为存活对象 不可达对象 第一次标记,并判断对象有无finalize()方法 有,执行回收 无,放置到F-Queue中;jvm启动Finalizer线程堆F-Queue中对象做二次标记 对象重新与应用链上对应简历关联,则移出队列 对象销毁
  • 30. 收集算法标记清除(mark-sweep) 标记需要回收对象,标记完成后统一回收被标记的对象。 优缺点:效率低;内存碎片化 复制(copying) 新生代都采用复制算法。 1. 准备两块一样大小的内存(FROM/TO) 2. 每次只只用其中一块(FROM); 3. 存活对象按顺序复制到另一块内存(FROM->TO); 4. 完全清理掉FROM中的对象。 优缺点:简单高效,但是只能用一半内存
  • 31. 收集算法标记整理(mark-compact) 老年代采用标记整理算法。 1 标记需要回收对象; 2. 标记完成后移动被标记的对象到一端; 3. 清理端边界意外的对象。 缺点:效率低;内存碎片化
  • 32. 垃圾收集器吞吐量优先 -XX:+ UseParallelOldGC——对应parallel scavenge +parallel old 收集器 响应时间优先 ParNew+CMS(concurrent mark sweep)
  • 33. jvm常用工具及命令Jps(jvm process status tool) 列出运行中的虚拟机进程 Jps –v 查看虚拟机参数配置 Jstat (jvm statistics monitoring tool) 监视虚拟机各种运行状态信息,类似gc日志 jstat –gcutil vmid [多少毫秒执行一次][共执行几次] 例:jstat –gcutil vmid 2000 1000 —— 每两秒执行1次命令,执行1000次
  • 34. jvm常用工具及命令Jmap(memory map for java) 查询堆、永久代的详细信息 Java –heap vmid —— java堆详细信息,如使用回收器、参数配置、分代状况等 Java –histo vmid —— 堆中对象统计,包括类、实例数量、合计容量 Jstack(stack trace for java) 生成虚拟机当前时刻的线程快照(一般称为threaddump/javacore) Jstack –l vmid > a.txt Cat a.txt
  • 35. jvm常用工具及命令gc.log 配置: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -Xloggc:../logs/gc.log 日志文件的输出路径 Gc日志的格式跟具体的收集器有关,大同小异,举例:parallelgc的gc.log格式如下
  • 36. 01基本概念03常用压测工具05jvm原理02流程04常用监控/分析工具06小贷性能测试方法及总结C目 录ONTENTS
  • 37. 上轮测试情况