Yük ve stres testi
1) Şartlar ve hedefler
Yük testi - SLO'ya karşı çalışma aralığında (hedef RPS/rekabet) test (örneğin, p95 <200 ms, hata oranı <0. 5%).
Stres testi - ötesine gidiyor (CPU/DB/ağın doygunluğundan önce/sonra), bozulma ve kurtarma mekaniğini gözlemliyor.
Spike testi - keskin yük patlamaları (dakikalarca × N).
Islak/Dayanıklılık - uzun çalışma (saat/gün) sızıntıları, GC sürüklenme, parçalanma, kuyruk büyüme bulmak için.
Kapasite testi - üretim platosunun (doygunluk noktası) ve rezervlerin hesaplanması.
Hedefler: SLO'yu onaylayın, platoyu düzeltin, darboğazları anlayın, otomatik ölçeklemeyi ve sınırları kalibre edin.
2) Trafik modeli: açık ve kapalı
Kapalı model (eşzamanlılık odaklı): Sabit sayıda sanal kullanıcı (VU), her biri cevaptan sonra düşünme süresi.
Açık model (varış oranı): Yanıtlardan bağımsız olarak sabit istek oranı (RPS).
Little Yasası: 'L = λ W'
'L', aynı anda hizmet verilen taleplerin ortalama sayısıdır,
'λ' - yoğunluk (RPS),
'W' ortalama yanıt süresidir.
Dolayısıyla, jeneratörün gerekli rekabet gücünün değerlendirilmesi: 'eşzamanlılık ≈ target_RPS p95_latency'.
3) Metrikler: ölçtüğümüz şey
Gecikme SLI: p50/p90/p95/p99 ve p99 kuyruk. 9; "Sıcak've" soğuk "yollar için ayrı.
Hatalar: '5xx', '4xx' (geçerli/geçersiz), zaman aşımları, iptal edildi.
Throughput: sürekli RPS, throughput streams/bytes.
Kaynaklar: CPU, RAM/yığın, GC duraklamaları, disk IOPS/lat, ağ bant genişliği, bağlantı sayısı/FD.
Kuyruklar ve Backprescher: derinlik, bekleme süresi, shed/sınırlı istek sayısı.
Önbellek verimliliği: hit/miss, ısınma fırtınaları.
DB/önbellekler/kuyruklar: p95 istekleri, kilitler, çakışmalar, havuz kullanımı.
4) Standlar ve veriler
Yapılandırma eşdeğerliği: yazılım sürümleri, limitler (uLimit, conntrack), JVM/GC yapılandırması, havuzlar.
Topoloji: LB'ler, CDN, WAF, TLS, aynı ağ "şerbetçiotu".
Veriler: gerçekçi dağılımlar (nesnelerin boyutları, "sıcak "/" soğuk "tuşlar, bölgesellik).
Soğuk/sıcak/sıcak başlangıç: bireysel koşular; "Soğuk" önbellekleri test ettiğinizden emin olun.
Arka plan izolasyonu: Alakasız işleri/cronomes'i devre dışı bırakın veya etkilerini hesaba katın.
5) Senaryolar (yük profilleri)
1. Taban çizgisi: hedef RPS'ye adım hızlandırma, 10-30 dakika tutun.
2. Ramp & Hold: Hedefin % X üzerinde düzgün büyüme, tutma, kuyruk analizi.
3. Spike: anlık × 2- × 5 sıçrama için 1-5 dakika, sonra geri dönün.
4. Başarısızlığa Stres: Başarısızlığa giden adımlar; İlk SLO hata noktasını ve "kırılma" noktasını düzeltin.
5. Emmek: Trafik değişkenliği ile 6-24 saat (gündüz/gece), yüzleri/sürüklenmeyi izleyin.
6. Karışık: uç noktaların reel dağılıma göre karışımı (Zipf/pareto), farklı ağırlıklar.
6) Adım adım süreç
SLO ve hedef trafik profillerini tanımlayın.
Yük modelini (açık/kapalı) seçin, varış hızını veya VU'ları ayarlayın.
Veri ve "sıcak "/" soğuk "modları hazırlayın.
Telemetri (yollar/metrikler/günlükler), test çalışması ile korelasyon kurun.
Isınma ve çalışma, eserler toplama (CPU/yığın profilleri, alev grafikleri, açıklama/yavaş günlükleri DB).
Darboğaz analizi, eylem öğelerinin oluşumu.
Düzeltmelerden sonra reprogon, temel güncelleme ve kapasite oyun kitabı.
7) Darboğazlar ve tipik düzeltmeler
CPU'ya bağlı hizmet: profil oluşturma - sıcak fonksiyonların, tahsislerin, şubelerin ortadan kaldırılması; Vektörleştirme, önbellek dostu yapı.
Ağ/TLS: keep-alive, HTTP/2/3, bağlantı havuzu, doğru zaman aşımları, azaltılmış sohbet.
DB: indeksler, gruplama, hazırlanmış sorgular, bağlantı havuzu, R/W ayrımı, sonuç önbelleğe alma, sorgu veri tekilleştirme.
Önbellekler: büyüklük, TTL, talep birleştirme, fırtına koruma, ısınma, bölgesel toplar.
Kuyruklar/aracılar: kabul sınırları/paralellik, partilerin büyüklüğü, idempotent tüketiciler, DLQ tavanları.
Garbatage/duraklar: GC ayarlama, tampon kiralama, makul sınırlar içinde nesne havuzu.
I/O/disk: asenkron I/O, sıkıştırma, makul bir düzeyde yanıtların sıkıştırılması.
8) Sınırlar ve koruma
Bütçe zaman aşımları: basamakları önlemek için yukarıdan aşağıya doğru.
Hız sınırı/belirteç kovaları: "uzun ölüm" yerine öngörülebilir bozulma.
Devre kesici ve düşük öncelikli doygunluk gölgeleme.
Geri basınç: sinyaller ve sınırlayıcı eşzamanlılık zincirin derinliklerine.
Bölmeler: kritik uç noktalar için havuzları izole eder.
Idempotency: Retraces altında güvenli tekrarlar için tuşlar.
9) Araçlar ve ne zaman seçileceği
K6 - laconic JS, varış oranı, entegrasyon ve grafikler için mükemmel destek.
Gatling - Scala DSL, yüksek performanslı jeneratör.
JMeter - esnek, zengin ekosistem; Protokoller/eklentiler için uygundur.
Locust - Python komut dosyaları, karmaşık kullanıcı akışı mantığı için uygundur.
Vegeta/hey/wrk - microbenchies ve nokta HTTP üzerinde çalışır.
tc/netem, toxiproxy - ağ bozunma enjeksiyonu.
Flamegraph/profiler - CPU/yığın sıcak noktaları arayın.
10) Örnekler (skeçler)
K6 (açık model, mix uç noktaları)
javascript import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'constant-arrival-rate',
rate: 800, timeUnit: '1s', duration: '20m',
preAllocatedVUs: 500, maxVUs: 2000
}
},
thresholds: {
'http_req_duration{kind:hot}': ['p(95)<200'],
'http_req_failed': ['rate<0. 005']
}
};
export default function () {
const r = Math. random();
let res;
if (r < 0. 6) {
res = http. get('https://svc/api/hot', { tags: { kind: 'hot' }});
} else if (r < 0. 9) {
res = http. get('https://svc/api/warm', { tags: { kind: 'warm' }});
} else {
res = http. post('https://svc/api/heavy', JSON. stringify({ n: 1000 }), { headers: { 'Content-Type': 'application/json' }});
}
check(res, { 'status is 2xx': (r) => r. status >= 200 && r. status < 300 });
sleep(0. 2);
}
Gatling (adımlar ve başak)
scala setUp(
scn. inject(
rampUsersPerSec(50) to 500 during (10 minutes),
constantUsersPerSec(500) during (20 minutes),
spikeUsers(2000). during(30. seconds)
)
). protocols(http. baseUrl("https://svc"))
Yükleme planı (YAML iskeleti)
yaml profile: "mix-traffic"
targets:
- endpoint: GET /api/hot weight: 0. 6
- endpoint: GET /api/warm weight: 0. 3
- endpoint: POST /api/heavy weight: 0. 1 schedule:
- step: { rps: 300, hold: 10m }
- step: { rps: 600, hold: 10m }
- step: { rps: 900, hold: 10m }
guardrails:
slo:
p95_ms: 200 error_rate: 0. 5%
abort_if:
- metric: error_rate op: ">"
value: 2%
window: 2m
11) Otomasyon ve yaşam döngüsü
Her PR'de perf-duman (önemli uç noktaların kısa çalışması).
Gece "kapasite" raporlar ve profil eserler ile sahnede çalışır.
CI/CD'deki kapılar: p95/p99> X taban çizgisi veya hata oranı artışının %'sini geri alırken dosya oluşturun.
Taban çizgilerinin çevrilmesi ve profillerin/flamegrafların artefaktlar olarak depolanması.
Alaka düzeyi etiketleri: Hangi hizmet/uç nokta kapsanır, hangi trafik profili kullanılır.
12) Anti-desenler
Aynı makinede jeneratör ve test hizmeti - çarpık sonuçlar.
APIbacks için sadece kapalı model (VU) - eksik çekim ve yanlış değerlendirme.
Soğuk bir başlangıç olmadan boş bir veritabanı/önbellek üzerinde çalışır.
Gerçekçi dağılım yok (tüm sorgular aynı).
Telemetri yok (yalnızca jeneratör tarafında RPS/gecikme).
Kararlı taban çizgileri ve çevre kontrolü olmadan karşılaştırma.
Nedeni düzeltmek yerine artan bir zaman aşımı yoluyla "optimizasyon".
13) Mimar kontrol listesi
1. SLO ve tipik/tepe yük tanımlı?
2. Doğru model (açık/kapalı) seçilmiş ve trafik profili tanımlanmış mı?
3. Stand, konfigürasyon ve topolojide eşdeğerdir, soğuk/sıcak mod var mı?
4. Telemetri ve profiller etkin, test yarası işaretlenmiş mi?
5. Çalışır: taban çizgisi/rampa/başak/stres/ıslanma - kapalı?
6. Doygunluk noktaları sabitlendi mi ve güvenlik marjı planlandı mı?
7. Yapılandırılmış limitler, kırıcılar, backprescher, idempotency, gölgelendirme politikaları?
8. P95/p99 regresyon ve hata oranı için CI kapıları var mı, taban çizgileri değiştirilmiş mi?
9. Düzeltmelerden sonra - reprogon ve playbook güç güncellemesi?
10. Otomatik yakınlaştırma ve acil durum planı belgelendi mi?
Sonuç
Yük ve stres testleri tek seferlik "yarışlar'değil, sürekli mühendislik uygulamalarıdır. Gerçekçi bir trafik modeli, doğru standlar, telemetri ve CI/CD'deki otomasyon, performansı "gizli sihir'den metrik güdümlü yeteneğe dönüştürür: tavanınızın nerede olduğunu, stoğun ne kadar güvenli olduğunu ve hangi değişikliklerin kullanıcı deneyimini gerçekten iyileştirdiğini bilirsiniz.