Jmeter工具使用:
下载地址:jmeter.apache.org
常用命令设置:
查看服务进程:ps -ef | grep java
查看端口:netstat -anp | grep (port)
修改host:sudo vim //etc/hosts(用于dns解析,修改服务映射地址)
线程组:
可以创建线程组。
上图表示在10s中开启100个线程,每个线程调用10次接口。
Http请求:
在线程组下设置Http请求。
上图表示使用http协议,GET方式请求接口
查看结果树:
在线程组下添加结果树。
上图会返回对应接口返回的结果集和日志。
聚合报告:
在线程组下添加聚合报告。
上图显示信息有此接口的平均值,中间值,90线,95线,99线,最小值,最大值,Error,TPS(并发数/耗时),Recv数据包大小等。
性能提升:
先用jmeter工具测试当前服务端并发数下的性能数量,在根据实际情况逐步提升并发数。
常用命令:
查看进程的线程数量:pstree -p 端口号 | wc -l
查看进程的线程数量详情:pstree -p 端口号
查看机器的性能详情:top -H
常见参数如上图:
load average:最近的1min,10min,15min的load数量(IO操作)
us:用户态下cpu耗时
sy:内核空间对系统的占用
server端并发线程数上不去问题:
在jmeter中逐渐提升并发数,直到出现Error,查看当前服务器的线程数量,就得到了最大线程数。
解决:
1.增大容量:修改spring内嵌tomcat中spring-configuration-metadata.json文件下各个节点的配置
{
//设置端口号
"sourceType":"org.springframework.boot.autoconfigure.web.ServerProperties",
"defaultValue":8080,
"name":"server.port",
"description":"Server HTTP port",
"type":"java.lang.Integer"
},
{
//设置等待队列大小,默认100
"sourceType":"org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
"defaultValue":100,
"name":"server.tomcat.accept-count",
"description":"Maximum queue length for incoming connection requests when ...",
"type":"java.lang.Integer"
},
{
//设置线程最小等待数量,默认10
"sourceType":"org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
"defaultValue":10,
"name":"server.tomcat.min-spare-threads",
"description":"Minimum number of worker threads",
"type":"java.lang.Integer"
},
{
//设置最大可被连接数,默认10000
"sourceType":"org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
"defaultValue":10000,
"name":"server.tomcat.max-connections",
"description":"Maximum number of connections that the server accepts and processes...",
"type":"java.lang.Integer"
},
{
//设置最大支持线程数,默认200
"sourceType":"org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",
"defaultValue":200,
"name":"server.tomcat.max-connections",
"description":"Maximum number of worker threads",
"type":"java.lang.Integer"
}
可在配置文件中修改(按4核8G配置,具体看机器性能):
application.properties:
server.port=80
server.tomcat.accept-count=1000
server.tomcat.max-threads=800
server.tocat.min-spare-threads=100 //用于解决突发请求
注意:默认配置下:连接超过10000后出现拒接连接情况;默认配置下,触发的请求超过200+100后拒接处理
完事可以通过jmeter进行适量压测,在通过top -H可以观察到程序主要耗时实在MySql上:
2.定制化Tomcat开发:使用WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>定制化内嵌tomcat配置
/**
* @author aric
* @create 2021-07-08-19:09
* @fun 当Spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进spring容器中
*/
@Component
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
//此工厂可定制化配置tomcat参数
@Override
public void customize(ConfigurableWebServerFactory factory) {
//使用对应工厂类提供给我们的接口定制化我们的tomcat connector
((TomcatServletWebServerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
//定制化keepalivetimeout,设置30s内没有请求,服务端自动断开keepalive连接
protocol.setKeepAliveTimeout(300000);
//当客户端发送超过10000个请求则自动断开keepalive连接
protocol.setMaxKeepAliveRequests(10000);
//注:在此也可以配置增大容量的参数
}
});
}
}
响应时间变长TPS上不去:
经过jmeter测试,单Web容器上限:
线程数量:4核8G内存单进程调度线程数800-1000以上后即花费巨大的时间在cpu调度上
等待队列长度:队列做缓冲池用,但也不能无限长,消耗内存,出队也耗cpu
MySql数据库QPS容量问题:
主键查询(聚簇索引,innoDB也可以设置Buffer缓存):千万级数据 = 1-10毫秒
唯一索引查询:千万级别数据 = 10-100毫秒
非唯一索引查询:千万级别数据 = 100-1000毫秒
无索引(全表扫描):百万级别数据 = 1000毫秒+(不可接受)
非插入更新删除操作:同查询
插入操作:1w~10w tps(依赖配置优化)