Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Бенчмарки
Во что 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. Как сняты числа
- неразличимо
- неразличимо (упирается в брокер)
- неразличимо
- неразличимо (упирается в брокер)
- неразличимо
- неразличимо (упирается в брокер)
- +2%
- +3.3% (упирается в брокер)
- неразличимо
- неразличимо (упирается в брокер)
- неразличимо
- неразличимо (упирается в брокер)
- неразличимо
- неразличимо
- неразличимо
- неразличимо
- неразличимо
- неразличимо
Показать числа таблицей
| Сценарий | Сырой клиент | Крейт брокера | RustStream | Оверхед |
|---|---|---|---|---|
| Redis Streams consumer group, standalone, 512 B JSON, ack each | 51 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 each | 39 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 each | 40 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 each | 29 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 each | 22 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 each | 23 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 acknowledgement | 402 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 acknowledgement | 297 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 acknowledgement | 358 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 | 777 211 / 467 |
| stream reply, appended with XADD through RedisPublish | 53 459,4 | 44,7 | 814 951 / 483 |
| stream consumer group in batches of 64, XACK each | 33 166,8 | 29,8 | 798 525 / 470 |
| reliable list, JSON decode into a small struct, LREM each | 39 668 | 26 | 727 658 / 415 |
| Pub/Sub channel, JSON decode into a small struct | 8 768,7 | 6 | 916 144 / 402 |
| Pub/Sub pattern, JSON decode into a small struct | 9 135,9 | 6 | 915 955 / 397 |
| stream with .pipeline(), one INCR queued per delivery | 38 225,6 | 39,2 | 820 308 / 515 |
| stream with .pipeline().atomic(), one INCR queued per delivery | 78 086,7 | 71,8 | 839 410 / 523 |
| reliable list with .pipeline(), one INCR queued per delivery | 57 556,1 | 48,9 | 2 630 559 / 1 941 |
| reliable list with .pipeline().atomic(), one INCR queued per delivery | 82 776,9 | 68,6 | 2 648 107 / 1 949 |
| Pub/Sub channel with .pipeline(), one INCR queued per delivery | 31 151,8 | 27,1 | 946 874 / 433 |
| Pub/Sub channel with .pipeline().atomic(), one INCR queued per delivery | 56 240,5 | 47,3 | 963 733 / 447 |
| Pub/Sub pattern with .pipeline(), one INCR queued per delivery | 31 525,9 | 27,1 | 945 783 / 428 |
| Pub/Sub pattern with .pipeline().atomic(), one INCR queued per delivery | 56 420,4 | 47,3 | 962 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) |
| RUSTFLAGS | none (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU) |
| Valgrind | 3.25.1 |
Числа берутся из файла docs/benchmarks/results.json этой версии, который записывают рецепты
бенчмарков, а профиль сборки, с которым они сняты, указан выше. Как они сняты, объясняет страница
Методология, а какие выводы они позволяют сделать, - страница
Числа.