我现在已经使用ZMQ很长一段时间了。我在NodeJS中创建了一个分布式系统,其中进程使用ZMQ作为连接器以流方式发送数据(与ZMQ的NodeJS绑定)。我试图在一台机器上对系统进行压力测试,并在管道中连接10个或更多个进程(1-> 2-> ...-> 10)。这些过程只是回应收到的消息;机器很大(24个内核运行ubuntu的超线程),因此我希望它能够承载至少数量的进程。
如果我只创建流程而不连接它们,那么它们的系统就会响应。在我连接所有这些进程的那一刻,它变得非常慢(就响应延迟而言),而吞吐量保持不变。这意味着数据通过进程尽可能快地流动,但系统本身变得非常慢并且没有响应(我有一个命令行界面,我可以从中创建更多进程并在运行时连接它们,但是我添加的时间超过了8-10它回答命令逐渐变慢)。我认为这个问题与许多ZMQ连接的资源消耗有关(对于我收到的每个进程和使用ZMQ通道发送数据)。可能是这样吗?
感谢。
编辑:这是我用来连接进程的代码的快照。
var zmq = require('zmq');
[...]
var sender = zmq.socket('push');
var receiver = zmq.socket('pull');
[...]
receiver.bindSync("tcp://*:" + port); //port is a variable received when the process starts up, each process has its own port
//.. some callbacks of the receiver to handle data received
//at some point I connect the sender to the host/port received from a RPC message, then I store the sender in an array (each outgoing connection has its own sender of course)
try {
sender.connect("tcp://" + msg.host + ":" + msg.port, function(err) {
if (err) throw err;
});
}
//when the stream goes by, I use the following to send the message (c is a variable that stores, among all, the socket)
c.sender.send(JSON.stringify(msg))
这就是我正在做的事。
编辑2:
让我添加一些最近收集的CPU使用率数据,看看发生了什么。正如我所说,这些进程只是做一个简单的回声,因此在通过htop
检查CPU使用情况时,我看不到CPU使用率的高峰,即使对于长流水线也是如此。有趣的部分来自于使用长管道,我尝试(通过RPC)添加新进程。有一个CPU以100%的使用率跳转并保持静止,直到创建该过程。我使用不同的命令将进程绑定到管道(即绑定和解除绑定过程)。当调用绑定和取消绑定时,我看到另一个CPU上升到100%,直到它完成绑定(这可能需要一些时间,因为管道增长)。我认为这是因为在添加新进程时,运行RPC服务器的CPU需要做的工作,而在绑定时,执行必须与新进程绑定的echo消息的进程必须处理随着消息,因此其使用增加。这使我认为JavaScript调度程序在 RPC调用之前调度从ZMQ边缘传入和传出的所有消息,并且由于此数量的消息随着管道的增加而增加,因此导致性能降低RPC(以及一般的控制结构)。
EDIT3:这绝对是ZMQ的问题。我试图运行15-ish进程,绑定它们,但不运行任何数据流。随着我添加更多(在绑定之后),即使没有涉及数据流,RPC调用也越来越慢。 ZMQ脚手架太重了?
答案 0 :(得分:1)
<强>建筑强>
如上所述,您的主题位于单主机 / 单操作系统环境中。
您的处理设计旨在让小数十的ZMQ元素在相关流程中传达一组未指定的服务。
<强>解决方案强>
从哪里开始
正如您上面的更新声明&#34; 我没有设置任何内容...... &#34; 如果没有误解,似乎存在巨大的误解空间
因此,最好的下一步可能是恕我直言 获得更多的全球视野, 对于尝试使用ZeroMQ进行编码的前几件事情,这可能听起来很复杂,但如果你至少跳到Code Connected, Volume 1 ( ... download-able .asPdf() )的第265页,如果不是读取步骤的情况在那里
最快的学习曲线将首先在图60 重新发布更新和< strong>图62 HA克隆服务器对以获得可用的高可用性方法,然后返回根,元素和详细信息。