Spring boot项目,用浏览器写循环进行压力测试发现,后台最大同时收到6个请求

执手相看语凝噎 发布于 05/28 17:25
阅读 580
收藏 2

 前端代码如下:

    $("#upload").click(function() {
        var formdata = new FormData($('#form')[0]);
        for (var i = 0; i < 100; i++) {
            $.ajax({
                type: 'POST',
                url: "/wechat/signIn",
                data: formdata,
                async: true,
                cache: false,
                dataType: "text",
                success: function(data) {
                    console.log(JSON.stringify(data.message) + "第" + i + "次");
                    //$("#data").val(data);
                    //$(location).attr('href', getQueryString("uri"));
                },
                error: function() {
                    console.log("上传失败");
                }
            });
        }

后端业务,有一个轮询API接口等待数据返回,并写入缓存的业务逻辑,30秒如果不返回就不在等待;

用Chrome访问后,我发现缓存的长度增长速度是每30秒增加6条;

我屮艸芔茻...重大效率问题...必须调优;

------------------------------------1分钟过去了------------------------------------

我尝试了修改Spring boot Tomcat相关的配置;

------------------------------------10分钟过去了------------------------------------

我尝试了打War包外置Tomcat;

------------------------------------1小时过去了------------------------------------

我已经准备用单机启动多个Tomcat,用Nginx负载均衡了;(弃疗...)

------------------------------------2小时过去了------------------------------------

换了火狐访问,我屮艸芔茻...存的长度增长速度提升为每30秒增加9条;

找到问题了....

猜想:

Chrome内置Ajax异步方式提交最大值为6,也就是说一个浏览器最多同时发起6个Ajax;

火狐内置Ajax异步方式提交最大值为9;

IE...抱歉,该页面不支持IE...没测IE内置Ajax异步方式提交最大值是多少;

-----------------------------------------------------------------------------------

仅已此问题祭奠我逝去的一下午...

 

 

加载中
0
seno
seno

记得是chrome 的http1.1 的协议 对于一个server 会开启最大6个httpConnection  然后复用。也就是 要最大并行就是6.后面的就排队。剩下的就看服务端什么时候返回结果。如果服务端很慢,那么 就都很慢咯

1
扣脚战神
扣脚战神

浏览器压力测试,活久见

0
蓝水晶飞机
蓝水晶飞机

Chrome 浏览器同一时间最大并发的 XMLHttpRequest 的数。

0
前端大师傅
前端大师傅

首先给楼主补充一下,虽然$.ajax是异步提交,但在执行上还是顺序执行的。即第一个请求,到最后一个请求,在developer开发者工具的网络监控里可看到提交是顺序的。但是在服务端的处理是线程处理。即服务端同时开放给request的线程最大数就只有6个。这个和客户端没有关系。而是需要在服务端修改webrequest同时容许的线程数。

 

0
dongjunv5
dongjunv5

压力测试可以试试 jmeter

0
f
freezingsky

用原生浏览器做压力测试, 脑洞大得出奇.
 

0
执手相看语凝噎
执手相看语凝噎

引用来自“前端大师傅”的评论

首先给楼主补充一下,虽然$.ajax是异步提交,但在执行上还是顺序执行的。即第一个请求,到最后一个请求,在developer开发者工具的网络监控里可看到提交是顺序的。但是在服务端的处理是线程处理。即服务端同时开放给request的线程最大数就只有6个。这个和客户端没有关系。而是需要在服务端修改webrequest同时容许的线程数。

 

这个真心无效。。。

不验证过我会乱讲?

0
前端大师傅
前端大师傅

在下并没有说阁下乱讲呀,在下只是想说明,在javascript里并没有多线程的说法,直到ecma script6都是单线程执行。如果需要多线程,也只能在worker实现多线程,而且异步并不等于多线程。es5的实现虽然有异步,但只是执行时间的先后,仍然是顺序执行并不存在所谓的一起执行的情况,阁下在for中同时提交的$.ajax虽然是异步但是执行上还是顺序提交的!所以仍然受到服务端对请求的处理影响。一般服务端都是多线程除了比较老的Php4之外高版本的apache会对每个request分出一个线程处理。如果发生ajax提交被pedding阻塞住,那就可能是线程池的最大线程低于楼主所请求的值导致的。这里可以通过设置服务端的配置来达到目的,而不是在客户端作文章,这是在下的观点。在下也算是从事这一行近20年的经验怎么可能拿这种事情开玩笑呢?如果有什么误会请见谅!

0
太黑_thj
太黑_thj

jmeter你值得拥有`````````````

0
执手相看语凝噎
执手相看语凝噎

引用来自“前端大师傅”的评论

在下并没有说阁下乱讲呀,在下只是想说明,在javascript里并没有多线程的说法,直到ecma script6都是单线程执行。如果需要多线程,也只能在worker实现多线程,而且异步并不等于多线程。es5的实现虽然有异步,但只是执行时间的先后,仍然是顺序执行并不存在所谓的一起执行的情况,阁下在for中同时提交的$.ajax虽然是异步但是执行上还是顺序提交的!所以仍然受到服务端对请求的处理影响。一般服务端都是多线程除了比较老的Php4之外高版本的apache会对每个request分出一个线程处理。如果发生ajax提交被pedding阻塞住,那就可能是线程池的最大线程低于楼主所请求的值导致的。这里可以通过设置服务端的配置来达到目的,而不是在客户端作文章,这是在下的观点。在下也算是从事这一行近20年的经验怎么可能拿这种事情开玩笑呢?如果有什么误会请见谅!

本篇文章仅仅阐述一个观点:“Chrome内置Ajax异步方式提交最大值为6。”至于原因,暂时没有去看Chrome的源码,所以不太清楚。

Js是单线程,但是如果开启异步后,每次执行后不会等待结果返回就会开始下一次请求,固然没有办法真正的同步,的确可以一定程度上反映出服务器的业务处理能力。

我说不是由于线程池的最大线程数,肯定是经过测试的。我用HttpTools请求一个等待10秒才会返回值的Controller,进入后打印“1”,返回前打印“2”,结果“1”打印了50多个,才开始打印“2”。Chrome内置Ajax异步方式提交依然是先打印6个“1”,后打印6个“2”,故得出“Chrome内置Ajax异步方式提交最大值为6。”的结论。

仅仅是关于这个结论的技术讨论,如果说的有误,还请指正。

(仅仅是懒省事一下,才发现的这么一个有意思的事情而已。。。)

返回顶部
顶部