Ejabberd中的“TCP接受失败:emfile”

时间:2016-05-09 15:59:31

标签: mysql erlang mariadb ejabberd

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

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

ERL_MAX_PORTS = 360000

ERL_PROCESSES = 15000000

ERL_MAX_ETS_TABLES = 100,000

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

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

if (fix && (lastControlled + 5f < Time.time))
{
    goalRotation.eulerAngles = new Vector3(90, transform.parent.rotation.eulerAngles.y, 0);
    transform.parent.rotation = Quaternion.Slerp(transform.parent.rotation, goalRotation, Time.deltaTime);
}
if (fix && (transform.parent.rotation.eulerAngles.x == 90) && (transform.parent.rotation.eulerAngles.z == 0))
{
    fix = false;
}

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

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