Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Бенчмарки

Во что ruststream-fred обходится на каждом сообщении: пропускная способность против сырого клиента fred, инструкции и выделения памяти его кода.

Против сырого клиента​

Первый график прогоняет каждый сценарий тремя способами на настоящем сервере Redis. «Сырой клиент» - цикл, написанный вручную на fred. «Крейт брокера» - тот же цикл на этом крейте: брокер, подписка, поток доставок и ack, без рантайма. «RustStream» - сервис, который пишет пользователь: обработчик #[subscriber] в приложении. Первая разность показывает, сколько этот крейт стоит поверх клиента, которого он оборачивает, а вторая - сколько сверху добавляет рантайм.

Каждый цикл изображён полосой от лучшего круга до самого медленного: точка отмечает лучший круг, засечка - медиану. Ноль оси - лучший круг сырого клиента, и точка правее нуля значит, что цикл медленнее. Пустая точка отмечает цикл, у которого разница с сырым клиентом меньше разброса кругов. Таблица под графиком печатает лучший круг, а в скобках медиану.

Измеряются три формы, по одной на транспорт: чтение потока через группу потребителей с подтверждением каждой записи, надёжный список и канал Pub/Sub. Каждая форма снимается на одиночном сервере, на кластере и на ведущем сервере за Sentinel. На кластере строка Pub/Sub шардированная, SSUBSCRIBE и SPUBLISH: в этой форме Pub/Sub используют в кластере.

Стоимость кода​

Второй график считает, во что обходится одно сообщение в потоке выполнения сервиса: инструкции под callgrind и выделения памяти под DHAT, в установившемся режиме. Каждый сценарий - сервис на RedisBroker против одиночного сервера стенда. Сервис работает на однопоточном рантайме, и fred обслуживает свои соединения в том же потоке выполнения, поэтому в счёт входят рантайм, этот крейт и fred, который пишет команды и разбирает ответы. Сервер - отдельный процесс, и в счёт он не входит. «Холодный старт» - разовая стоимость подключения пула, создания группы, подписки и получения первой доставки.

Сценарий потока читает группу потребителей командой XREADGROUP, завершает доставку командой XACK и отвечает командой XADD. Надёжный список захватывает каждую запись командой BLMOVE и завершает её командой LREM. Сценарий Pub/Sub читает канал или шаблон и ничего не завершает. Сценарий .pipeline() отправляет завершения одного чтения вместе, а его обработчик ставит в очередь по одной команде INCR на доставку. .pipeline().atomic() заключает сегмент каждой доставки в MULTI и EXEC, как показывает страница Окно.

Результаты​

Против сырого клиентаНасколько каждый цикл отстаёт от лучшего круга сырого клиента
  • Сырой клиент
  • Крейт брокера
  • RustStream
  • круги, от лучшего до самого медленного
  • лучший круг
  • медианный круг
  • разброс кругов
  • неразличимо

ruststream-fred 0.7.0 on ruststream 0.7.0-rc.11, AMD Ryzen 9 7900X 12-Core Processor, Linux 7.2.7-x64v3-xanmod1-1, redis:7-alpine in Docker on the host network, persistence off: a standalone server, a six-node cluster and a master behind Sentinel, измерено 2026-09-27. Как сняты числа

Redis Streams consumer group, standalone, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Redis Streams consumer group, cluster, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Redis Streams consumer group, sentinel, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Redis list work queue (reliable), standalone, 512 B JSON, ack each
  • +2%
  • +3.3% (упирается в брокер)
Redis list work queue (reliable), cluster, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Redis list work queue (reliable), sentinel, 512 B JSON, ack each
  • неразличимо
  • неразличимо (упирается в брокер)
Redis Pub/Sub, standalone, 512 B JSON, no acknowledgement
  • неразличимо
  • неразличимо
Redis Pub/Sub (sharded), cluster, 512 B JSON, no acknowledgement
  • неразличимо
  • неразличимо
Redis Pub/Sub, sentinel, 512 B JSON, no acknowledgement
  • неразличимо
  • неразличимо
Показать числа таблицей
СценарийСырой клиентКрейт брокераRustStreamОверхед
Redis Streams consumer group, standalone, 512 B JSON, ack each51 326 msg/s (51 293)51 036 msg/s (50 247) (неразличимо к клиенту)50 739 msg/s (49 943)неразличимо (упирается в брокер)
Redis Streams consumer group, cluster, 512 B JSON, ack each39 596 msg/s (34 982)38 674 msg/s (34 977) (неразличимо к клиенту)38 363 msg/s (34 554)неразличимо (упирается в брокер)
Redis Streams consumer group, sentinel, 512 B JSON, ack each40 743 msg/s (40 444)40 202 msg/s (40 034) (неразличимо к клиенту)40 213 msg/s (38 946)неразличимо (упирается в брокер)
Redis list work queue (reliable), standalone, 512 B JSON, ack each29 548 msg/s (29 342)28 970 msg/s (28 639) (+2% к клиенту)28 575 msg/s (28 514)+3.3% (упирается в брокер)
Redis list work queue (reliable), cluster, 512 B JSON, ack each22 656 msg/s (22 216)22 449 msg/s (22 290) (неразличимо к клиенту)22 128 msg/s (22 002)неразличимо (упирается в брокер)
Redis list work queue (reliable), sentinel, 512 B JSON, ack each23 372 msg/s (21 630)22 720 msg/s (22 374) (неразличимо к клиенту)22 562 msg/s (21 649)неразличимо (упирается в брокер)
Redis Pub/Sub, standalone, 512 B JSON, no acknowledgement402 530 msg/s (397 136)400 183 msg/s (400 038) (неразличимо к клиенту)397 976 msg/s (394 780)неразличимо
Redis Pub/Sub (sharded), cluster, 512 B JSON, no acknowledgement297 850 msg/s (295 380)295 819 msg/s (292 015) (неразличимо к клиенту)290 276 msg/s (289 083)неразличимо
Redis Pub/Sub, sentinel, 512 B JSON, no acknowledgement358 378 msg/s (353 940)355 630 msg/s (352 911) (неразличимо к клиенту)395 136 msg/s (351 006)неразличимо
Стоимость кода

