Skip to content

Reduce overhead in command propagation#15003

Merged
tezc merged 11 commits intoredis:unstablefrom
tezc:repl-prop-faster
Apr 15, 2026
Merged

Reduce overhead in command propagation#15003
tezc merged 11 commits intoredis:unstablefrom
tezc:repl-prop-faster

Conversation

@tezc
Copy link
Copy Markdown
Collaborator

@tezc tezc commented Apr 6, 2026

Refactor command propagation code to reduce overhead on master

Currently, the main bottleneck is feedReplicationBuffer(). It is called for each argument in the command and has bookkeeping overhead on every call (e.g. checking whether to attach replicas to the replication backlog). It is also not inlined by the compiler. These costs become more visible with pipelining and commands with many arguments (e.g. HSET with many fields).

Changes:

  • Defer all bookkeeping to be done once per command instead of once per command argument.
  • Refactor the hot path so the compiler can inline replBufWriterAppend().
  • Add replBufWritterAppendBulkLen() that uses shared RESP headers for small values, avoiding formatting overhead.

These changes should not introduce any behavioral change.

TODO: In a follow-up PR, explore forwarding the exact command from the client querybuf to avoid re-serialization. Many commands are propagated without modification and can benefit from this.

--

Benchmark Before (ops/s) After (ops/s) Improvement
SET 256,048 265,131 +3%
SET (pipeline) 1,477,310 1,671,272 +13%
HSET 10 fields 145,000 158,000 +9%
HSET 10 fields (pipeline) 363,483 430,855 +18%
HSET 10 fields, 15B values (pipeline) 387,443 487,135 +26%
ZADD 5 members 180,700 193,519 +7%
ZADD 5 members (pipeline) 466,453 564,872 +21%

Co-authored-by: Yuan Wang yuan.wang@redis.com

@tezc tezc marked this pull request as ready for review April 6, 2026 07:21
Comment thread src/replication.c Outdated
Comment thread src/replication.c
@tezc
Copy link
Copy Markdown
Collaborator Author

tezc commented Apr 8, 2026

