Skip to content

Commit fdd596e

Browse files
authored
Merge pull request #286 from icey-yu/fix-group
feat: large group
2 parents 272f001 + ddbd89e commit fdd596e

File tree

1 file changed

+68
-19
lines changed

1 file changed

+68
-19
lines changed

docs/guides/benchmark_test.mdx

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,30 +79,68 @@ sidebar_position: 4
7979
| **抽样统计消息平均时延** | 0.202秒 |
8080
| **抽样统计消息最大时延** | 3.641秒 |
8181

82-
#### 测试三:5万在线用户+5万大群
82+
#### 测试三:10w人大群
8383

84-
测试程序B:模拟5万在线用户,随机发送消息
84+
> 以下数据为**商业版OpenIM**测试结果
8585
86-
测试程序A:模拟20个用户,其中16个立刻登录,向10个5万人群聊、好友发送消息
86+
##### 代码修改:
8787

88-
测试程序A注册10万用户:go run main.go -reg -u 100000
88+
- 测试程序A在` internal/group/notification.go `文件中,搜索`case constant.MemberInvitedNotification:`,注释掉此`case`中的内容,防止建群时测试程序A压力过大。
89+
- 测试程序A在`internal/group/group.go`文件中,搜索`syncer.WithNotice[*model_struct.LocalGroupMember, group.GetGroupMemberListResp`,找到下方`switch state`,注释掉`case``case syncer.Insert`中的内容,防止建群时测试程序A压力过大。
90+
- 测试程序B在`internal/interaction/long_conn_mgr.go`中,找到`handleMessage`方法,在函数名下方直接加上`return nil`,减少测试程序B收到消息压力。
91+
92+
此次测试使用了5台64核128G服务器,分别用来部署4个测试程序B和1个服务端,1台16核32G服务器部署测试程序A。都使用内网连接。
93+
94+
##### 运行:
95+
96+
测试程序B:模拟10万在线用户,几乎不发送消息
97+
98+
测试程序A:模拟20个用户,其中20个立刻登录,向1个10万人群聊、好友发送消息
99+
100+
测试程序A注册20万用户:go run main.go -reg -u 200000
101+
102+
测试程序A创建1个大群,11w群成员:go run main.go -lgr 1 -imf -crg -ckgn -ckcon -u 20 -su 1 -lg 1 -cg 0 -lgm 110000 -msgitv 40 -gm 5000 -sm 0
103+
104+
创建完群聊之后,每一个测试程序B启动2.5万在线用户:
105+
106+
- go run main.go -o 25000 -s 11 -e 25011 -c 1000 -i 500000 -rs 1000 -rr 1000
107+
- go run main.go -o 25000 -s 25011 -e 50011 -c 1000 -i 500000 -rs 1000 -rr 1000
108+
- go run main.go -o 25000 -s 50011 -e 75011 -c 1000 -i 500000 -rs 1000 -rr 1000
109+
- go run main.go -o 25000 -s 75011 -e 100011 -c 1000 -i 500000 -rs 1000 -rr 1000
110+
111+
打开`Grafana`并配置好数据源和仪表盘,确认10w用户登录完毕之后,再启动测试程序A:
112+
113+
测试程序A统计消息完整性和时延:go run main.go -lgr 1 -sem -ckmsn -u 20 -su 1 -lg 1 -cg 0 -lgm 110000 -msgitv 40 -gm 5000 -sm 0
89114

90-
测试程序B启动5万在线用户:go run main.go -o 50000 -s 49500 -e 99500 -c 100 -i 500 -rs 1000 -rr 1000
115+
此时,测试程序A部署在服务器的共享内存/dev/shm上
91116

92-
测试程序A统计消息完整性和时延:go run main.go -lgr 0.8 -imf -crg -ckgn -ckcon -sem -ckmsn -u 20 -su 3 -lg 10 -cg 0 -cgm 5 -sm 0 -gm 10
117+
##### 结果
93118

