在ZMQ中创建许多套接字 - 文件太多错误

时间:2017-05-30 14:16:58

标签: zeromq

我正在尝试使用来自C中相同上下文的 inproc:// 传输类创建套接字。

我可以创建2036个套接字,当我尝试创建更多zmq_socket()返回 NULL 时,zmq_errno表示24 'Too many open files'

如何创建超过2036个套接字?特别是inproc迫使我只使用一个上下文。

有几点我不明白:
- 套接字最终转为inproc,为什么它会占用文件? - 增加 ZMQ_MAX_SOCKETS 无效,系统文件限制似乎是限制因素 - 我无法在Mac上使用 ulimit 增加文件限制,没有解决方法有帮助。

//代码实际上是在cython中,可以在这里找到:

https://github.com/DavoudTaghawiNejad/ABsinthCE

3 个答案:

答案 0 :(得分:1)

解决方案是多重复杂的:

inproc 并不会强制您拥有一个公共Context()实例,但由于信令/消息传输没有任何数据传输,因此它很方便。只需通过零拷贝,对RAM内存块进行指针操作,这非常快。

我开始收集与ZeroMQ相关的事实,关于为O / S内核设置支持的#34;套接字"提供70.000~200.000个文件描述符,但是您发布的目标更高。 高得多。

鉴于您的git发布的多智能体ABCE项目论文指的是纳秒级剃须,HPC域级解决方案(引用/重点增加:)

  

高达1.073.545.225的数量,更多的代理,甚至超过最复杂的超级计算机的内存,一些成千上万的文件描述符并不值得花时间。

您的项目同时面临多重问题。

让我们逐步剥离问题层:

文件描述符(FD) - Linux操作系统级别 - 系统范围限制:

要查看实际的现状:

修改 /etc/sysctl.conf 文件

# vi /etc/sysctl.conf

附加一个config指令,如下所示:

fs.file-max = 100000

保存并关闭文件。

用户需要注销并重新登录才能使更改生效,或者只需输入以下命令:

# sysctl -p

使用命令验证您的设置:

# cat /proc/sys/fs/file-max

(最大)用户特定文件描述符(FD)限制:

每个用户还有一组( soft-limit, hard-limit )

# su - ABsinthCE
$ ulimit -Hn
$ ulimit -Sn

但是,您可以通过修改 ABsinthCE 文件将 /etc/security/limits.conf 用户(或任何其他用户)限制为任何特定限制,输入:< / p>

# vi /etc/security/limits.conf

根据需要为ABsinthCE用户设置相应的软限制和硬限制

ABsinthCE soft nofile 123456
ABsinthCE hard nofile 234567

所有这些都不是免费的 - 每个文件描述符占用一些内核内存,所以在某些时候你可能会耗尽它。数十万个文件描述符对于服务器部署来说并不麻烦,因为服务器部署使用了基于事件(epoll on Linux)的服务器体系结构。 但是直接忘记尝试在接近上述1.073.545.225水平的地方增长。

今天,人们可以拥有一台拥有~50-500 TB RAM的私人HPC机器(不是云幻觉)。

但是,应该重新定义多代理项目应用程序体系结构,而不是在极端资源分配上失败(仅仅因为语法简单易用)。

专业的多智能体模拟器是正确的,因为极端扩展,非常保守每个代理实例资源锁定。

因此,在使用直接内存映射操作时,可以预期(在性能方面和延迟方面)最佳结果。 ZeroMQ inproc:// transport-class很好,并且不需要Context()实例来分配IO线程(因为根本没有数据泵,如果仅使用{{ 1}} transport-class),对于快速原型设计阶段非常有效。同样的方法对于将规模大大提高到生产预期水平将会变得很危险。

延迟削减和加速时间模拟器操作吞吐量扩展是下一组目标,用于提高基于Multi-Agent的模拟静态比例并提高模拟器性能。

对于一个严重的纳秒狩猎,请跟随优秀的彭博的大师John Lakos,对HPC的见解。

预分配(作为RTOS域中的常见最佳实践)并且根本不分配,或遵循John's fabulous testing-supported insights presented on ACCU 2017.

答案 1 :(得分:1)

您可以使用 sysctl (在Yosemite和El Capitan上尝试过)更改这些内容,但问题是需要更改的内容。以下是关于此主题的帖子:Increasing the maximum number of tcp/ip connections in linux

这是在Linux上,Mac基于BSD 4.x,但BSD上sysctl的手册页可在线获取。

注意: sysctl是iOS上的私人界面。

答案 2 :(得分:0)

使用 zmq_ctx_set()

zmq_ctx_set (context, ZMQ_MAX_SOCKETS, 256);