r/CodingTR 7d ago

GoRL v2.2.1 — sharded key locks ile concurrent multi-key load'da %61-67 daha hızlı (benchstat ile doğrulanmış)

Bu işin en keyifli anlarından biri: performans iyileştirmesi sonrası before/after sayılarını görmek.

GoRL'de farklı kullanıcıların isteklerini gereksiz yere birbirine bekleten tek bir lock mekanizmasını, her key'i kendi lock shard'ına yönlendiren 256 parçalı bir yapıyla değiştirdim. Bu repoyu yaklaşık bir yıl önce de paylaşmıştım, gelen feedback'ler geliştirmeye devam etmem için itici güç oldu. Bu hafta yaptığım bir concurrency fix'i paylaşıyorum.

Problem: in-memory sliding window, token bucket ve leaky bucket limiter'ların her biri limiter instance başına tek bir mutex kullanıyordu. Correctness açısından sorun yoktu ama tenant-a için yavaş bir operasyon, aynı limiter üzerindeki tenant-b ve tenant-c'nin işlemlerini de bloke ediyordu — state'leri birbiriyle hiç alakasız olsa bile.

Çözüm: single mutex'i, request key'in hash'ine göre belirlenen fixed 256-shard lock yapısıyla değiştirdim. Aynı key hâlâ sırayla işleniyor (rate-limit kararları etkilenmiyor), farklı key'ler artık farklı shard'lara düşüyor ve concurrent çalışabiliyor. Memory kullanımı limiter başına düz ~2 KB ve key cardinality'sine göre büyümüyor.

Rakamları uydurmadım; bir control group (değişiklikten etkilenemeyecek bir benchmark) ile ve statistical significance (p-values) ile doğruladım. Sonuçlar (benchstat, 10 interleaved sample, Apple M4/Go 1.26, machine drift'i yakalamak için lock-free control benchmark ile birlikte):

Algorithm Before After Change
Sliding window 787.6 ns 262.4 ns -66.7% (p=0.000)
Token bucket 823.1 ns 320.3 ns -61.1% (p=0.000)
Leaky bucket 813.4 ns 315.4 ns -61.2% (p=0.000)

Single-key latency değişmedi (p=0.35-0.97, anlamlı değil) — correctness trade-off yok, allocation'lar before/after byte-for-byte aynı. Public API'de hiçbir değişiklik yok.

Methodology ve control-group setup'ın detaylı anlatıldığı yazı: https://alirizaaynaci.github.io/gorl/architecture/concurrency/

Repo: https://github.com/AliRizaAynaci/gorl

2 Upvotes

0 comments sorted by