tomcat优化
使用背景:多文件上传批量处理,提高用户的体验,在上传大量文件采用异步处理,那么需要提高上传接口的并发量,我压力测试该接口,出现连接被拒接的情况
jmeter压力测试
postman测试感觉比这个好:https://www.cnblogs.com/stm32stm32/p/10434399.html
有一点,postman压力测试文件上传时,后台只能采用request,获取流的方法获取
/**
* postmain测试上传文件压力测试
*
* @param request
* @param response
* @return
* @throws IOException
*/
@RequestMapping("/uploadImg")
@ResponseBody
public Object uploadImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("图片上传开始...");
String destDir = "/upload/image";
/* response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");*/
ServletInputStream inputStream = request.getInputStream();
//获取文件上传的真实路径
String uploadPath = request.getSession().getServletContext().getRealPath("/");
//保存文件的路径
String filepath = destDir + File.separator + createNewDir();
File destfile = new File(uploadPath + filepath);
if (!destfile.exists()) {
destfile.mkdirs();
}
//文件新名称
String fileNameNew = getFileNameNew() + ".png";
File f = new File(destfile.getAbsoluteFile() + File.separator + fileNameNew);
if (!f.exists()) {
OutputStream os = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] buf = new byte[1024];
int length;
length = inputStream.read(buf, 0, buf.length);
while (length != -1) {
bos.write(buf, 0, length);
length = inputStream.read(buf);
}
bos.close();
os.close();
inputStream.close();
String lastpath = filepath + File.separator + fileNameNew;
System.out.println("返回图片路径:" + lastpath);
return lastpath;
}
return false;
}
压力测试工具:网上现在一个jmeter工具,用法比较简单,我搞了个jmeter5.3的,还是英文版本的,吊单词都不认识几个,用起来都想抽自己,不过当学习下英文吧,勉强能用,这个下载后好,解压免安装的,但是需要配置环境变量,自行百度,没啥的,怎么使用是个问题,我自己测试老是不行,这里给出图形和文字说明
window版本的,点击:
这个含义
添加监听,我采用下面两个
另外一个是
这个可以将输出结果存放在这个文件中(我在springcloud网关中做的限流然后使用压力测试)
设置请求头,我这边有个token校验
看我的这个参数设置,我是文件上传的,你上传文件可以f12看那个请求头的报文信息,然后复制过来,
看f12的
我配置的请求头看:
这样就可以了,然后配置请求信息
看文件上传的那个参数设置
这样就行了,你在
压力测试具体含义信息(英文看不懂,这个给出了中文解释):https://www.jianshu.com/p/f6014b481d5e
,你添加这个
这个工具压力测试会出现下面几个坑,我就中招了一个连接中断,看这个链接:https://www.cnblogs.com/shenh/p/10240714.html
一些常见的jmeter的错误和解决方法:https://www.cnblogs.com/jane4321/p/11013042.html
,我配置如下图
springboot-tomcat调优
可以看下这篇文章:https://www.cnblogs.com/gaoqiaoliangjie/p/11047910.html,我是参考他的
目标:
对tomcat线程扩容
对应的线程池做变更
keepAlive做优化
首先看boot内嵌的tomcat信息
经验来说4核8g的虚拟机最合适的最大线程数为800,最小的100是为了解决突发问题,当有请求突发访问的时候可以解决。
我本地内嵌tomcat修改为yml信息为
服务端优化配置内嵌tomcat
package com.jydw.sample.config.pubic;
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;
/**
* @version 0.0.1
* @program: sample
* @description: 定制化内嵌tomcat配置 优化tomcat,提高并发处理
* @author: huangzq
* @create: 2020-10-30 10:45
*/
//当spring容器内没有TomcatEmbededServletContainerFactory这个bean时,会把此bean加载进来
@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,30s没有请求服务,自动断开
protocol.setSelectorTimeout(30000);
//当请求超过10000条就自动断开keepAlive链接
protocol.setMaxKeepAliveRequests(10000);
}
});
}
}