AMD Ryzen 9 7900X 12-Core Processor, x86_64, 427-5912 MHz, 12 physical, 24 logical, 62.4 GiB, unknown, Linux 7.2.7-x64v3-xanmod1-1, 1.98.1, 3.25.1, bench, inheriting release (opt-level = 3, lto = false, codegen-units = 16), ruststream-fred default (none), ruststream macros,json (the service loop only). ruststream-fred 0.7.0, ruststream 0.7.0-rc.11, измерено 2026-09-27.

Инструкции
Выделения
stream consumer group, JSON decode into a small struct, XACK each
32 860,7
29,7
stream reply, appended with XADD through RedisPublish
53 459,4
44,7
stream consumer group in batches of 64, XACK each
33 166,8
29,8
reliable list, JSON decode into a small struct, LREM each
39 668
26
Pub/Sub channel, JSON decode into a small struct
8 768,7
6
Pub/Sub pattern, JSON decode into a small struct
9 135,9
6
stream with .pipeline(), one INCR queued per delivery
38 225,6
39,2
stream with .pipeline().atomic(), one INCR queued per delivery
78 086,7
71,8
reliable list with .pipeline(), one INCR queued per delivery
57 556,1
48,9
reliable list with .pipeline().atomic(), one INCR queued per delivery
82 776,9
68,6
Pub/Sub channel with .pipeline(), one INCR queued per delivery
31 151,8
27,1
Pub/Sub channel with .pipeline().atomic(), one INCR queued per delivery
56 240,5
47,3
Pub/Sub pattern with .pipeline(), one INCR queued per delivery
31 525,9
27,1
Pub/Sub pattern with .pipeline().atomic(), one INCR queued per delivery
56 420,4
47,3
Показать числа таблицей
СценарийИнструкцииВыделенияХолодный старт
stream consumer group, JSON decode into a small struct, XACK each32 860,729,7777 211 / 467
stream reply, appended with XADD through RedisPublish53 459,444,7814 951 / 483
stream consumer group in batches of 64, XACK each33 166,829,8798 525 / 470
reliable list, JSON decode into a small struct, LREM each39 66826727 658 / 415
Pub/Sub channel, JSON decode into a small struct8 768,76916 144 / 402
Pub/Sub pattern, JSON decode into a small struct9 135,96915 955 / 397
stream with .pipeline(), one INCR queued per delivery38 225,639,2820 308 / 515
stream with .pipeline().atomic(), one INCR queued per delivery78 086,771,8839 410 / 523
reliable list with .pipeline(), one INCR queued per delivery57 556,148,92 630 559 / 1 941
reliable list with .pipeline().atomic(), one INCR queued per delivery82 776,968,62 648 107 / 1 949
Pub/Sub channel with .pipeline(), one INCR queued per delivery31 151,827,1946 874 / 433
Pub/Sub channel with .pipeline().atomic(), one INCR queued per delivery56 240,547,3963 733 / 447
Pub/Sub pattern with .pipeline(), one INCR queued per delivery31 525,927,1945 783 / 428
Pub/Sub pattern with .pipeline().atomic(), one INCR queued per delivery56 420,447,3962 695 / 442

Машина​

ПроцессорAMD Ryzen 9 7900X 12-Core Processor
Архитектураx86_64
Частота427-5912 MHz
Ядра12 physical, 24 logical
Память62.4 GiB
Скорость памятиunknown
Операционная системаLinux 7.2.7-x64v3-xanmod1-1
Брокерredis:7-alpine in Docker on the host network, persistence off: a standalone server, a six-node cluster and a master behind Sentinel
Круговая задержкаstandalone 22 µs, cluster 25 µs, sentinel 24 µs (one EXISTS and its answer)
Компилятор1.98.1
Профиль сборкиbench, inheriting release (opt-level = 3, lto = false, codegen-units = 16)
Фичиruststream-fred default (none), ruststream macros,json (the service loop only)
RUSTFLAGSnone (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU)
Valgrind3.25.1

Числа берутся из файла docs/benchmarks/results.json этой версии, который записывают рецепты бенчмарков, а профиль сборки, с которым они сняты, указан выше. Как они сняты, объясняет страница Методология, а какие выводы они позволяют сделать, - страница Числа.