Aller au contenu principal
Benchmarks

Zaris vs Redis, mesuré honnêtement

Débit entièrement mesuré sur Azure via le protocole Redis — clusters 4 cœurs et 8 cœurs jusqu'à trois nœuds, chaque chiffre vérifié par CPU serveur. Sur des nœuds 8 cœurs de taille production, Zaris dépasse Redis à chaque taille de cluster et creuse l'écart à mesure que vous ajoutez des cœurs. Nous montrons aussi le compromis honnête : Zaris utilise plus de mémoire. Chaque chiffre ici est reproductible depuis le dépôt de benchmark open source.

+87%
plus rapide que Redis — nœud unique 8 cœurs (5,56 M vs 2,97 M ops/sec)
13.7M
ops/sec — cluster 3 nœuds 8 cœurs via le protocole Redis
1.9×
gain de débit quand les cœurs doublent, 4→8 — alors qu'une instance Redis unique reste plate
Comment nous avons mesuré

Méthodologie — et transparence totale

  • Générateur de chargememtier_benchmark (Docker, réseau hôte) pour Redis et Zaris-RESP ; un générateur à client natif open source sur mesure (NativeBench) pour les chiffres natifs. Les deux pilotent des valeurs de 100 octets, lecture/écriture 1:1.
  • ServeursAzure F4als_v6 (4 cœurs) et F8als_v6 (8 cœurs) — AMD Zen4 de génération actuelle — dans un même VNet. Charge client depuis des VM F16als_v6 (16 cœurs).
  • Équitable envers RedisRedis est présenté sous son meilleur jour : --io-threads = nombre de cœurs avec --io-threads-do-reads, persistance désactivée, et un vrai Redis Cluster. La charge est épinglée au nœud propriétaire de chaque clé, de sorte que chaque moteur est mesuré de façon identique.
  • Règle d'arrêtNous augmentons la charge client jusqu'à ce que le débit serveur s'aplatisse et que le CPU du nœud sature — vérifié avec mpstat / docker stats, pas un nombre de clients fixe. Un chiffre ne compte que lorsque le serveur, et non le client, est la limite.

Nos règles d'honnêteté

  • Chaque chiffre de débit a été vérifié par CPU serveur à saturation — aucun pic trié sur le volet.
  • Nous montrons où Zaris est à la traîne, pas seulement où il gagne — y compris son usage mémoire plus élevé.
  • Redis bénéficie de sa meilleure configuration multi-cœurs, pas d'une version bridée.
  • Une seule charge de travail (100 o, 1:1) sur des SKU Azure spécifiques. La vôtre différera — exécutez-le vous-même.
Nœuds de taille production

Cluster 8 cœurs : Zaris dépasse Redis à chaque taille

Cluster en protocole Redis sur des nœuds 8 cœurs, le CPU de chaque nœud vérifié saturé simultanément. Zaris mène à un nœud (+87%), deux nœuds (+70%) et trois (+81%) — un remplacement direct, sans modification applicative.

Débit en protocole Redis vs taille du cluster (nœuds 8 cœurs)Zaris RESP : 1 nœud 5,56 M, 2 nœuds 9,12 M, 3 nœuds 13,69 M. Redis : 1 nœud 2,97 M, 2 nœuds 5,35 M, 3 nœuds 7,57 M. Zaris mène à chaque taille de cluster sur des nœuds 8 cœurs.Débit en protocole Redis vs taille du cluster (nœuds 8 cœurs)ops/secZaris (RESP)Redis0K2.00M4.00M6.00M8.00M10.00M12.00M14.00M5.56M2.97M1 nœud+87%9.12M5.35M2 nœuds+70%13.69M7.57M3 nœuds+81%

Les deux montent en charge de façon quasi linéaire entre les nœuds ; Zaris est simplement plus élevé par nœud parce qu'il utilise tous les cœurs, là où une instance Redis unique exécute les commandes sur un seul thread. La mémoire résidente de Zaris tournait autour de 0.7–1.4 GiB par nœud à ces charges — essentiellement de la mémoire de travail du GC que le runtime retient sous le barattage d'écritures, et non des données vivantes (le surcoût par enregistrement est ~2,5× Redis ; voir Mémoire ci-dessous).

Pourquoi l'écart se creuse

Zaris monte en charge avec les cœurs. Une instance Redis unique, non.

Redis exécute les commandes sur un seul thread par nœud, de sorte qu'ajouter des cœurs ne bouge presque pas son plafond. Le front-end RESP de Zaris est entièrement multi-thread. Doublez les cœurs (4→8) sur un seul nœud et Zaris double presque (2.89M → 5.56M, 1.9×) alors que Redis gagne peu (2.45M → 2.97M, 1.2×). C'est pourquoi l'avance passe de quelques pour cent sur des machines 4 cœurs à +87% sur 8 cœurs.

