我正在尝试使用来自C中相同上下文的 inproc://
传输类创建套接字。
我可以创建2036个套接字,当我尝试创建更多zmq_socket()
返回 NULL
时,zmq_errno
表示24 'Too many open files'
。
如何创建超过2036个套接字?特别是inproc
迫使我只使用一个上下文。
有几点我不明白:
- 套接字最终转为inproc
,为什么它会占用文件?
- 增加 ZMQ_MAX_SOCKETS
无效,系统文件限制似乎是限制因素
- 我无法在Mac上使用 ulimit
增加文件限制,没有解决方法有帮助。
//代码实际上是在cython中,可以在这里找到:
答案 0 :(得分:1)
inproc
并不会强制您拥有一个公共Context()
实例,但由于信令/消息传输没有任何数据传输,因此它很方便。只需通过零拷贝,对RAM内存块进行指针操作,这非常快。
我开始收集与ZeroMQ相关的事实,关于为O / S内核设置支持的#34;套接字"提供70.000~200.000个文件描述符,但是您发布的目标更高。 高得多。
鉴于您的git发布的多智能体ABCE项目论文指的是纳秒级剃须,HPC域级解决方案(引用/重点增加:)
高达1.073.545.225的数量,更多的代理,甚至超过最复杂的超级计算机的内存,一些成千上万的文件描述符并不值得花时间。
您的项目同时面临多重问题。
让我们逐步剥离问题层:
要查看实际的现状:
修改 /etc/sysctl.conf
文件
# vi /etc/sysctl.conf
附加一个config指令,如下所示:
fs.file-max = 100000
保存并关闭文件。
用户需要注销并重新登录才能使更改生效,或者只需输入以下命令:
# sysctl -p
使用命令验证您的设置:
# cat /proc/sys/fs/file-max
每个用户还有一组( 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水平的地方增长。
但是,应该重新定义多代理项目应用程序体系结构,而不是在极端资源分配上失败(仅仅因为语法简单易用)。
专业的多智能体模拟器是正确的,因为极端扩展,非常保守每个代理实例资源锁定。
因此,在使用直接内存映射操作时,可以预期(在性能方面和延迟方面)最佳结果。 ZeroMQ inproc://
transport-class很好,并且不需要Context()
实例来分配IO线程(因为根本没有数据泵,如果仅使用{{ 1}} transport-class),对于快速原型设计阶段非常有效。同样的方法对于将规模大大提高到生产预期水平将会变得很危险。
延迟削减和加速时间模拟器操作吞吐量扩展是下一组目标,用于提高基于Multi-Agent的模拟静态比例并提高模拟器性能。
预分配(作为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);