@@ -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