Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
BenchmarkDotNet İleri Seviye: Parametreler, Baseline, Diagnoser'lar, Runtime Karşılaştırma ve CI'da Regresyon Yakalamak
BenchmarkDotNet'in ileri kullanımı, gerçekçi senaryoları ParamsSource ile tanımlamak, eski kodu baseline yapıp oranı okumak, Memory, Exception, Threading ve Disassembly diagnoser'larıyla farkın sebebini görmek ve regresyonu göreli, istatistiksel karşılaştırmayla yakalamaktır. Bookstore'un fiyat hesabında .NET 11'in LINQ sürümünü yüzde 30-38 hızlandırıp döngüyü değiştirmediğini, 0.15.8'in net11.0'ı tanımadığını ve try/catch'li ayrıştırmanın on kat yavaşladığını ölçüyoruz.
Sonuçları Yorumlamak: Percentile'lar, Coordinated Omission, Throughput-Latency Eğrisi ve Bottleneck'i Bulmak
Load test sonucunu doğru okumak için ortalamaya değil percentile'lara bakmak, percentile'ları ortalamamak, coordinated omission'dan kaçınmak için open model kullanmak, kapasiteyi throughput-latency eğrisinin dirseğinde aramak ve darboğazı USE yöntemiyle bulmak gerekir. Bookstore API'sini 5 saniye dondurup closed modelin p99'u 8 ms, open modelin 4,2 saniye gösterdiğini ölçüyor, eğrinin çöküşünü connection pool ve SQL Server wait'lerine kadar izliyoruz.
JMeter: Hâlâ Doğru Araç Olduğu Yerler, Test Plan, Thread Group, CLI Modu ve HTML Dashboard
JMeter, JDBC, JMS ve LDAP gibi geniş protokol desteği, mevcut test planları ve kod yazmayan test ekipleri için hâlâ doğru araç; HTTP API için k6 daha uygun. Bookstore senaryosunu JMeter 5.6.3'te Open Model Thread Group, CSV Data Set, JSON Extractor ve timer'larla kurup CLI modunda koşturuyor, HTML dashboard'u okuyor ve timer scope'u, APDEX eşikleri ile exit code gibi tuzakları gösteriyoruz.
k6'yı Sürece Koymak: CI'da Performance Gate, OpenTelemetry Output, Distributed Test ve Browser Senaryoları
k6'yı sürece koymak, PR'da kısa bir performance gate ve her gece tam bir load test koşturmak, metric'leri OpenTelemetry ile uygulama telemetrisinin yanına göndermek, büyük yükü k6 Operator ile pod'lara bölmek ve kullanıcının gördüğü süreyi browser modülüyle ölçmek demek. Bookstore için GitHub Actions workflow'unu, Collector'a giden metric'leri, iki runner'lı dağıtık testi ve k6 archive'ın options'ı dondurduğu tuzağı gerçek koşularla gösteriyoruz.
k6 ile Load Test: Script, Scenario'lar, Arrival-Rate Executor'ları, Check, Threshold ve expect()
k6 2.x ile gerçekçi bir load test, her kullanıcı akışı için ayrı bir arrival-rate scenario'su, Little's Law ile hesaplanmış VU sayısı, endpoint bazında threshold'lar, setup()'ta expect() ile hızlı başarısızlık ve JSON özetle kurulur. Bookstore üzerinde TypeScript script'i koşturup çıktıyı satır satır okuyor, veritabanı gidince abortOnFail'in testi nasıl kestiğini ve k6'ya tek çekirdek verince p95'in dokuz kat arttığını gösteriyoruz.
Workload Modeling ve Test Verisi: Gerçekçi Trafik Karışımı, Think Time, Cache Durumu ve Bağımlılıkları Taklit Etmek
Gerçekçi bir load test, trafik karışımını access log'dan ölçer, oturum yüzdesini istek yüzdesinden ayırır, rastgele think time kullanır, production boyutunda ve dağılımında veriyle, bilinçli seçilmiş cache durumuyla ve stub'lanmış bağımlılıklarla koşar. Bookstore'da hep aynı kitabı isteyen testin veritabanına bir dakikada yalnız 41 sorgu gönderdiğini, gecikmesiz ödeme stub'ının siparişi yirmi kat hızlı gösterdiğini gerçek koşularla gösteriyoruz.
Performance Testing Türleri ve Hedefler: Load, Stress, Spike, Soak, Breakpoint ve SLO'dan Kabul Kriterine
Her performance test türü ayrı bir soruya cevap verir: smoke script'in çalıştığını, average load normal günü, stress zirveyi, spike ani sıçramayı, soak saatler sonrasını, breakpoint kapasite sınırını gösterir. Kabul kriterini SLO'dan yük, süre ve sınırlarla türetiyor, Little's Law ile sanal kullanıcı sayısını hesaplıyor ve Bookstore üzerinde closed model'in yavaşlayan sistemde yükü kendiliğinden azaltıp sorunu gizlediğini gerçek k6 koşularıyla gösteriyoruz.