You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ejabberd升级至22.10后用户超1000即过载,求优化配置

问题

我们的软件基于ejabberd搭建XMPP实时消息系统,相当于2010年自研版Firebase Cloud Messaging。近期因v18至v20版本存在LetsEncrypt问题,直接从ejabberd-16升级至ejabberd-22.10。系统正常负载为3000-4000活跃用户,但升级后活跃用户数超过1000时,beam.smp进程数量激增,每个进程占用10-20%的CPU,导致服务器性能崩溃。目前只能通过重启ejabberd暂时降低活跃用户数缓解,需要恢复到3000-4000的正常负载规模。

服务器top命令输出如下:

top - 08:05:09 up 20:50,  2 users,  load average: 40.03, 22.40, 15.82
Tasks: 643 total,  11 running, 497 sleeping,   0 stopped,   0 zombie
%Cpu(s): 61.1 us, 35.8 sy,  0.0 ni,  0.1 id,  0.0 wa,  0.0 hi,  0.4 si,  2.7 st
KiB Mem : 16367432 total,   186740 free,  3427940 used, 12752752 buff/cache
KiB Swap:   262140 total,   258300 free,     3840 used. 12440420 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
11019 ejabberd  20   0 2781448  38864  12584 S  19.0  0.2   0:00.64 beam.smp
10096 ejabberd  20   0 2787856  45624  15536 S  15.7  0.3   0:01.10 beam.smp
10543 ejabberd  20   0 2781700  39608  13056 S  15.7  0.2   0:00.74 beam.smp
10678 ejabberd  20   0 2783768  39916  12892 S  15.4  0.2   0:00.66 beam.smp
10749 ejabberd  20   0 2781712  39396  14616 S  14.8  0.2   0:00.87 beam.smp
10745 ejabberd  20   0 2782452  37120  12688 S  12.8  0.2   0:00.50 beam.smp
 2088 ejabberd  20   0 2893856 148116  44624 S  12.5  0.9  11:26.30 beam.smp
10755 ejabberd  20   0 2785552  40760  12472 S  12.1  0.2   0:00.44 beam.smp
 9260 ejabberd  20   0 2786804  49224  17136 S  11.5  0.3   0:00.95 beam.smp
11319 ejabberd  20   0 2782480  31788  11204 S  11.1  0.2   0:00.34 beam.smp
10093 ejabberd  20   0 2782224  42140  15008 S  10.8  0.3   0:00.91 beam.smp
 9986 ejabberd  20   0 2782704  43572  15112 S  10.5  0.3   0:00.87 beam.smp
10169 ejabberd  20   0 2782736  38956  12904 S   9.8  0.2   0:00.73 beam.smp
10407 ejabberd  20   0 2781700  39708  13052 S   9.8  0.2   0:00.72 beam.smp

当前使用mnesia数据库且希望继续使用,请问缺少哪些配置才能支持更高的活跃用户数?


关键配置补充建议

1. Erlang虚拟机(BEAM)调度与进程限制

ejabberd 22.10依赖的Erlang版本远高于ejabberd-16,默认调度策略不匹配高负载场景:

  • 启动时指定调度器数量为服务器CPU核心数(或核心数-1),比如8核服务器添加启动参数:+S 8:8,避免过度调度引发进程激增。
  • 在ejabberd.yml中添加进程与连接限制:
    max_connections: 10000
    max_user_sessions: 5
    
    数值根据服务器资源和业务需求调整,防止无限制创建进程。

2. Mnesia数据库性能优化

针对mnesia调整存储与并发策略,适配高用户负载:

  • 为大表(如session、roster)启用分片,分散读写压力,示例配置:
    tables:
      session:
        shards: 4
        storage_type: ram_copies
      roster:
        shards: 4
        storage_type: disc_only_copies
    
    分片数建议等于CPU核心数,高频访问表用ram_copies提升速度,低频表用disc_only_copies节省内存。
  • 调整mnesia日志写入策略,降低IO占用:
    mnesia:
      dump_log_write_threshold: 1000
      dump_log_time_threshold: 3600
    
    减少磁盘写入频率,同时定期备份避免数据丢失。

3. 连接与会话管理优化

  • 为XMPP c2s端口配置连接池,复用进程处理连接,减少进程创建开销:
    listen:
      - port: 5222
        module: ejabberd_c2s
        pool_size: 8
        tcp_keepalive: true
    
    pool_size建议等于CPU核心数,开启tcp_keepalive及时清理无效连接。
  • 调整会话超时,回收闲置资源:
    timeout: 3600
    
    用户无活动1小时后自动断开会话,减少闲置进程占用。

4. 日志与监控调整

  • 降低日志级别到info,避免debug日志消耗CPU:
    loglevel: info
    
  • 定期用ejabberdctl stats查看进程数、连接数、mnesia读写指标,快速定位性能瓶颈。

内容的提问来源于stack exchange,提问作者user35546

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:39:42