Débit mono-nœud à mesure que les cœurs doublent (4 cœurs → 8 cœurs)Zaris RESP : 2,89 M à 4 cœurs, 5,56 M à 8 cœurs (1,9×). Redis : 2,45 M à 4 cœurs, 2,97 M à 8 cœurs (1,2×). Zaris monte en charge avec les cœurs ; une instance Redis unique reste quasiment plate.Débit mono-nœud à mesure que les cœurs doublent (4 cœurs → 8 cœurs)ops/secZaris (RESP)Redis0K1.00M2.00M3.00M4.00M5.00M6.00M2.89M2.45Mnœud 4 cœurs5.56M2.97Mnœud 8 cœursZaris 1.9× · Redis 1.2×

Sur de petits nœuds 4 cœurs, les deux sont proches (Zaris 2,89 M vs Redis 2,45 M). Plus la machine est grande, plus l'avance de Zaris est large — donc sur le matériel de production que vous déploieriez réellement, Zaris gagne de façon décisive.

« Il suffit de lancer plus d'instances Redis »

Vous pouvez égaler les cœurs — mais pas sans perdre en disponibilité

La réfutation habituelle : lancez plusieurs instances Redis par machine pour utiliser tous les cœurs. Vous le pouvez — mais chaque instance possède une tranche de l'espace de clés, de sorte qu'une seule machine héberge désormais plusieurs shards. Quand cette machine tombe, vous ne perdez pas un shard, vous perdez tous d'un coup — un rayon d'impact bien plus large, et chacun nécessite son propre basculement. Zaris utilise tous les cœurs dans un seul nœud avec un seul domaine de défaillance et une réplication intégrée, de sorte que la perte d'un nœud revient à un propriétaire qui change de main, et non à une panne multi-shard corrélée.

Les petits nœuds aussi

Cluster 4 cœurs — mesuré, par souci d'exhaustivité

Même sur de petits nœuds 4 cœurs, Zaris devance Redis à chaque taille de cluster, et les deux montent en charge de façon quasi linéaire jusqu'à trois nœuds. La marge est modeste ici ; c'est sur les plus gros nœuds que Zaris prend le large.

Débit en protocole Redis vs taille du cluster (nœuds 4 cœurs)Zaris RESP : 1 nœud 2,89 M, 2 nœuds 4,81 M, 3 nœuds 7,19 M. Redis : 1 nœud 2,45 M, 2 nœuds 4,63 M, 3 nœuds 6,95 M. Zaris devance Redis à chaque taille de cluster sur des nœuds 4 cœurs.Débit en protocole Redis vs taille du cluster (nœuds 4 cœurs)ops/secZaris (RESP)Redis0K1.50M3.00M4.50M6.00M7.50M2.89M2.45M1 nœud4.81M4.63M2 nœuds7.19M6.95M3 nœuds
Avancé · opt-in

Encore plus rapide à l'échelle : le client natif

Les chiffres ci-dessus utilisent le protocole Redis en remplacement direct. Zaris possède aussi son propre client binaire natif qui parle directement au moteur. Sur des nœuds 8 cœurs, il devance même les chiffres RESP à l'échelle — 11,4 M à 2 nœuds, 18,5 M à 3 — et dépasse Redis jusqu'à 2,4×.†

Cluster 8 cœurs : Zaris natif vs RESP vs RedisÀ 8 cœurs — 1 nœud : Redis 2,97 M, Zaris RESP 5,56 M, Zaris natif 5,09 M. 2 nœuds : Redis 5,35 M, RESP 9,12 M, natif 11,44 M. 3 nœuds : Redis 7,57 M, RESP 13,69 M, natif 18,52 M. Zaris natif mène à deux et trois nœuds.Cluster 8 cœurs : Zaris natif vs RESP vs Redisops/secRedisZaris RESPZaris natif0K4.75M9.50M14.25M19.00M2.97M5.56M5.09M1 nœud5.35M9.12M11.44M2 nœuds7.57M13.69M18.52M3 nœuds

† Ces chiffres natifs utilisent un mode serveur à haut débit (opt-in, pour les stores à facteur de réplication 1) piloté par le client natif .NET. À un seul nœud, il est à peu près au niveau de RESP (~5,0 M vs 5,56 M) ; son avantage apparaît à mesure que vous montez en charge. Il nécessite la build du client natif présente dans le dépôt de benchmark, nous le présentons donc comme une option avancée plutôt que comme le choix par défaut. Les chiffres RESP en remplacement direct ci-dessus ne nécessitent rien de particulier.

