· kaynak dev.to (home feed)
Cloud Run'daki Redis'ten-JSON benchmarkında Rust, Node.js verimini yaklaşık ikiye katladı
Google Cloud Run üzerinde yapılan bir karşılaştırma testinde, Rust servisinin önbelleklenmiş 100 KB'lık bir JSON'u Node.js'den yaklaşık iki kat hızlı döndürdüğü, farkın tüm gecikme yüzdelik dilimlerinde korunduğu görüldü.

Kurulum
Bir geliştirici, dev.to üzerinde Google Cloud Run'da Node.js ile Rust'ı karşılaştıran bir benchmark yayımladı ve sonuç tek taraflı: önbelleklenmiş 100 KB'lık bir JSON dokümanı servis eden Rust servisi, birebir aynı altyapıda yaklaşık yarısı kadar gecikmeyle iki kat fazla trafiği karşıladı.
Test, mümkün olduğunca I/O-bağımlı olacak şekilde tasarlandı; mantık şuydu: bir isteğin süresinin çoğu ağ beklemesine harcanıyorsa, dilin neredeyse hiç önemi olmamalı. Her servis, Redis'e bağlanan, tek bir string okuyan ve onu JSON olarak döndüren tek bir GET /data endpoint'i sunuyor — başka hiçbir şey yapmıyor.
Karşılaştırılan stack'ler ise şöyleydi: Node.js servisi Alpine üzerinde Node 22, Fastify 5 ve ioredis ile çalışırken, Rust servisi distroless bir imajda tokio üzerinde Poem 3 framework'ü ve redis-rs client'ını kullandı. İkisi de birebir aynı ayarlarla Cloud Run'a dağıtıldı — 1 vCPU, 512 MiB bellek, tam olarak tek instance (minimum = maksimum = 1) ve 20'lik bir eşzamanlılık limiti — São Paulo yakınlarındaki southamerica-east1 bölgesinde. Servis başına tek instance sabitlemek bilinçli bir tercihti, çünkü bu şekilde autoscaling'in instance başına kapasite farklarını maskelemesi engelleniyor.
Redis ise aynı zone'daki bir e2-micro VM üzerinde çalıştı, Direct VPC egress üzerinden internal IP'siyle erişilebilirdi; kalıcılık kapalıydı ve bellek sınırı 512 MB'dı. Altyapıyı Pulumi hazırladı ve ayrı bir e2-micro VM, 5 saniyelik bir ısınma süresinin ardından 30 saniyelik ölçümle wrk ile yük üretti — Cloud Run eşzamanlılığına uyacak şekilde 2 thread ve 20 bağlantı. Payload, tam olarak 102.400 byte'lık rastgele üretilmiş bir JSON dokümanıydı.
Sonuçlar
dev.to gönderisine göre Node.js saniyede 237.72 isteği kaldırırken Rust 467.93'e ulaştı; bu 1.97x'lik bir avantaj. Aktarım hızları ise sırasıyla 23.26 MB/s ve 45.79 MB/s oldu. Ortalama gecikme Node.js için 83.80 ms, Rust için 42.59 ms idi ve fark tüm yüzdelik dilimlerde korundu: p50 42.16 ms'e karşı 81.34 ms, p90 48.79 ms'e karşı 95.26 ms ve p99 58.97 ms'e karşı 112.70 ms oldu. Ölçülen 30 saniye boyunca bu, Node.js'in servis ettiği 7.139 isteğe karşı Rust'ın 14.051 isteğine denk geldi.
Yazar, iki ana rakamın mekanik olarak birbirine bağlı olduğunu vurguluyor: sabit bir 20 bağlantı havuzuyla, istek başına gecikmeyi kabaca yarıya indirmek saniyedeki istek sayısını ikiye katlıyor.
Uyarılar
Gönderi, rakamların neyi kanıtladığı konusunda dikkatli. Bu tek bir makine konfigürasyonunda yapılmış tek bir testti; bu yüzden yazar bunu Node.js ile Rust arasında genel bir hüküm yerine, bu iki belirli stack'in karşılaştırması olarak çerçeveliyor. Hem Redis sunucusu hem de yük üreteci e2-micro instance'lardı — paylaşımlı çekirdekli bir makine türü — yani ikisi de gerçek darboğaz olabilir; yazar bunun Rust'ı geri tutuyor olabileceğinden şüpheleniyor ancak daha büyük VM'lerin onu daha da ileri taşıyıp taşımayacağını test etmedi.
Her servis ayrıca tek bir Cloud Run instance'ında tek vCPU ile çalıştı; dolayısıyla autoscaling altında ilgili rakam instance başına verim farkıdır ve maliyete yansıyacak da budur. Son olarak, yazarın sonuç için açıklaması — her istekte Redis'ten 100 KB okuyup bunu socket'e yazmanın sezgiden beklenenden daha fazla CPU tükettiği — açıkça bir hipotez olarak etiketlendi, çünkü hiçbir profiling yapılmadı. Deneyi yeniden çalıştırmak için gereken her şey — her iki API, Pulumi altyapısı ve benchmark script'i dahil — açık kaynak deposu andersondanilo/cloudrun-benchmark'da bulunuyor.
Neden önemli
Serverless platformlar instance süresine göre faturalandırır; dolayısıyla instance başına verim doğrudan maliyete dönüşür: aynı 1 vCPU tahsisinde iki kat fazla isteği karşılayan bir servis, aynı trafik için kabaca yarısı kadar instance-saatine ihtiyaç duyar. Benchmark ayrıca I/O-bağımlı iş yüklerinde dil seçiminin önemsiz olduğu yaygın varsayımını da zorluyor — tek bir Redis okuması yapılan tek işlem olsa bile, payload 100 KB'a ulaştığında runtime 2x'lik bir farka yol açtı. Cloud Run'da büyüklü önbelleklenmiş yanıtlar servis eden ekipler için bir yeniden yazım otomatik olarak gerekli değil; ancak instance başına verimlilik farkı, Rust'ı hot path'ler için kısa listeye almayı gerektirecek kadar büyük — ve yeniden üretilebilir kurulum, taahhütte bulunmadan önce aynı senaryoyu kendi iş yükünüzle test etmeyi ucuz kılıyor.
- #cloud-run
- #rust
- #node-js
- #benchmark
- #redis
- #serverless