Я написал простой скрипт, чтобы попытаться выяснить, как 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 в важном проекте и хотел бы взглянуть на его производительность.
- Я что-то не так делаю в своем коде?тест?
- Ожидается ли такой уровень производительности?
- Может ли быть какое-либо ограничение на количество соединений в клиенте?
- Если да, могу ли я увеличить число?
Обновление <<<< </h1> Просто чтобы прояснить ситуацию, поскольку отсутствует некоторая информация.Я выполнил параллельное задание для приведенного выше сценария, и когда я запускаю два клиентских процесса, пропускная способность падает вдвое, скажем, один отдельный клиентский процесс получает 2000, если я запускаю секунду, я получаю 1000 для каждого.Я не эксперт по производительности, я просто решаю протестировать сам, так как считаю фреймворк хорошим потенциалом для проекта, над которым я работаю.