我写了一个简单的脚本来试图弄清楚 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。我不是性能专家,我只是决定自己进行测试,因为我认为该框架对于我正在从事的项目来说是一个很好的潜力。