1、压测工具
1.1.MeterSphere
2、系统参数配置优化
2.1.用户请求阻塞,进入线程池阻塞队列
2.2.1 问题发现
TPS上不去,通过skywalking查询是否有请求阻塞的情况或者频繁GC或者GC时间过长的情况,发现服务存在请求阻塞进入线城池阻塞队列的情况。
2.2.2 参数配置修改
修改web容器-undertown参数配置
2.2.Gateway服务CPU占用过高
2.2.1 问题发现
Gateway服务CPU一直处于高负载状态。
2.2.2 问题定位
查看服务配置以及网上查找相关资料,定位到可能是hystrix隔离参数的问题
hystrix隔离参数配置
2.2.3 为什么要隔离
比如我们的Gateway服务可能会将用户请求转发到后面的多个服务去,其中某个服务A的接口耗时比较长,并且在某一段时间内很多用户同时访问A服务,消耗掉了系统大部分资源,这个时候,如果有用户想要调用服务B的接口,由于资源不足,导致无法访问,因此就需要对Gateway服务依赖的服务进行隔离,保证不同的服务之间相互不受影响。
https://www.cnblogs.com/hzzjj/p/15956974.html
2.2.4 隔离的两种方式
Hystrix的隔离策略有两种:
- THREAD(线程隔离)
- SEMAPHORE(信号量隔离)
2.2.5 两种隔离方式的适用场景
- 线程池隔离:适用于处理大量并发请求的情况。由于每个线程都有独立的执行路径,可以避免一个请求的问题影响到其他请求。此外,通过为每个依赖项使用独立的线程池,可以更好地控制资源的使用和隔离潜在的故障。
- 信号量隔离:适用于处理高吞吐量、低延迟的场景。由于信号量不限制并发请求的数量,因此在处理大量并发请求时,性能表现可能优于线程池隔离。但是,如果某个请求需要很长时间才能完成,可能会导致其他请求被阻塞或回退。
2.3.Gateway服务堆外内存泄漏
2.3.1 问题发现
压测过程中,一旦请求数量上去之后,Gateway就会打印出内存泄露的日志。
2.3.2 问题解决
由于spring-cloud-gateway中依赖了webflux,webflux中又依赖了netty,从netty的报错信息来看,正是由于使用了netty中的ByteBuf,但是未释放掉(未调用release方法)。
https://netty.io/wiki/reference-counted-objects.html
初始版本:
升级后版本:
2.4.慢接口查询,优化代码
2.4.1 慢接口查询,优化代码
- 通过skywalking查看对应接口的trace日志
- 通过arthas的trace指令获取指定方法的执行时间
- 给常用的业务表创建合适的索引
2.4.2 Mycat配置调整
- 通过上个步骤排查到许多mapper接口执行时间很长,长达十几秒
- 电商W系统中部分服务并非直接连接数据库,而是通过mycat做了分库,然后查看了mycat的配置,首先是将mycat中打印到Console的日志配置取消,发现速度直接大幅提升,可以判断mycat服务本身输出到console的日志对执行请求的影响是很大的。
- mycat其他配置参数