redis (StackExchange.Redis) производительность публикации низкая? - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать redis pub / sub для передачи данных между приложениями с высокой скоростью (25000 сообщений в секунду).

Я протестировал его, как показано ниже:

топология :

1 издатель, 1 подписчик и сервер redis.Все они размещены на одном компьютере.

аппаратное обеспечение ПК :

Процессор: Intel (R) Core (TM) I7-4578U Процессор @ 3,00 ГГц Память: 16,0 ГБ

код :

Stopwatch sw = new Stopwatch();
sw.Start();
while (_started)
{
    //db.PublishAsync(RawMessagesCapturedMsg.TopicGroupName, redisValue);
    db.Publish(RawMessagesCapturedMsg.TopicGroupName, redisValue);
    totalRedisMsg++;
    if (totalRedisMsg % 10000 == 0)
    {
        Console.WriteLine("totalRedisMsg: {0} @ {1}, time used(ms): {2}",
            totalRedisMsg, DateTime.Now, sw.ElapsedMilliseconds);
    }
}
sw.Stop();

Результаты: enter image description here

Как показано нарезультаты, это займет около 6 секунд, чтобы опубликовать 10k сообщений.

Я хочу подтвердить, что это фактическая производительность Redis (или StackExchange.Redis)?Или что-то не так с моим тестом?

Обновление:

В соответствии с принятым ответом я обнаружил, что причина в том, что размер моего сообщения слишком велик(300Кб).

1 Ответ

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

Что нужно проверить:

  1. Какая загрузка процессора?Это полно?Если нет, вы, вероятно, застряли на пропускной способности или задержке.
  2. Сколько стоит размер сообщения?Умножьте это на скорость передачи, которую вы видите, сравнима ли она с пропускной способностью, которую вы (ожидаете) иметь?
  3. Что такое эхо-запрос к экземпляру Redis?Возможно, поездки туда и обратно занимают много времени.В этом случае вы можете использовать множество потоков со многими соединениями для увеличения пропускной способности.

У меня был тест, который я использовал для ответа на другой вопрос.И в Java (клиентская библиотека салата) у меня есть эти результаты для 1 потока, локального процессора i5-6400, удаленного процессора E5-2603 v4, 0.180ms ping к удаленному, и сообщение "привет".

Benchmark              (address)   Mode  Cnt      Score      Error  Units
LettuceThreads.pooled     socket  thrpt    5  35699.267 ±  706.946  ops/s
LettuceThreads.pooled  localhost  thrpt    5  28130.801 ± 9476.584  ops/s
LettuceThreads.pooled     remote  thrpt    5   3080.115 ±  422.390  ops/s
LettuceThreads.shared     socket  thrpt    5  41717.332 ± 3559.226  ops/s
LettuceThreads.shared  localhost  thrpt    5  31092.925 ± 9894.748  ops/s
LettuceThreads.shared     remote  thrpt    5   3920.260 ±  178.637  ops/s

Сравните это с имеющимся у вас оборудованием, возможно, оно поможет вам оценить производительность вашей библиотеки.Обратите внимание, как производительность падает в 10 раз для удаленного, даже зная, что процессор медленнее в 2 раза, это очень много.

И следующее для 16 потоков.Итак, как вы видите, большее количество потоков может помочь по крайней мере получить пропускную способность, несмотря на задержку.

Benchmark              (address)   Mode  Cnt       Score       Error  Units
LettuceThreads.pooled     socket  thrpt    5  123846.426 ±  2926.807  ops/s
LettuceThreads.pooled  localhost  thrpt    5   83997.678 ± 31410.595  ops/s
LettuceThreads.pooled     remote  thrpt    5   31045.111 ±  2198.065  ops/s
LettuceThreads.shared     socket  thrpt    5  218331.662 ± 17459.352  ops/s
LettuceThreads.shared  localhost  thrpt    5  182296.689 ± 52163.154  ops/s
LettuceThreads.shared     remote  thrpt    5   30803.575 ±  2128.306  ops/s
...