94-
此时,测试程序A部署在服务器2的共享内存/dev/shm上,测试程序B部署在服务器1上
119+
| 参数/结果 | 描述 |
120+
| ------------------------------ | ------------------------------------------------------------ |
121+
| **压力情况** | 100000用户在线,每秒发送约200条消息,推送消息频率为2000w条/s |
122+
| **抽样统计用户数** | 20用户,其中20人立刻登录 |
123+
| **抽样统计用户的群数量及规模** | 1个大群,每个群110000人,其中10010人在线 |
124+
| **抽样统计消息发送频率** | 峰值200条/s |
125+
| **抽样统计消息数** | 190w |
126+
| **抽样统计消息完整性** | 100%(所有消息精准送达) |
127+
| **抽样统计消息平均时延** | 0.805秒 |
128+
| **抽样统计消息最大时延** | 3.772秒 |
95129

96-
| 参数/结果 | 描述 |
97-
| ------------------------------ | ----------------------------------------- |
98-
| **压力情况** | 50000用户在线,每秒发送约1700条消息 |
99-
| **抽样统计用户数** | 20用户,其中16人立刻登录,另外4个延迟登录 |
100-
| **抽样统计用户的群数量及规模** | 10个大群,每个群50000人,其中500人在线 |
101-
| **抽样统计消息发送频率** | 峰值32条/s |
102-
| **抽样统计消息数** | 24000 |
103-
| **抽样统计消息完整性** | 100%(所有消息精准送达) |
104-
| **抽样统计消息平均时延** | 0.022秒 |
105-
| **抽样统计消息最大时延** | 1.664秒 |
130+
##### 资源消耗:
131+
132+
此场景下,服务端的资源消耗峰值为:
133+
134+
- CPU:48.81%(约31核+)
135+
- 内存:11.06%(约14.15G)
136+
- 出网带宽:11.158Gibit/s
137+
- 入网带宽:252.372Mibit/s
138+
139+
测试程序B的服务器的主要资源消耗峰值为:
140+
141+
- CPU:38.01%(约24核+)
142+
143+
以上数据仅供参考。
106144

107145
#### 测试二服务器资源消耗
108146

@@ -357,6 +395,11 @@ go run main.go -test -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -msgitv 1000 -re
357395

358396
### **注意事项**
359397

398+
运行测试程序,需要注意以下事项避免影响结果:
399+
400+
1. 测试程序和服务端应使用内网连接,避免网络影响。
401+
2. 测试程序A应该部署在内存文件系统上(此测试中为/dev/shm),避免磁盘读写开销。
402+
360403
#### **限制修改**
361404

362405
- 在模拟操作过程中,多个 SDK 实例同时运行,可能会对服务器造成较大压力,进而引发超时或其他问题。为确保系统在进行大规模数据量测试时能够平稳运行,需对以下几个关键指标进行调整:
@@ -369,7 +412,7 @@ go run main.go -test -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -msgitv 1000 -re
369412
- 位置:`openim-sdk-core/pkg/common/trigger_channel.go`
370413
- 调整内容:找到`const timeout`,将管道超时时间适当调大。
371414
- 原因:模拟大量sdk接受服务端数据时,会对服务器造成较大压力,超时大多是因为sdk压力过大而非服务端,因此不会影响测试服务端性能的结果。
372-
415+
373416
3. **服务端通知超时时间**
374417
- 位置:`open-im-server/pkg/notification/msg.go`
375418
- 调整内容:搜索`WithTimeout`,将`context`超时的时间适当调大。
@@ -393,7 +436,7 @@ go run main.go -test -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -msgitv 1000 -re
393436

394437
7. **动态端口范围**
395438

396-
- 运行命令(选择下面其一即可):
439+
- 运行测试程序B的服务器中运行命令(选择下面其一即可):
397440

398441
- 当前会话:`sudo sysctl -w net.ipv4.ip_local_port_range="10000 65000"`
399442

@@ -410,3 +453,9 @@ go run main.go -test -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -msgitv 1000 -re
410453
```
411454

412455
- 原因:保证有足够的动态端口数模拟sdk长连接。
456+
457+
8. 打开全量在线缓存
458+
459+
-`open-im-server``config/openim-push.yml`中,找到`fullUserCache`设置为`true`
460+
- 原因:此功能会占用更多内存,但是能够提高运行效率。
461+

0 commit comments

Comments
 (0)