测试目的
测试默认配置下的Spring WebSocket+SockJS+Stomp 最大连接数
服务器环境
系统:win10
内存:8G
运行环境:spring-boot-starter-undertow,以Spring jar包造型运行
服务器搭建参考《Spring Boot 的 WebSocket 开发说明文档》
服务器没有进行调优,使用的是SpringBoot默认配置。
测试环境
使用纯java代码测试
//连接数
public static int connectNum = 0;
//连接成功数
public static int successNum = 0;
//连接失败数
public static int errorNum = 0;
/**
* 测试websocket最大连接数
* @throws InterruptedException
*/
@Test
public void testConnect() throws InterruptedException {
new Thread() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//每次3秒打印一次连接结果
System.out.println( DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss:sss") +
" 连接数:" + connectNum
+ " 成功数:" + successNum
+ " 失败数:" + errorNum);
}
}
}.start();
List<WebSocketStompClient> list = new ArrayList<>();
System.out.println("开始时间:"
+ DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss:sss"));
while (true) {
//连接失败超过10次,停止测试
if(errorNum > 10){
break;
}
list.add(newConnect(++connectNum));
Thread.sleep(10);
}
}
/**
* 创建websocket连接
* @param i
* @return
*/
private WebSocketStompClient newConnect(int i) {
List<Transport> transports = new ArrayList<>();
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
WebSocketClient socketClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(socketClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.afterPropertiesSet();
stompClient.setTaskScheduler(taskScheduler);
String url = "ws://localhost:8088/websocket?token=" + i;
stompClient.connect(url, new TestConnectHandler());
return stompClient;
}
private static synchronized void addSuccessNum() {
successNum++;
}
private static synchronized void addErrorNum() {
errorNum++;
}
private static class TestConnectHandler extends StompSessionHandlerAdapter {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
addSuccessNum();
}
@Override
public void handleTransportError(StompSession session, Throwable exception) {
addErrorNum();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
开始测试
第一次测试
测试环境
win10 一台
网络:本地网络 localhost
测试方式:直接跑上面的java代码
测试时长:2018-03-09 10:16:18 ~ 2018-03-09 10:26:42 共 10分24秒
测试结果:
测试机的开始测试的时间图
测试机达到连接上限的结束测试图
服务器的当时的连接数图
最终当测试机器的连接数达到16343时,出现异常,无法再添加连接了。
第二次测试
测试环境同第一次
win10 一台
网络:本地网络 localhost
测试方式:直接跑上面的java代码
测试时长:2018-03-09 10:29:23 ~ 2018-03-09 10:39:41 共 10分18秒
测试结果:
测试机的开始测试的时间图
测试机达到连接上限的结束测试图
服务器的当时的连接数图
最终当测试机器的连接数达到16284时,出现异常,无法再添加连接了。
第三次测试
测试环境
win10 三台,macOS10.11.6 一台
网络:局域网
测试方式:每台测试机跑上面java代码,然后限制跑10000个连接数
测试时长:2018-03-09 13:02:26 ~ 2018-03-09 14:18:00:41 共 1小时16分15秒
测试结果:
测试机忘记截图了
服务器的连接数图
一开始是用三台win10测试的,当三台机子跑满10000个连接时服务器还是没有出来异常,所以又加了一台macOS机子进来,最终当服务器的连接数达到37001时,macOS出现了异常,又没找到更多机子测试,最终终止了本次测试。
测试结论
前两次测试是在本地测试的(服务器和测试在同一台机子上),当连接数到1万6的时候测试端就出现了异常,看异常是已经达到了最大连接数了,服务器的连接并未到达上限,测试出现了瓶颈。所以第三次测试又找来了几台机子一起测,一开始是用三台win10测试,每台跑10K个连接,当三台机器跑满10K时,测试端和服务器端都没有出现异常,所以又找到了一台macOS苹果机加入测试,当macOS端跑到7K时出现了连接数最大限制异常,无法再新增连接了,最后由于没有新机子测试,就终止了测试。
最终结论是
1. win10下客户端WebSocketStompClient的最大连接数是16K+,macOS下客户端WebSocketStompClient的最大连接数是7K。
2. 由于测试条件不成熟,没用专业的测试工具,没能测出服务器端的最大连接数,估计不少于40K。
3. 本次测试仅仅是测试连接数,连接没有加入负载代码,数据仅做参考,不能应用到实际项目中。
---------------------
作者:lnktoking
来源:CSDN
原文:https://blog.csdn.net/lnkToKing/article/details/79493498
版权声明:本文为博主原创文章,转载请附上博文链接!