【问题标题】:ZeroRPC performance. What is wrong with my Benchmark?ZeroRPC 性能。我的基准有什么问题?
【发布时间】:2018-05-11 20:56:07
【问题描述】:

我写了一个简单的脚本来试图弄清楚 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 相比性能会有更大的差异。

我画了一张图表,见下图:

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

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

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

更新

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

【问题讨论】:

  • 您说您希望生成并行任务。但是 gevent 任务只是并发的,从不并行。如果您想要并行性,请在多 CPU 机器上生成更多进程。
  • 您好,Bombela,谢谢。我会继续尝试更好地对其进行基准测试,并尝试不同的方法。

标签: python zeromq zerorpc


【解决方案1】:

先说几个事实 -
ZeroMQ 不是这里的限制有几个原因:

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

  • 即使是 ~ [MB] 大小的 BLOB 也会比上面示例的 "Hello"-messages 飞得更快

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

    李>
  • 以性能为动力的设置甚至没有尝试草拟,性能越差

  • 测试有一个概念上的主要错误 - “只是”-[CONCURRENT] 进程调度(如果只制作了事件处理程序的菊花链,则更多对于上面评估的 RTT 持续时间测试)远不接近 true-[PARALLEL] 流程编排的域,这是所提出概念中的一个基本错误(正如上面已经提到的@bombela)。

  • 调整共存的传输类实例的性能,但不同的传输类实例有很多原因需要更努力的工作来调整它们的性能上限,而不是完善单个传输类设置极致性能

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

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


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

不,详情请参阅。上面引用的数据速率。


客户端的连接数会不会有限制?

不,但可能是。


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

是的。

【讨论】:

  • 您好 user3666197,感谢您的回答,我会继续努力并努力做得更好。我看到重要这个词对你来说非常重要! :) 这是一个个人项目,但对我来说仍然很重要,因为我在我的设计中看到了很多潜力,并且认为我还有更糟糕的工作要做,很抱歉,但我没有钱聘请专门的专家来工作在这方面,我很难从社区中得到很好的反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多