Test Case Baseline redis/redis unstable (median obs. +- std.dev) Comparison tezc/redis f541025 (median obs. +- std.dev) % change (higher-better) Note
memtier_benchmark-1key-load-hash-1K-fields-with-5B-values 5115 6192 21.1% IMPROVEMENT
memtier_benchmark-10Kkeys-load-list-rpush-bulkload-pipeline-50 99517 +- 0.0% (2 datapoints) 118988 19.6% IMPROVEMENT
memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values-pipeline-10 494431 +- 0.2% (2 datapoints) 577477 16.8% IMPROVEMENT
memtier_benchmark-stream-10M-entries-xreadgroup-count-100 7828 9095 16.2% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values 45907 52075 13.4% IMPROVEMENT
memtier_benchmark-stream-concurrent-xadd-xreadgroup-70-30 102797 116363 13.2% IMPROVEMENT
memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values-pipeline-10 375260 +- 0.6% (2 datapoints) 423213 12.8% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-100B-values 55745 +- 0.3% (2 datapoints) 62352 +- 0.2% (2 datapoints) 11.9% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100-nokeyprefix 1725389 1919690 11.3% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-500 1694296 1874943 10.7% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-20-fields-with-1B-values-pipeline-30 46878 +- 0.1% (2 datapoints) 51574 +- 1.4% (2 datapoints) 10.0% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100 1588013 1741303 9.7% IMPROVEMENT
memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values-pipeline-10 286285 313716 9.6% IMPROVEMENT
memtier_benchmark-1Mkeys-load-stream-1-fields-with-100B-values-pipeline-10 504875 553124 9.6% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-50 1471440 1609986 9.4% IMPROVEMENT
memtier_benchmark-stream-concurrent-xadd-xreadgroup-70-30-1k-consumers-claim 93720 101995 8.8% IMPROVEMENT
memtier_benchmark-1Mkeys-generic-scan-type-pipeline-10 727840 790523 8.6% IMPROVEMENT
memtier_benchmark-1Mkeys-string-setrange-100B-pipeline-10 933723 1008576 8.0% IMPROVEMENT
memtier_benchmark-nokeys-pubsub-publish-1K-channels-10B-no-subscribers 1330352 1430084 7.5% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-mset-10-keys-with-100B-values 128662 138133 7.4% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-mset-10-keys-with-10B-values 132748 142487 7.3% IMPROVEMENT
memtier_benchmark-1Mkeys-string-setex-100B-pipeline-10 767951 821765 7.0% IMPROVEMENT
memtier_benchmark-1Mkeys-string-incrby-pipeline-10 1100411 1176282 6.9% IMPROVEMENT
memtier_benchmark-1Kkeys-hash-listpack-500-fields-update-20-fields-with-1B-to-64B-values 74319 +- 0.6% (2 datapoints) 79407 6.8% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-10 964363 1027089 6.5% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-short-expiration 20333 +- 0.0% (2 datapoints) 21630 +- 0.6% (2 datapoints) 6.4% IMPROVEMENT
memtier_benchmark-1Mkeys-string-set-with-ex-100B-pipeline-10 767663 816392 6.3% IMPROVEMENT
memtier_benchmark-1Mkeys-string-append-1-100B-pipeline-10 966112 1027139 6.3% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-short-expiration 121723 +- 0.0% (2 datapoints) 129011 +- 0.2% (2 datapoints) 6.0% IMPROVEMENT
memtier_benchmark-stream-concurrent-xadd-xreadgroup-100-1-1k-consumers-claim-count100 147712 156391 5.9% IMPROVEMENT
memtier_benchmark-1Mkeys-load-list-with-10B-values-pipeline-10 930133 985198 5.9% IMPROVEMENT
memtier_benchmark-1Mkeys-load-hash-50-fields-with-10B-values-long-expiration-pipeline-10 23739 25141 5.9% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-expiration 133831 +- 0.5% (2 datapoints) 141785 +- 1.3% (2 datapoints) 5.9% IMPROVEMENT
memtier_benchmark-1Mkeys-string-incr-pipeline-10 1179925 1248548 5.8% IMPROVEMENT
memtier_benchmark-stream-concurrent-xadd-xreadgroup-100-1-1k-consumers-count100 153279 162061 5.7% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-100B-values-pipeline-10 952361 1007115 5.7% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-long-expiration 20988 +- 0.6% (2 datapoints) 22108 +- 0.0% (2 datapoints) 5.3% IMPROVEMENT
memtier_benchmark-10Kkeys-load-list-with-10B-values-pipeline-50 1053115 +- 0.1% (2 datapoints) 1107446 5.2% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-expiration 20937 +- 0.0% (2 datapoints) 22021 +- 0.6% (2 datapoints) 5.2% IMPROVEMENT
memtier_benchmark-2keys-lua-evalsha-hset-expire 128490 134607 4.8% IMPROVEMENT
memtier_benchmark-1Mkeys-string-incrbyfloat-pipeline-10 612220 640979 4.7% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-50-fields-with-1000B-values 16132 +- 2.0% (2 datapoints) 16887 +- 0.9% (2 datapoints) 4.7% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hexpireat-5-fields-10B-values 152985 +- 0.6% (2 datapoints) 160161 +- 0.7% (2 datapoints) 4.7% IMPROVEMENT
memtier_benchmark-1Mkeys-string-incrby 213780 223444 4.5% IMPROVEMENT
memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values 156019 +- 0.4% (2 datapoints) 163047 4.5% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hpexpire-5-fields-10B-values 153962 +- 0.3% (2 datapoints) 160804 +- 0.8% (2 datapoints) 4.4% IMPROVEMENT
memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits-pipeline-10 61512 64181 4.3% IMPROVEMENT
memtier_benchmark-1Mkeys-hash-transactions-multi-exec-pipeline-20 1488720 1552096 4.3% IMPROVEMENT
memtier_benchmark-3Mkeys-load-string-with-512B-values-pipeline-10 726183 756702 4.2% IMPROVEMENT
memtier_benchmark-1Mkeys-load-string-with-1KiB-values-pipeline-10 588843 613179 4.1% IMPROVEMENT
memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values 128074 133138 4.0% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-long-expiration 135021 +- 1.1% (2 datapoints) 140378 +- 0.6% (2 datapoints) 4.0% IMPROVEMENT
memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-short-expiration 165317 +- 0.5% (2 datapoints) 171866 +- 0.4% (2 datapoints) 4.0% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hexpireat-50-fields-10B-values 31157 +- 0.0% (2 datapoints) 32366 +- 0.1% (2 datapoints) 3.9% IMPROVEMENT
memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-expire-pipeline-10 856442 889194 3.8% IMPROVEMENT
memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values 143908 +- 0.4% (2 datapoints) 149362 3.8% IMPROVEMENT
memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits 51521 53414 3.7% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hpexpire-50-fields-10B-values 30415 +- 0.0% (2 datapoints) 31551 +- 0.1% (2 datapoints) 3.7% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hexpire-5-fields-10B-values 153719 +- 0.4% (2 datapoints) 159407 +- 0.1% (2 datapoints) 3.7% IMPROVEMENT
memtier_benchmark-connection-hello 204160 211424 3.6% IMPROVEMENT
memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-pipeline-10 976426 1011991 3.6% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hpexpireat-50-fields-10B-values 31451 +- 0.1% (2 datapoints) 32569 +- 0.1% (2 datapoints) 3.6% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hgetex-50-fields-10B-values 21412 +- 0.7% (2 datapoints) 22188 +- 0.1% (2 datapoints) 3.6% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hexpire-50-fields-10B-values 30424 +- 0.1% (2 datapoints) 31498 +- 0.1% (2 datapoints) 3.5% IMPROVEMENT
memtier_benchmark-2keys-lua-eval-hset-expire 114908 118813 3.4% IMPROVEMENT
memtier_benchmark-1Mkeys-hash-hget-hgetall-hkeys-hvals-with-100B-values 219567 226991 3.4% IMPROVEMENT
memtier_benchmark-stream-concurrent-xadd-xreadgroup-70-30-1k-consumers 150389 155318 3.3% IMPROVEMENT
memtier_benchmark-100Kkeys-hash-hpexpireat-5-fields-10B-values 157828 +- 0.8% (2 datapoints) 163114 +- 0.4% (2 datapoints) 3.3% IMPROVEMENT
memtier_benchmark-1Mkeys-load-zset-listpack-with-100-elements-double-score 6105 +- 0.0% (2 datapoints) 6304 3.2% IMPROVEMENT
memtier_benchmark-1Mkeys-generic-scan-cursor-count-500-pipeline-10 10849 11200 3.2% IMPROVEMENT

Copy link
Copy Markdown
Member

@ShooterIT ShooterIT left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this idea looks good to me, some small comments

Comment thread src/replication.c
Comment thread src/replication.c Outdated
Comment thread src/replication.c Outdated
Comment thread src/replication.c Outdated
Comment thread src/replication.c
Comment thread src/replication.c
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Reviewed by Cursor Bugbot for commit 4eeadae. Configure here.

Comment thread src/replication.c Outdated
@tezc tezc requested a review from oranagra April 13, 2026 15:02
Comment thread src/replication.c
Comment thread src/replication.c
@tezc tezc merged commit b89bc04 into redis:unstable Apr 15, 2026
18 checks passed
@tezc tezc deleted the repl-prop-faster branch April 15, 2026 14:51
@tezc tezc added the release-notes indication that this issue needs to be mentioned in the release notes label Apr 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release-notes indication that this issue needs to be mentioned in the release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants