我有一个设置,其中主进程正在设置 ZMQ_ROUTER
,然后分叉许多子进程,然后连接到该路由器。
每当一个孩子zmq_connect()
到主人时,就会占用一个文件描述符。
但是,这会将交互进程的数量限制为允许的文件描述符数(每个进程)。对我来说(linux),目前只有1024。
这对我的预期用途来说太小了(多代理/群体模拟)。
答案:
除非使用线程间套接字类型(使用inproc://
传输类),否则不能这样做。所有其他协议每个连接使用一个文件描述符。
一种减少每个应用程序所需文件描述符数量的新方法,如果该应用程序具有多个服务(例如,可以进行多个tcp://<address:port>
连接),则似乎是使用资源属性{{3} },允许将多个服务组合到一个端点。
答案 0 :(得分:3)
首先,大量代理商的智能解决方案需要灵活性(在功能和增加的群体框架设计中)和效率(两者都需要) 可扩展性和速度),以便尽可能快地实现模拟运行时间,尽管 PTIME
&amp; PSPACE
障碍,可能会在更复杂的代理间通信方案中徘徊进入 EXPTIME
区域。
在第一时刻,我的猜测是宁愿使用和定制一个轻量级的基于POSIX的信令/消息传递框架nanomsg
-- a younger sister of ZeroMQ
from Martin SUSTRIK, co-father of ZeroMQ - 其中 Context()
无设计加上附加功能 SURVEY
和 BUS
消息原型对于使用您自己软件设计的问题域的群体具有特别的吸引力特定的消息/信令协议:
file_descriptor
s 嗯,你需要勇气。可行,但袖手旁观,需要亲自动手操作内核,调整系统设置,你需要通过增加开销来支付这样的规模。
要考虑的其他因素是,虽然某些软件可能会使用
sysconf(OPEN_MAX)
来动态确定某个进程可能打开的文件数,但很多软件仍然使用C
图书馆的默认FD_SETSIZE
,通常是1024个描述符,因此永远不会超过无论是否有任何管理上定义的上限,许多文件都会打开。
虽然仍然在技术上&#34;可行,还有进一步的限制 - 即使nanomsg
也无法推动超过 1.000.000 [MSGs/s]
,这对于大多数应用程序来说已经相当不错了,因为它无法跟上消息调度的本机速度。引用声明了一些 ~6 [us]
的CPU核心到CPU核心传输延迟,如果用户设计的swarm处理应用程序无法在某些 3-4 [us]
下进行发送循环性能上限并非接近导致问题。
分布式多主机处理是攻击群体静态规模的第一个维度。接下来需要引入RDMA注入,以避免在分布式消息传递/信令的实现中的任何堆栈处理的性能瓶颈。是的,这可以将您的Swarm系统转移到纳秒级延迟区域,但代价是构建HPC /高科技计算基础设施(如果您的项目发起人可以调整,这将是一个很棒的项目为这样的事业提供资金 - 请帮助我知道,如果是,就会非常热衷于加入这样的群体智能HPC实验室),但值得在决定建筑之前了解这一含义,了解最终限制是从一开始就做好的关键。