1.测试环境

- 服务端:普通机*(I3 2核心4线程)/mem:16GB

- 客户端:普通机*(I3 2核心4线程)/mem:48GB(4台)

- 系统:sys:Centos  6  Erlang:OTP 18   Ejabberd 15

- 网络:内网千兆互联

分布式测试

distributed-test

 

2.Ejabberd 性能调优

调整ulimit限制

编辑/etc/security/limits.conf,加上:

编译优化

官方不建议开启Hipe,速度提升的同时可能带来一些问题,如fprof不能正常使用,这里面选择部分hipe(xml),参考Speed Up Ejabberd

启动参数调整(安装路径默认)

编辑/etc/ejabberd/ejabberdctl.cfg

  • ERL_MAX_PORTS (默认最大32w在线)

每个到客户端(s2c)和服务器(s2s)的连接消耗一个port, ERL_MAX_PORTS定义了Ejabberd可以支持的并发连接数,默认值为32000,大并发连接场景下的应用需要增大该参数的值。这里改成3200000。

  • ERL_PROCESSES (默认最大12w在线)

Erlang消耗很多轻量级进程, 如果Ejabberd比较繁忙, 可能会达到进程数上限, 这种情况会导致高。 当消息延迟过高时, 需要判断是否是由于该参数引起的。默认值为250000,这里改成25000000。

  • Mnesia表过载

大并发时mnesia警告** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},在disc_copy类型的表时,有两个参数影响出现Mnesia is overloaded: {dump_log, write_threshold}错误,默认参数是dump_log_write_threshold 50000 -mnesia dc_dump_limit 40。

dc_dump_limit:磁盘备份表从内存中被抛弃的时间间隔
dump_log_time_threshold:在新垃圾回收之前的最大的写入数

  • ETS表个数限制问题

ets表使用的数目超过系统的限制提示:"Too many db tables"

  • 快速垃圾回收(影响不确定,不是很建议加)

按1k/sec 频率登录时,当在线到达10w时会触发gc(Major collection),在gc执行期间开销比较大(通过VTune),会引起中断,造成cpu跑满,系统响应下降。fullsweep_after控制深扫描的频率,这个参数确定多少次gc后执行一次深度gc,这里调成0,可以较快内存回收。

  • Erlang 虚拟机参数(影响不确定,不是很建议加)

参考:http://www.cnblogs.com/lulu/p/4132278.html

修改/etc/ejabberd/ejabberdctl.cfg中的ERL_OPTIONS

+sbt db 绑定调度器与CPU的亲缘性
+sbwt none 关闭beam 调度器 spinlock,降低CPU
+swt low 提高调度器唤醒灵敏度,避免长时间运行睡死问题
+P 2000000 进程数限制(默认即可)
+K true 启用epoll (默认使用)
+smp auto 在多核上开启多个调度器 (默认使用)

 

ejabberd配制调整

  • 调整日志等级

修改/etc/ejabberd/ejabberd.yml

  • 堆大小监视调整

在线到达10w后cpu消耗大问题。

 

内核参数调整

3.压测场景

  •  2k/s 登陆、认证、操作。
  • 运行2分钟后20w在线

4.结果

  • 4台tsung集群未跑满,瓶颈在服务器。
  • 服务器:未触发gc时CPU剩余30%左右。
  • 服务器:内存最高7g,登陆完后稳定3g。
  • 服务器:流量上平均收2.5m/sec,发3.5m/sec。
  • 在gc(Major collection)启动时会比较严重影响服务器响应速度,在不开启快速回收(fullsweep_after)在线达不到要求(20w),下图可以明显看到。

ejabberd_gc

 

参考资料

1.Erlang C1500K长连接推送服务-性能

http://www.cnblogs.com/lulu/p/4132278.html

2.Erlang进程堆垃圾回收机制

http://blog.csdn.net/mycwq/article/details/26613275

3.Erlang垃圾回收机制

http://www.cnblogs.com/me-sa/archive/2011/11/13/erlang0014.html

4.erlang 虚机CPU 占用高排查

http://www.cnblogs.com/lulu/p/3978378.html

基于 erlang 的Ejabber 压力测试
标签: