Skip to content

Commit 272f001

Browse files
authored
Merge pull request #281 from icey-yu/fix-test
feat: test
2 parents 7d77e98 + b097025 commit 272f001

File tree

1 file changed

+80
-29
lines changed

1 file changed

+80
-29
lines changed

docs/guides/benchmark_test.mdx

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ sidebar_position: 4
1717

1818
综合这两种测试程序,程序B主要用于模拟大量用户同时在线并进行消息交互,以增加服务器的负荷;而程序A则用于加载IMSDK,通过抽样统计来评估消息的可靠性和时延。两种程序的联合使用可以更好地模拟真实用户场景,并客观地提供IMSDK的测试报告。这种双重测试策略确保了从不同角度对系统进行全面的评估和验证。
1919

20-
## 可靠性和时延
20+
## 可靠性和时延测试
2121

2222
消息的可靠性通常指的是消息投递的可靠性,即所谓的“消息必达”。这意味着一旦消息被发送,它必须能够被接收者成功收到。考虑到网络环境的复杂性和用户在线状态的不确定性,消息的可靠性无疑成为IM系统的一个核心性能指标,也是实现上的一大挑战。通常所说的IM系统的“可靠性”,主要是指聊天消息的投递可靠性。需要说明的是,这里的“消息”是广义的,包括用户看不见的各种指令和通知,如进群退群通知、好友添加通知等。
2323

@@ -46,7 +46,7 @@ sidebar_position: 4
4646
| **测试目的** | 少量用户情况下测试消息可靠性和耗时 |
4747
| **用户数量** | 200用户,其中100人立刻登录,另外100个延迟登录 |
4848
| **群数量及规模** | 每人加入0-10个常规群,群成员人数为5人 |
49-
| **发消息频率** | 峰值150条/s |
49+
| **发消息频率** | 峰值40条/s |
5050
| **消息总数** | 112350 |
5151
| **消息完整性** | 100%(所有消息精准送达) |
5252
| **消息平均时延** | 0.231秒 |
@@ -62,16 +62,18 @@ sidebar_position: 4
6262

6363
测试程序B启动5万在线用户:go run main.go -s 49500 -e 99500 -c 100 -i 500 -rs 1000 -rr 1000
6464

65-
测试程序A统计消息完整性和时延: go run main.go -lgr 0.8 -imf -crg -ckgn -ckcon -sem -ckmsn -u 100 -su 3 -lg 0 -cg 4 -cgm 5 -sm 100 -gm 100
65+
测试程序A统计消息完整性和时延: go run main.go -lgr 0.8 -imf -crg -ckgn -ckcon -sem -ckmsn -u 100 -su 3 -lg 0 -cg 4 -cgm 5 -sm 100 -gm 100 -msgitv 1500 -test
6666

67-
此时,测试程序A部署在服务器2的共享内存/dev/shm上,测试程序B部署在服务器1上
67+
此时,测试程序A部署在服务器2的共享内存/dev/shm上,测试程序B部署在服务器1上。
68+
69+
> 测试二数据量较大,跑完需要大约4小时。如果希望更快出结果可以调小测试数据量。
6870
6971
| 参数/结果 | 描述 |
7072
| ------------------------------ | ------------------------------------------- |
7173
| **压力情况** | 50000用户在线,每秒发送约1700条消息 |
7274
| **抽样统计用户数** | 100用户,其中80人立刻登录,另外20个延迟登录 |
7375
| **抽样统计用户的群数量及规模** | 每人加入0-20个常规群,群成员人数为5人 |
74-
| **抽样统计消息发送频率** | 峰值160条/s |
76+
| **抽样统计消息发送频率** | 峰值54条/s |
7577
| **抽样统计消息数** | 170800 |
7678
| **抽样统计消息完整性** | 100%(所有消息精准送达) |
7779
| **抽样统计消息平均时延** | 0.202秒 |
@@ -172,57 +174,63 @@ OpenIM 支持同时在线 5 万人,能够处理多个 5 万人超级大群,
172174

173175
*备注:消息包大小按照2KB计算。实际消息包大小根据发送内容而异,常规的一句文字消息消息包大小为700字节左右。*
174176