Latence

Latence par opération : aucune pénalité de compatibilité

Une seule opération en vol (à vide), nœud 8 cœurs. Le front-end en protocole Redis de Zaris est indiscernable de Redis en latence — la couche de compatibilité n'ajoute aucun coût mesurable.

81 µs
Zaris (RESP)
p50 79 µs · p99 95 µs
83 µs
Redis
p50 87 µs · p99 95 µs
~125 µs
Zaris natif (client .NET)
p50 125 µs · p99 150 µs

Note honnête : la latence par opération du client natif (~125 µs) est mesurée avec le client managé .NET, tandis que Redis et Zaris-RESP sont mesurés avec le client C memtier — cela compare donc des stacks client, pas seulement des protocoles. La force du chemin natif est le débit agrégé à l'échelle, pas la latence sur une seule opération.

Le compromis

Mémoire : le vrai écart est ~2,5×, pas 10×

Même jeu de données — 1 000 000 de clés × valeurs de 100 octets (~100 Mo bruts) sur un seul nœud. Un instantané résident brut plaçait Zaris à 2,29 GiB contre 222 MiB pour Redis — mais décomposer le tas raconte une histoire plus juste. Seulement environ 0,5 GiB sont des données vivantes — soit environ 2,5× Redis par enregistrement, le coût d'un moteur managé (.NET) qui conserve des métadonnées par enregistrement (labels, entité, type de contenu, TTL absolu, une horloge de réplication) et des structures de possession. Le reste est de la mémoire que le ramasse-miettes .NET a engagée mais pas encore rendue à l'OS sous un barattage d'écritures soutenu (la posture de rétention du GC serveur par défaut) ; une limite de tas GC fait redescendre l'ensemble de travail. Le vrai écart par enregistrement est donc d'environ 2–3×, et c'est réglable — pas le 10× que suggère le chiffre résident. Pour les charges de travail à petites valeurs limitées par la mémoire, Redis reste plus léger ; Zaris échange un peu de mémoire contre du débit, de la mise à l'échelle par cœurs et de la haute disponibilité intégrée.

222 MiB
Redis
~185 o par enregistrement · résident
~0.5 GiB
Zaris — données vivantes
~2,5× Redis par enregistrement
2.29 GiB
Zaris — résident
incl. mémoire de travail GC · réglable
Lisez ceci aussi

Les mises en garde honnêtes

Mémoire : ~2,5× par enregistrement, pas 10×

Un instantané résident brut a montré 2,29 GiB vs 222 MiB pour Redis pour 1 M × 100 o — mais une décomposition du tas ne place que ~0,5 GiB de cela dans les données vivantes (~2,5× Redis par enregistrement, pour les métadonnées + la réplication). Le reste est de la mémoire de travail GC que le runtime retient sous le barattage d'écritures, qu'une limite de tas GC fait redescendre. À pondérer tout de même pour les charges de travail à petites valeurs limitées par la mémoire.

Les chiffres natifs sont en opt-in

Les chiffres natifs de 11–18 M utilisent un mode serveur à haut débit en opt-in (RF1) plus le client natif .NET du dépôt de benchmark. Les chiffres RESP en remplacement direct — qui dépassent déjà Redis — ne nécessitent rien de particulier.

La latence native est plus élevée

Par opération unique, le client natif managé mesure ~125 µs vs ~81–83 µs pour Redis/RESP via le client C memtier. Cela compare des stacks client ; la force du natif est le débit à l'échelle.

La marge dépend de la taille du nœud

Sur de petits nœuds 4 cœurs, Zaris ne mène que légèrement. Les victoires décisives (+70–87 %) sont sur des nœuds 8 cœurs de production, parce que Zaris monte en charge avec les cœurs et une instance Redis unique non.

Une charge de travail, un cloud

Valeurs de 100 octets, un mélange lecture/écriture 1:1, clés aléatoires, sur des SKU Azure AMD Zen4 spécifiques. Des tailles, des ratios et du matériel différents feront bouger les chiffres.

Mesurez les vôtres

L'ensemble du harnais — scripts, générateurs de charge, méthodologie — est open source. Reproduisez chaque chiffre sur votre cluster, votre taille de nœud et votre charge de travail, c'est la seule comparaison qui compte.

Ne nous croyez pas sur parole — mesurez-le

L'ensemble du harnais de benchmark est open source : les scripts, les générateurs de charge et la méthodologie exacte. Montez un cluster, exécutez-le sur votre matériel et votre charge de travail, et comparez.