【问题标题】:"Failed TCP accept: emfile" in EjabberdEjabberd 中的“TCP 接受失败:emfile”
【发布时间】:2016-09-04 08:34:10
【问题描述】:

我正在运行带有 Erlang/OTP 17 的 Ejabberd 15.04,并在我运行 ejabberd 的所有 4 个 EC2 Amazon 实例中使用 Ubuntu [64 位]。 Ejabberd 是从源代码安装的。

我已经为它配置了 65,535 个文件描述符和以下配置:

ERL_MAX_PORTS=360,000

ERL_PROCESSES=15,000,000

ERL_MAX_ETS_TABLES=100,000

问题是,服务器突然停止工作,我在日志中发现了数百次:

2016-05-09 13:22:45.901 [错误] @ejabberd_listener:accept:317 (#Port) TCP 接受失败:emfile

我已经制作了自己的模块,并在一个由 4 个 erlang 节点组成的集群中运行 ejabberd,位于 Elastic Load Balancer(亚马逊的)后面。这些机器有 4 个内核和 30GB 内存。 我已将名册模块迁移到 ODBC(MariaDB,类似于 mysql)。 80k 用户同时连接。

我认为文件描述符足够高,erlang 进程和端口也是如此。 错误突然出现,服务器正常运行了 3 周。也许原因与mysql有关?如果您知道原因可能是什么,我将非常感激。

提前致谢。

【问题讨论】:

  • 在 # /etc/security/limits.conf 中设置 nofile(打开文件的最大数量)

标签: mysql erlang mariadb ejabberd


【解决方案1】:

您需要增加打开文件描述符的限制,您可以通过以下方式获取 Erlang 中的当前最大值:

proplists:get_value(max_fds, erlang:system_info(check_io)).

如果它与操作系统中设置的值不同,并且您的软件由 upstart 脚本启动,请确保您使用 limit stanza 在 upstart 脚本中设置文件描述符限制:

limit nofile 65535 65535

【讨论】:

  • 我已经检查过了,没关系。问题依然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
相关资源
最近更新 更多