压力测试相关知识

# 压力测试相关知识 ## 为什么要压力测试? 1. 传统的`DEBUG`只能帮助我们找出业务逻辑上的错误, 针对于其他问题, `DEBUG`无法完成 2. 压力测试可以找出项目的瓶颈, 项目的承载量, 找出难以发现的问题, 如: 内存泄漏, 内存溢出, 并发安全问题等 ## 重要的性能指标 |名称|说明|指标| |----|----|----| |响应时间| 发送请求直到收到该请求的全部响应结果所需要的时间|越小越好| |最大响应时间| 批量请求中, 响应时间最大的那个|越小越好| |最小响应时间| 批量请求中, 响应时间最小的那个|越小越好| |90%响应时间| 批量请求中, 若按响应时间的升序排序, 即第90%个响应时间|越小越好| |90%响应时间| 批量请求中, 若按响应时间的升序排序, 即第99%个响应时间|越小越好| |HPS| 网页中的每秒点击数(参考意义不大, 可能有很多无效点击)|越大越好| |TPS| 每秒处理的事务数, 这里的事务表示一套完整的业务流程|越大越好| |QPS| 每秒处理的查询数量|越大越好| - HPS TPS QPS说明 - HPS注重的是点击数, TPS注重的是流程的完成数, QPS注重的是查询的完成数 - 如果有且仅有一个查询请求的时候, HPS=QPS=TPS - 经验下的好指标 - 金融行业:1000TPS~50000TPS,不包括互联网化的活动 - 保险行业:100TPS~100000TPS,不包括互联网化的活动 - 制造行业:10TPS~5000TPS(制造行业只是小部分人的需求, 不需要这么大的每秒处理) - 互联网电子商务:10000TPS~1000000TPS(电商的并发量很大, 每秒业务的处理量必须很大) - 互联网中型网站:1000TPS~50000TPS - 互联网小型网站:500TPS~10000TPS ## JMeter压测 1. 下载 [下载地址](https://jmeter.apache.org/download_jmeter.cgi) 2. 启动 执行`bin`目录下的`jmeter.bat`批处理文件 3. 修改中文(每次启动都需要改) 4. 添加线程组 1. 线程数, 可以理解为虚拟用户数即并发数 2. `Ramp-Up`时间, 线程启动的时间, 如果线程数200, `Ramp-Up`10, 每秒启动200/10个线程 3. 循环次数, 可理解为每个线程发送的请求数 5. 取样器-Http请求 6. 监听器-查看结果树+汇总报告+聚合报告 7. ctrl+s测试计划 8. 压测 9. 清除结果 ### JMeter Address Already in use 错误解决 - 错误原因 > Windows提供的TCP/IP连接的端口号为1024-5000, 并且需要4min才能回收这些端口号 > 这会有一个问题, 当并发量很大的时候, 可用端口号被全部占满, 而且没有被回收, 就会出现这个错误 - 解决 1. 打开注册表 `win+r` -> `regedit` 2. `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters` 打开该目录 3. 修改 ![image.png](https://cos.easydoc.net/13568421/files/lkng4oru.png) 注意: 这个最大用户端口号不要写到65534, 很容易蓝屏, 写小一点 4. 重启 ## 优化的大致方向以及相关知识 ### 在优化项目之前, 确认项目的类型 |类型|特征|调优方向 |---|---|---| |CPU密集型|CPU使用率很高, 经常在90%及其以上|CPU| |IO密集型|内存使用率很高, 网络传输量很高, 磁盘IO非常的多|内存, 网络等| > 明显的是, 我们这个项目是IO密集型, 因此, 不需要管CPU, CPU对项目的提升少之又少, 但是也有关 ### 影响性能的因素 |因素|调优大致方向| |---|---| |数据库| 索引<br/>分库分表<br/>硬件</br>分布式集群 |微服务本身| 狗屎代码的改写<br/> 硬件| |中间件(NGINX等)| 硬件| |其他| 网络传输等其他方面只能通过硬件优化| ### JVM的相关知识 **详细参照我的JVM笔记, 没有的话可私** ### JvisualVM相关的理论说明和配置 **详细参照我的JVM笔记, 没有的话可私** 补充说明: #### 线程状态的说明 - Running: 正在运行 - Sleeping: 正在睡眠(sleep方法) - Wait: 等待(wait方法) - Park: 驻留(线程池中的空闲线程) - Monitor: 监视(被阻塞的线程) #### 健康GC的判定 > Eden区: 如果Eden区的内存线性增加, 满了之后恢复初始状态就非常的健康, 如果每次都多一点则需要考虑内促泄漏问题 > 老年代: 内存只能缓慢线性增加 > GCTime: Eden的时间长了, 说明Eden的内存空间不足, 老年代的时间长了, 说明主要以FullGC为主, 急需提高整体堆内存, 否则吞吐量大打折扣