- 使用jmeter进行压力测试
jmeter使用链接
- 配置http请求参数
- 查看结果树
- 查看聚合报告(主要关注95线和TPS吞吐量)
- 测试压测极限并进行tomcat配置参数调优
-
将线程数和循环次数设置为较大数,并运行
-
在阿里云服务器端通过如下命令查看java进程开启的线程数
# 可以看到java进程id为1381 [root@iZbp173307hpk4paw146d2Z etc]# ps -ef|grep java root 1381 1 1 16:48 ? 00:02:18 java -Xms400m -Xms400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.yml root 2434 1873 0 19:50 pts/2 00:00:00 grep --color=auto java ... ... [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 110 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 111 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 112 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 112 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 113 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 113 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 117 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l 117 [root@iZbp173307hpk4paw146d2Z etc]# pstree -p 1381|wc -l
可以看到线程数的极限数量为120左右,这限制了客户端的请求数.
-
查看内嵌tomcat配置
- 使用指令shift+command+O(mac指令)在idea项目搜索spring-configuration-metadata.json文件,有三个文件,选择最大的文件.该文件中配置了一些tomcat的默认参数.主要参数如下:
tomcat最大连接数取决于maxConnections这个值加上acceptCount.当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
- 使用指令shift+command+O(mac指令)在idea项目搜索spring-configuration-metadata.json文件,有三个文件,选择最大的文件.该文件中配置了一些tomcat的默认参数.主要参数如下:
-
修改阿里云服务器application.yml进行tomcat默认配置调优
server: port: 8090 tomcat: accept-count: 1000 # 等待队列长度 max-threads: 200 # 1核2G的最大线程数经验值为200,4核8G经验值为800,如果线程数太多,那么线程切换占用太多时间,反而是个拖累 min-spare-threads: 100 # 为了解决突发容量问题,先开100个线程先用着
-
重新启动并进行jmeter测试,看聚合报告结果是否有改善(主要看95线和TPS吞吐量)
# 查看java进程pid,为1381 [root@iZbp173307hpk4paw146d2Z miaosha]# ps -ef|grep java root 1381 1 0 16:48 ? 00:02:21 java -Xms400m -Xms400m -XX:NewSize=200m -XX:MaxNewSize=200m -jar miaosha.jar --spring.config.addition-location=/var/www/miaosha/application.yml root 2529 2485 0 20:46 pts/0 00:00:00 grep --color=auto java # 杀掉java进程 [root@iZbp173307hpk4paw146d2Z miaosha]# kill 1381 # 执行脚本文件启动jar包 [root@iZbp173307hpk4paw146d2Z miaosha]# ./deploy.sh &
- 定制化内嵌tomcat开发
-
除了上面accept-account、max-connections、max-threads、min-spare-threads等springboot中明确指定的tomcat参数,还有一些比较重要的但是spring-configuration-metadata.json文件中并没有明确展示的参数.比如:
# 避免客户端没什么请求但是却一直保持与服务器连接 keepAliveTimeOut: 多少毫秒后不响应就断开keepalive # 避免DNS攻击等行为 maxKeepAliveRequests: 多少次请求后keepalive断开失效
-
使用WebServerFactoryCustomizer < ConfigurableWebServerFactory > 定制化内嵌tomcat配置
package com.kenai.config; import org.apache.catalina.connector.Connector; import org.apache.coyote.http11.Http11NioProtocol; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; // 当spring容器中没有TomcatEmbeddedServletContainerFactory这个bean时,会把此bean加载进spring容器中 @Component public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> { @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连接.默认15s protocol.setKeepAliveTimeout(30000); // 定制化maxKeepAliveRequests,当客户端发送超过10000个请求,则自动断开keepalive连接.默认100 protocol.setMaxKeepAliveRequests(10000); } }); } }
-
修改源码后要重新生成jar包上传到服务器
- 容量问题优化方向
-
单web容器上限
- 线程数量: 4核8G内存的单进程调度线程数800-1000以上会话费巨大的时间在CPU调度上
- 等待队列长度: 队列做缓冲池用,但也不能无限长,消耗内存,出队入队也耗CPU. 一般设置为1000-2000
-
mysql数据库QPS容量问题
- QPS全称Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数
- 主键查询: 千万级别数据: 响应时间1-10毫秒. 主键一般是聚簇索引,另外主键查询容易被缓存命中
- 唯一索引查询: 千万级别数据: 响应时间10-100毫秒.
- 非唯一索引查询: 千万级别数据: 响应时间100-1000毫秒.
- 无索引: 百万级别数据: 响应时间1000毫秒+.
-
mysql数据库TPS容量问题
- TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。
- QPS和TPS的区别
QPS基本类似于Tps,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。
例如:访问一个页面会请求服务器3次,一次放,产生一个“T”,产生3个“Q” - 非插入的更新删除操作: 同查询
- 插入操作: 1w-10w TPS(依赖配置优化)