前提是基于docker部署的应用
性能衡量指标
- 吞吐量
- 响应时间
1. Java侧
-
Javase:
使用工具:
-
arthas
docker exec -it xxx /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"
trace命令使用
trace 类路径 方法名
例如 trace com.xxxImpl toIndex
展示的结果:
更多命令可以参考官网:
https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-basics
-
top命令,查找出问题线程步骤如下:
- top 命令查看CPU占用100%的进程号(PID)
- top -H -n 1 -p PID 然后通过命令查找对应进程下线程的状态
- 然后通过 jstack -l PID > ./jstack.log 命令输出进程的线程文件
- 查看刚输出的jstack.log文件,查看线程详情。注意这里的线程PID是第二步PID,还要转成16进制
-
vmstat、jps、jstat、jstack等原生工具,图形化jvisual
-
Springcloud压测
1. springcloud-gateway性能压测和参数配置
gateway特性:
- 网关线程数的增加,对吞吐量有较大提升;
- 网关对CPU要求较高,建议提升CPU性能,但需要权衡单台高配和多台低配的整体性能对比;
- 网关对内存、硬盘要求较低;
- 在吞吐量追求和CPU负载升高之间,做权衡选择机器配置;
可以提升处理能力的属性配置:
@Configuration
public class ReactNettyConfiguration {
@Bean
public ReactorResourceFactory reactorClientResourceFactory() {
System.setProperty("reactor.netty.ioSelectCount", "1");
// 这里工作线程数为2-4倍都可以。看具体情况
int ioWorkerCount = Math.max(Runtime.getRuntime().availableProcessors() * 4, 4);
System.setProperty("reactor.netty.ioWorkerCount",String.valueOf(ioWorkerCount));
return new ReactorResourceFactory();
}
}
2. 单个服务中springboot中tomcat和undertow参数设置参考
# Tomcat
server:
port: 8080
servlet:
context-path: /
tomcat:
# max-connections: 500
uri-encoding: UTF-8
threads:
max: 800
min-spare: 80
remoteip:
remote-ip-header: x-forwarded-for
undertow:
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
buffer-size: 1024
# 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
#buffers-per-region: 1024
# 是否分配的直接内存(NIO直接分配的堆外内存)
direct-buffers: true
threads:
# 默认设置每个CPU核心一个线程 比如 四核的服务器 则配置4
io: 8
# 默认值是IO线程数 * 8 高并发的服务可以根据并发情况调大一些
worker: 256