如何在 CentOS 上扩展 ejabberd 服务器机器以处理 200 K 连接?

Posted

技术标签:

【中文标题】如何在 CentOS 上扩展 ejabberd 服务器机器以处理 200 K 连接?【英文标题】:How to scale ejabberd Server machine on CentOS to handle 200 K connections? 【发布时间】:2016-07-11 02:53:38 【问题描述】:

我正在开发一个相当不错的 ejabberd 实例,它有 40 核 CPU 机器和 160 GB RAM。

问题是我无法扩展到 200 K 并行连接。

sysctl 配置如下:

net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
#http://linux-ip.net/html/ether-arp.html#ether-arp-flux
net.ipv4.conf.all.arp_filter = 1
kernel.exec-shield=1
kernel.randomize_va_space=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.all.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.ip_local_port_range = 12000    65535
fs.nr_open = 20000500


fs.file-max = 1000000
net.ipv4.tcp_max_syn_backlog = 10240
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_max_orphans = 60000

net.ipv4.tcp_synack_retries = 3

net.core.somaxconn = 10000

/etc/security/limits.conf 文件条目如下:

*               soft    core            900000
*               hard    rss             900000
*               soft    nofile          900000
*               hard    nofile          900000
*               soft    nproc           900000
*               hard    nproc           900000

当服务器达到大约 112 K 时,机器开始失去连接。

发生在 112 K 左右的事情

    CPU 使用率高达 200 ~ 300 %(但这是通常的峰值)

背景 - 当一切正常时,CPU 使用率会飙升至 80%,如下图所示(只有两个 CPU 正在做实际工作)

    我无法在机器上工作。我正在使用 top 和 ss 命令来查看服务器上发生了什么。机器此时停止响应,连接开始断开。

一个可取之处在于连接不会突然断开,而是以它们连接的速率断开。

我正在使用 TSUNG 来生成负载。有 4 个负载生成器盒访问 4 个不同的 ip,内部仅映射到一台机器。

非常欢迎任何建议,意见。

【问题讨论】:

@Amiramix:我现在能够达到 200 K 以上。涉及一些更改,将机器更改为 8 核并确保前 4 核处理网络中断。 【参考方案1】:

作为第一个电话,您需要确定您的案例中的瓶颈是什么:

CPU 内存 系统限制(打开的套接字、打开的文件) 应用架构

如果可能,将资源跟踪应用程序添加到您的节点,例如recon。它将允许您检查进程队列的长度、内存碎片等。在我们的生产系统中,由于透明大页面(Transparent Huge Pages),系统报告的 Erlang VM 消耗的内存量与 Erlang VM 本身报告的内存量不同(系统已虚拟化)。使用系统工具检查节点时可能存在其他不明显的问题。

所以我建议:

    确定具有最长队列大小的进程 - 它们将导致系统变慢,因为 Erlang VM 在收到消息时需要扫描进程的整个收件箱

    确定分配内存最大的进程

    确定 Erlang 自己认为分配了多少内存

另外,如果您添加用于启动 Erlang VM 的参数会很好。

加法

忘了提一下,WhatsApp 对其 Erlang 节点进行的调整以处理数十万个同时连接可能值得一看:

The WhatsApp Architecture Facebook Bought For $19 Billion

【讨论】:

以上是关于如何在 CentOS 上扩展 ejabberd 服务器机器以处理 200 K 连接?的主要内容,如果未能解决你的问题,请参考以下文章

centos 安装 ejabberd 报“Error: Error running Post Install Script.”问题排查

使用自定义 mysql 模式的模块扩展 ejabberd?

ejabberd:并行处理具有不同命名空间的多个数据包

centOS下安装ejabberd

如何在 Ejabberd 16.09-4 Debian9 上启用 omemo?

ejabberd 'make' 通过“无法运行已编译的 C 程序”