175-
### **补充说明**
177+
## **压测程序运行说明**
176178

177179
本次测试用到了两个测试程序:
178180

179181
压力测试程序,路径:`openim-sdk-core/msgtest/`
180182

181183
可靠性测试程序,路径:`openim-sdk-core/integration_test/`
182184

185+
每一次运行压测程序,需要确保服务端和客户端初始数据都为空。服务端需要删除`components`文件夹并重启`docker`组件,客户端需要清楚数据库文件(默认在`integration_test/data``data`文件夹需要手动创建)。
186+
183187
以下是可靠性测试程序的使用说明以及检测逻辑的说明。
184188

185189
#### **参数说明**
186190

187191
测试程序支持通过配置参数来指定不同的测试场景。通过灵活设置参数,用户可以自由地模拟各种复杂场景,涵盖不同的网络状态和操作流程,从而更精确地评估消息通道的可靠性。
188192

189-
| 参数 | 含义 | 类型 |
190-
| ----- | -------------------------------- | ----- |
191-
| u | 用户数量 | int |
192-
| su | 拥有所有好友的用户数量 | int |
193-
| lg | 包含大群的数量 | int |
194-
| lgm | 大群人数 | int |
195-
| cg | 每个人创建的常规群聊数量 | int |
196-
| cgm | 常规群人数 | int |
197-
| sm | 每人发送的私聊消息数量 | int |
198-
| gm | 每人发送的群聊消息数量 | int |
199-
| reg | 是否注册 | bool |
200-
| imf | 是否导入好友 | bool |
201-
| crg | 是否创建群组 | bool |
202-
| sem | 是否发送消息 | bool |
203-
| ckgn | 是否检查群组数量 | bool |
204-
| ckcon | 是否检查会话数量 | bool |
205-
| ckmsn | 是否检查消息数量 | bool |
206-
| ckuni | 是否模拟卸载和重新安装并再次检查 | bool |
207-
| lgr | 登录用户比例/登录率 | float |
193+
| 参数 | 含义 | 类型 |
194+
| ------ | ---------------------------------------------------------- | ----- |
195+
| test | sdk是否运行测试模式,测试模式的sdk对于大量消息有更高容忍度 | bool |
196+
| u | 用户数量 | int |
197+
| su | 拥有所有好友的用户数量 | int |
198+
| lg | 包含大群的数量 | int |
199+
| lgm | 大群人数 | int |
200+
| cg | 每个人创建的常规群聊数量 | int |
201+
| cgm | 常规群人数 | int |
202+
| sm | 每人发送的私聊消息数量 | int |
203+
| gm | 每人发送的群聊消息数量 | int |
204+
| msgitv | 发送消息间隔(单位:ms),群聊消息和单聊消息独立计算间隔 | int |
205+
| reg | 是否注册 | bool |
206+
| imf | 是否导入好友 | bool |
207+
| crg | 是否创建群组 | bool |
208+
| sem | 是否发送消息 | bool |
209+
| ckgn | 是否检查群组数量 | bool |
210+
| ckcon | 是否检查会话数量 | bool |
211+
| ckmsn | 是否检查消息数量 | bool |
212+
| ckuni | 是否模拟卸载和重新安装并再次检查 | bool |
213+
| lgr | 登录用户比例/登录率 | float |
208214

209215

210216

211217
以下为一个运行命令的示例:
212218

213219
```bash
214-
go run main.go -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -reg -lgr 0.7 -imf -crg -ckgn -ckcon -sem -ckmsn -ckuni
220+
go run main.go -test -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -msgitv 1000 -reg -lgr 0.7 -imf -crg -ckgn -ckcon -sem -ckmsn -ckuni
215221
```
216222

217223
该命令的参数含义如下:
218224

225+
- `-test`:运行测试模式
219226
- `-u 10`:总共创建10个用户
220227
- `-su 3`:创建3个超级用户
221228
- `-lg 2`:创建2个大群聊
222229
- `-cg 4`:每个登录用户创建4个小群聊
223230
- `-cgm 5`:每个小群聊包含5个成员
224231
- `-sm 6`:发送6条私聊消息
225232
- `-gm 7`:发送7条群聊消息
233+
- `-msgitv 1000`:每隔1000ms发送一条消息
226234
- `-reg`:执行用户注册
227235
- `-lgr 0.7`:70%的用户登录
228236
- `-imf`:导入好友
@@ -347,15 +355,58 @@ go run main.go -u 10 -su 3 -lg 2 -cg 4 -cgm 5 -sm 6 -gm 7 -reg -lgr 0.7 -imf -cr
347355

