优点
可以发现其他测试难以发现的问题,有两种错误类型是
-
内存泄漏
-
并发和同步
性能指标
- 响应时间(Response Time:RT)
- HPS(Hist per Second):每秒点击数 次/秒
- TPS(transaction per second):每秒处理查询次数 笔/秒
- QPS(Query per second):每秒处理查询次数 次/秒
一般用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示服务器点击请求
- 越大越好
jMeter
- 启动 jMeter.bat
- 创建线程组 设置线程数 请求次数
- 在线程组监听器创建 察看结果树
- 在线程组监听器创建 汇总报告
- 在线程组监听器创建 聚合报告
影响性能的点
数据库、应用程序、中间件(tomcat、Nginx)、网络和操作系统方面。
- cpu密集型
- IO密集型
Already in use
windows本身提供的端口访问机制的问题 得修改regedit注册表
jVisualvm
安装visualGC插件
中间件越多,性能损失越大,大多损失在网络交互
哪些数据适合放入缓存?
- 即时性、数据一致性要求不高的
- 访问量大且更新频率不高的数据(读多,写少)
缓存
异常
使用redis产生堆外内存溢出异常 OutofDirectMemoryError
原因:
- springboot2.0以后使用letture作为操作redis的客户端。它使用netty进行网络通信。
- lettuce的bug导致netty堆外内存溢出 可以通过
-Dio.netty.maxDirectMemory
解决方案:不能使用-Dio.netty.maxDirectMemory
只去调大堆外内存。
- 升级lettuce客户端。
- 切换使用Jedis 版本旧 没更新
缓存穿透:
查询一个一定不存在的数据,缓存没有,数据库没有,没有将null写入缓存
解决
null结果缓存,并加入短暂过期时间。
缓存雪崩
设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB
解决
在原有的失效时间基础上加一个随机值,避免大量缓存同时失效。
缓存击穿
热点数据key在大量请求同时进来前正好失效,那么所有对这个key的查询都落到DB
解决
加锁
大量并发只让一个去查,其他人等待,查到以后释放锁,其他人获取到锁,先查缓存,就会有数据,不用去DB
分布式锁
Redisson 自动续期 服务宕机过期时间到 自动释放锁
缓存一致性
-
双写 该数据库 同时更新该缓存
- 有脏数据问题
-
失效模式 写数据库 删除缓存
- 脏数据问题
解决 使用canal订阅binlog日志