我以以下方式使用在此处(https://github.com/zeromq/majordomo)找到的majordomo代码:

我没有使用单个代理来处理请求和答复,而是启动了两个代理,以使它们中的一个处理所有请求,而另一个处理所有答复。

我做了一些测试,看看majordomo经纪人可以处理多少个连接:

num of reqs per client     num of requests handled without pkt loss

          1                         614 (614 clients)
         10                        6000 (600 clients)
        100                       35500 (355 clients)
       1000                      300000 (300 clients)
       5000                      750000
      10000                      600000
      15000                      450000
      20000                      420000
      25000                      375000
      30000                      360000


我无法正确理解结果。

当每个代理仅发送一个请求时,代理为什么只能处理614个客户端?

我在一台机器上运行了该测试,但是614似乎仍然很低。

有人可以告诉我出什么事了吗?



因此,我将HWM设置如下:

Broker’s HWM on send/receive is set to  40 k.
TCP send/receive buffer      is set to  10 MB.
Worker’s HWM on send/receive is set to 100 k.
Client’s HWM on send         is set to 100,
         and on receive      is set to 100 k.
All the clients run on the same machine.
All the workers (10 workers running the echo service),
and the two broker instances run on a single ec2 instance.

Client program simply sends all the requests in a blast (all at once).


我对发送时的HWM的理解是,达到HWM时,套接字将阻塞。这就是为什么我将客户端的发送HWM设置为100条消息,希望这可以给我某种流控制的原因。

现在,当我有10个客户端发送10,000个请求(一次完成)时,我看到数据包丢失。而且,当每个客户端发送10,000个请求,但一次只发送前1000个请求时,当128个客户端并行运行时,就会发生丢包。

当我将代理的HWM设置为40k时,为什么在爆炸大小小于40,000(如我上面使用的爆炸)时,它会丢弃数据包?我知道zmq指南说,管道的已分配容量将约为我们设置的容量的60%,但是10,000只是我将其设置为(40,000)的容量的25%。同样,1000仅为10%。所以我不明白是什么原因导致经纪人丢失数据包。 HWM应该是每个对等连接,不是吗?请帮助我了解这种行为。

最佳答案

为什么会发生?


TLDR


让我引用一个奇妙而宝贵的资料-Pieter HINTJENS的书


“已连接代码,第1卷”


(绝对值得花任何时间和时间来阅读PDF副本...关键信息在Pieter精心制作的300多个令人兴奋的页面中所写的文字和故事中)



高水印

当您可以从一个进程到另一个进程快速发送消息时,您很快就会发现内存是一种宝贵的资源,并且可以被微不足道地填满。除非您了解问题并采取预防措施,否则流程中某处的几秒钟延迟可能会导致积压,使服务器崩溃。

...

ØMQ使用HWM(高水位标记)的概念来定义其内部管道的容量。套接字外或套接字内的每个连接都有其自己的管道,并且HWM用于发送和/或接收,具体取决于套接字的类型。某些套接字(PUBPUSH)仅具有发送缓冲区。某些(SUBPULLREQREP)仅具有接收缓冲区。一些(DEALERROUTERPAIR)同时具有发送和接收缓冲区。

在ØMQv2.x中,默认情况下HWM是无限的。这很容易,但通常也对大量发布者致命。在ØMQv3.x中,默认情况下将其设置为1,000,这更明智。如果您仍在使用ØMQv2.x,则应始终在套接字上设置HWM,将其设置为1,000以匹配ØMQv3.x或其他考虑到邮件大小和预期订户性能的数字。

当套接字到达其HWM时,它将根据套接字类型阻止或丢弃数据。如果PUBROUTER套接字到达HWM,它们将丢弃数据,而其他套接字类型将阻塞。通过inproc传输,发送方和接收方共享相同的缓冲区,因此实际的HWM是双方设置的HWM的总和。

最后,HWM -s不精确;尽管默认情况下最多可以接收1,000条消息,但是由于libzmq实现其队列的方式,实际缓冲区的大小可能要低得多(只有一半)。





尝试调整RCVHWM / SNDHWM和其他低级IO线程/ API参数,以使测试设置保持可行的内存占用量,稳定的性能以及与IO-resources-incompressible-data一致的性能-“液压油”

关于zeromq - Majordomo经纪人:处理大量连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28120776/

10-12 17:10