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)启用分片,分散读写压力,示例配置:
分片数建议等于CPU核心数,高频访问表用tables: session: shards: 4 storage_type: ram_copies roster: shards: 4 storage_type: disc_only_copiesram_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: truepool_size建议等于CPU核心数,开启tcp_keepalive及时清理无效连接。 - 调整会话超时,回收闲置资源:
用户无活动1小时后自动断开会话,减少闲置进程占用。timeout: 3600
4. 日志与监控调整
- 降低日志级别到
info,避免debug日志消耗CPU:loglevel: info - 定期用
ejabberdctl stats查看进程数、连接数、mnesia读写指标,快速定位性能瓶颈。
内容的提问来源于stack exchange,提问作者user35546
相关产品推荐
相关产品推荐