348356
需要注意的是,只有申请发起人会收到好友申请通过的未读通知消息,且根据**导入好友**操作逻辑,只有超级用户的通知消息数量会有所不同。
349357

358+
### **注意事项**
359+
350360
#### **限制修改**
351361

352362
- 在模拟操作过程中,多个 SDK 实例同时运行,可能会对服务器造成较大压力,进而引发超时或其他问题。为确保系统在进行大规模数据量测试时能够平稳运行,需对以下几个关键指标进行调整:
353363
1. **修改请求超时时间**
354364
- 位置:`openim-sdk-core/pkg/network/http_client.go`
355-
- 调整内容:将请求的默认超时时间适当延长,以减少大数据量情况下的请求超时问题。建议根据测试规模和实际网络情况进行合理配置。
356-
2. **设置通知消息未读状态**
365+
- 调整内容:搜索`Timeout`,将请求的默认超时时间适当延长,以减少大数据量情况下的请求超时问题。建议根据测试规模和实际网络情况进行合理配置。
366+
- 原因:模拟大量sdk发起请求时,会对服务器造成较大压力,超时大多是因为sdk压力过大而非服务端,因此不会影响测试服务端性能的结果。
367+
368+
2. **sdk异步管道超时时间**
369+
- 位置:`openim-sdk-core/pkg/common/trigger_channel.go`
370+
- 调整内容:找到`const timeout`,将管道超时时间适当调大。
371+
- 原因:模拟大量sdk接受服务端数据时,会对服务器造成较大压力,超时大多是因为sdk压力过大而非服务端,因此不会影响测试服务端性能的结果。
372+
373+
3. **服务端通知超时时间**
374+
- 位置:`open-im-server/pkg/notification/msg.go`
375+
- 调整内容:搜索`WithTimeout`,将`context`超时的时间适当调大。
376+
- 原因:客户端和服务端在同一服务器会影响服务端性能,适当调大超时时间防止原本能正常传输的信息报错。
377+
378+
4. **服务端日志级别**
379+
- 位置:`open-im-server/config/log.yml`
380+
- 调整内容:将服务端日志级别`remainLogLevel`设置为3。
381+
- 原因:服务端日志级别默认为`debug`级别,主要为开发测试使用,会对性能产生影响。
382+
383+
5. **设置通知消息未读状态**
357384
- 位置:`open-im-server/config/notification.yml`
358385
- 调整内容:将 `groupCreated``friendApplicationApproved``unreadCount` 参数设置为 `true`。此配置将确保在线用户接收到群创建和好友申请通过的通知消息时,依然将其标记为未读消息,方便后续的未读消息数量计算。
359-
3. **最大文件描述符数量**
386+
- 原因:统一sdk未读数的计算逻辑。
387+
388+
6. **服务端最大连接数量**
389+
360390
- 位置:`open-im-server/start-config.yml`
361391
- 调整内容:根据测试时需要登录的用户数量,将`maxFileDescriptors`的值适当变大。
392+
- 原因:保证服务端能接受足够多的长连接。
393+
394+
7. **动态端口范围**
395+
396+
- 运行命令(选择下面其一即可):
397+
398+
- 当前会话:`sudo sysctl -w net.ipv4.ip_local_port_range="10000 65000"`
399+
400+
- 永久:
401+
```sh
402+
# 1) 直接写入(追加)到 /etc/sysctl.conf
403+
sudo bash -c 'echo "net.ipv4.ip_local_port_range = 10000 65000" >> /etc/sysctl.conf'
404+
405+
# 2) 立刻生效
406+
sudo sysctl -p
407+
408+
# 3) 验证
409+
cat /proc/sys/net/ipv4/ip_local_port_range
410+
```
411+
412+
- 原因:保证有足够的动态端口数模拟sdk长连接。

0 commit comments

Comments
 (0)