ZeroRPC производительность. Что не так с моим тестом? - PullRequest
0 голосов
/ 08 мая 2018

Я написал простой скрипт, чтобы попытаться выяснить, как 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.

Я построил график, см. Ниже:

Throughput - TCP vs IPC

У меня сложилось впечатление, что что-то ограничивает производительность от дальнейшего увеличения.

Может быть, я что-то упустил в своем коде, я рассматриваю возможность использования ZeroRPC в важном проекте и хотел бы взглянуть на его производительность.

  • Я что-то не так делаю в своем коде?тест?
  • Ожидается ли такой уровень производительности?
  • Может ли быть какое-либо ограничение на количество соединений в клиенте?
  • Если да, могу ли я увеличить число?

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

1 Ответ

0 голосов
/ 09 мая 2018

Сначала несколько фактов -
ZeroMQ составляет , а не ограничение здесь по нескольким причинам:

  • ваша опубликованная частота сообщений под ~ 1k7 [MSG/s] составляет примерно 4 -заказ о тестируемом порядке

  • даже ~ [MB] размером BLOB будут лететь быстрее , чем показанные "Hello" сообщения выше

  • для ~ 16 [B] полезных нагрузок, можно настроить " потолок " выше ~ 6,200,000 [MSG/s]

  • установка по мотивам производительности даже не пыталась набросать, тем меньше выполнено

  • существует принципиальная ошибка в понятии теста - "просто" - [CONCURRENT] планирование процесса (тем более, если вы сделали просто последовательную цепочку обработчиков событий для тест длительности RTT, оцененный выше), безусловно, далеко не находится рядом с областью истинно-[PARALLEL] оркестрации процесса, это элементарная ошибка в представленной концепции (как отмечено выше @ bombela ) ,

  • настройка производительности для сосуществующих, но разных экземпляров транспортного класса по многим причинам требуется гораздо более тяжелая работа для настройки потолков производительности, чем для полировки единой настройки транспортного класса для окончательной производительность

Что-то не так в моем тесте?

Нет, но ничего для улучшения производительности не было сделано.


Ожидается ли такой уровень производительности?

Нет, подробности исх. приведенные выше данные.


Может ли быть какое-либо ограничение на количество соединений в клиенте?

Нет, но может быть.


Если да, могу ли я увеличить число?

Да. * * 1092

...