0

我写了一个简单的脚本来试图弄清楚 ZeroRPC 在消息吞吐量方面的表现如何,服务器是一个简单的服务,回应一个问候。客户端的代码如下,看到我正在尝试启动并行任务:

import zerorpc
import datetime
import time
import gevent
import threading

N_MSGS      = 1000
N_TASKS     =   10
N_TASK_STEP =    1

count = dict()

client = zerorpc.Client()
client.connect('tcp://192.168.144.142:80081')

def task(number):
    results = []
    for i in range(N_MSGS):
        results.append(client.hello('Mathias', async=True))
        gevent.sleep(0)

    count[number] = 0
    for r in results:
        if r.get() == 'Hello Mathias':
            count[number] += 1


format_header = '{:<6s} {:<8s} {:<20s} {:<20s} {:<20s}'
format_line   = '{:>6d} {:>8d} {:>20s} {:>20d} {:>9.2f}'
print(format_header.format("#RUN", "#TASKS", "TOTAL TIME", "#MSGS", "MSG/SEC"))

run = 1
for i in range(1, N_TASKS, N_TASK_STEP):
    tasks=list()
    for j in range(i):
        tasks.append(gevent.spawn(task, j))

    start = datetime.datetime.now()
    gevent.joinall(tasks)
    end = datetime.datetime.now()

    total_time = end - start

    count_total = 0
    for _,v in count.items():
        count_total += v

    msg_per_sec = count_total / total_time.total_seconds()


    print(format_line.format(run, i, str(total_time),
                             count_total, msg_per_sec))
    run += 1

服务器很简单:

import zerorpc

class Hello:
    def hello(self, name):
        return 'Hello {}'.format(name)

server = zerorpc.Server(Hello())
server.bind('ipc:///tmp/local')
server.run()

请注意,我使用的是 IPC 套接字,我希望每当添加更多任务时,吞吐量都会增加,直到达到某个上限。但实际上数字几乎总是相同的。即使我更改为真实的网络设置,数字也没有太大差异。按照我在上面的代码设置中得到的数字:

N_RUN   N_TASKS   TOTAL_TIME           N_MSGS               MSG/SEC              // vvvvvvv???????????
    1         1   0:00:01.543374         2000               1295.86              // 1295.8621824651705
    2         2   0:00:02.454205         4000               1629.85              // 1629.8556966512579
    3         3   0:00:03.583786         6000               1674.20              // 1674.2071094646835
    4         4   0:00:04.903248         8000               1631.57              // 1631.5715623602969
    5         5   0:00:06.133924        10000               1630.27              // 1630.2777797703395
    6         6   0:00:07.299903        12000               1643.85              // 1643.8574594758315
    7         7   0:00:10.096884        14000               1386.56              // 1386.5663901853286
    8         8   0:00:10.437927        16000               1532.87              // 1532.8714216912995
    9         9   0:00:11.384918        18000               1581.03              // 1581.0390553537582
   10        10   0:00:12.628328        20000               1583.74              // 1583.740935458756 
   11        11   0:00:13.691057        22000               1606.88              // 1606.888350548829 
   12        12   0:00:15.430392        24000               1555.37              // 1555.372021657    
   13        13   0:00:16.775109        26000               1549.91              // 1549.9154133663155
   14        14   0:00:18.021384        28000               1553.70              // 1553.7097483744865

我还对 IPC 进行了一些测量,并且与 TCP 相比,我预计性能会有更大的差异。

我绘制了一个图表,见下图:

吞吐量 - TCP 与 IPC

我的印象是某些东西限制了性能的进一步提高。

也许我在我的代码中遗漏了一些东西,我正在考虑在一个重要的项目中使用 ZeroRPC,并希望了解它的性能。

  • 我在基准测试中做错了吗?
  • 这种性能水平是预期的吗?
  • 客户端中的连接数是否有任何限制?
  • 如果是,我可以增加数量吗?

更新<<<<

只是要清楚,因为缺少一些信息。对于上面的脚本,我确实运行了并行任务,当我启动两个客户端进程时,吞吐量下降了一半,假设一个客户端进程获得 2000,如果我启动第二个,每个客户端进程获得 1000。我不是性能专家,我只是决定自己进行测试,因为我认为该框架对于我正在从事的项目来说是一个很好的潜力。

4

1 回答 1

0

先说几个事实
——ZeroMQ不是这里的限制,原因如下:

  • 您发布的消息率在测试~ 1k7 [MSG/s]中大约是4 -orders-of-manitude

  • 偶数大小的~ [MB]BLOB 会比上面示例的"Hello"-messages飞得更快

  • 对于~ 16 [B]有效载荷,可以调整上面的“上限~ 6,200,000 [MSG/s]

  • 甚至没有尝试绘制 以性能为动力的设置,执行得越少

  • 测试的概念存在一个主要错误——“公正”——[CONCURRENT]进程调度(如果为上面评估的 RTT 持续时间测试制作了一个菊花链事件处理程序,则更多)远不接近真正[PARALLEL]流程编排的领域,这是所提出概念中的一个基本错误(如上文@bombela所述)。

  • 共存的性能调整,但不同的传输类实例由于许多原因需要更艰苦的工作来调整它们的性能上限,而不是完善单个传输类设置以获得最终性能

我在基准测试中做错了吗?

不,但在那里没有做任何事情来获得更好的性能。


这种性能水平是预期的吗?

不,有关详细信息,请参阅。上面引用的数据速率。


客户端中的连接数是否有任何限制?

不,但可能是。


如果是,我可以增加数量吗?

是的。

于 2018-05-09T17:20:22.603 回答