Δοκιμή φορτίου και ακραίων καταστάσεων
1) Όροι και στόχοι
Δοκιμή φορτίου - δοκιμή στο εύρος λειτουργίας (στόχος RPS/ανταγωνισμός) έναντι SLO (π.χ. p95 <200 ms, ποσοστό σφάλματος <0. 5%).
Δοκιμή αντοχής - υπέρβαση (πριν/πάνω από τον κορεσμό της ΚΜΕ/DB/δικτύου), παρατήρηση της μηχανικής υποβάθμισης και ανάκτησης.
Δοκιμή ακίδων - αιχμηρές εκρήξεις φορτίου (× N για λεπτά).
Εμποτισμός/Αντοχή - μακροχρόνια (ώρες/ημέρα) για την εύρεση διαρροών, μετατόπιση GC, κατακερματισμός, ανάπτυξη ουράς αναμονής.
Δοκιμή χωρητικότητας - υπολογισμός της κλίμακας διακίνησης (σημείο κορεσμού) και των εφεδρειών.
Στόχοι: επιβεβαίωση SLO, καθορισμός οριζοντίου επιπέδου, κατανόηση σημείων συμφόρησης, βαθμονόμηση αυτόματης κλιμάκωσης και όρια.
2) Μοντέλο κυκλοφορίας: ανοικτό έναντι κλειστό
Κλειστό μοντέλο (με βάση το νόμισμα): ένας σταθερός αριθμός εικονικών χρηστών (VU), ο καθένας μετά την απάντηση κάνει χρόνο σκέψης.
Ανοικτό μοντέλο (ποσοστό άφιξης): σταθερό ποσοστό αιτήσεων (RPS), ανεξάρτητα από τις απαντήσεις.
Νόμος του Little 's: 'L = λ Ws'
"L 'είναι ο μέσος αριθμός ταυτόχρονα εξυπηρετούμενων αιτήσεων,
'λ' - ένταση (RPS),
«W» είναι ο μέσος χρόνος απόκρισης.
Εξ ου και η αξιολόγηση της αναγκαίας ανταγωνιστικότητας του παραγωγού: "concurrency ≈ target_RPS p95_latency'.
3) Μετρήσεις: τι μετράμε
Καθυστέρηση SLI: p50/p90/p95/p99 και p99 ουρά. 9; χωριστά για «θερμές» και «ψυχρές» διαδρομές.
Σφάλματα: '5xx', '4xx' (έγκυρα/άκυρα), χρονοδιαγράμματα, ματαιωμένα.
Απόδοση: σταθερή RPS, ροές διακίνησης/ψηφιολέξεις.
Πόροι: CPU, RAM/σωρός, GC παύσεις, δίσκος IOPS/lat, εύρος ζώνης δικτύου, αριθμός συνδέσεων/FD.
Ουρές αναμονής και Backprescher: βάθος, χρόνος αναμονής, αριθμός αιτήσεων αποθήκευσης/περιορισμένα αιτήματα.
Απόδοση μνήμης: χτύπημα/αστοχία, καταιγίδες προθέρμανσης.
DB/caches/ουρές αναμονής: p95 αιτήματα, κλειδαριές, συγκρούσεις, κοινή χρήση.
4) Περίπτερα και δεδομένα
Ισοδυναμία διαμόρφωσης: εκδόσεις λογισμικού, όρια (uLimit, conntrack), ρυθμίσεις JVM/GC, ομάδες.
Τοπολογία: LB, CDN, WAF, TLS, το ίδιο δίκτυο «λυκίσκου».
Δεδομένα: ρεαλιστικές κατανομές (μεγέθη αντικειμένων, «καυτά «/» ψυχρά «κλειδιά, περιφερειακός χαρακτήρας).
Ψυχρή/θερμή/θερμή εκκίνηση: μεμονωμένες διαδρομές. Βεβαιωθείτε ότι θα δοκιμάσετε «ψυχρές» κρυψώνες.
Απομόνωση υποβάθρου: Απενεργοποίηση άσχετων θέσεων εργασίας/στροφαλοθαλάμων ή καταγραφή των επιπτώσεών τους.
5) Σενάρια (προφίλ φορτίου)
1. Αρχική τιμή: βαθμιαία επιτάχυνση για τη στοχευόμενη RPS, διάρκεια 10-30 λεπτά.
2. Ramp & Hold: ομαλή ανάπτυξη σε X% πάνω από το στόχο, κατακράτηση → ανάλυση ουράς.
3. Ακίδα: στιγμιαία × 2- × 5 splash για 1-5 λεπτά και στη συνέχεια επιστρέφει.
4. Στρες σε αποτυχία: βήματα σε αστοχίες· καθορίζει το πρώτο σημείο αστοχίας SLO και το σημείο «διακοπής».
5. Μούσκεμα: 6-24 ώρες με διακύμανση της κυκλοφορίας (ημέρα/νύχτα), ρολόι για πρόσωπα/παρασυρόμενα.
6. Μεικτό: μείγμα τελικών σημείων με πραγματική κατανομή (Zipf/pareto), διαφορετικά βάρη.
6) Σταδιακή διαδικασία
Καθορισμός προφίλ κυκλοφορίας SLO και στόχων.
Επιλέξτε το μοντέλο φορτίου (ανοικτό/κλειστό), καθορισμένο ρυθμό άφιξης ή VU.
Προετοιμασία δεδομένων και «θερμών «/» ψυχρών «τρόπων.
Δημιουργία τηλεμετρίας (μονοπάτια/μετρήσεις/κούτσουρα), συσχέτιση με τη διεξαγωγή της δοκιμής.
Προθέρμανση και λειτουργία, συλλογή αντικειμένων (CPU/προφίλ σωρού, γραφήματα φλόγας, εξηγήσεις/αργοί κούτσουροι DB).
Ανάλυση σημείων συμφόρησης, σχηματισμός στοιχείων δράσης.
Επαναπροσδιορισμός μετά τις διορθώσεις, ενημέρωση γραμμής βάσης και βιβλίο αναπαραγωγής χωρητικότητας.
7) Σημεία συμφόρησης και τυπικές διορθώσεις
Υπηρεσία συνδεόμενη με ΚΜΕ: διαμόρφωση προφίλ → εξάλειψη θερμών λειτουργιών, κατανομών, υποκαταστημάτων. διάνυσμα, δομή φιλική προς τη μνήμη.
Δίκτυο/TLS: διατήρηση ζωντανών, HTTP/2/3, συνένωση συνδέσεων, ορθά χρονοδιαγράμματα, μειωμένη συνομιλία.
DB: δείκτες, ομαδοποίηση, προετοιμασμένα ερωτήματα, δεξαμενή σύνδεσης, διαχωρισμός R/W, αποθήκευση αποτελεσμάτων, αφαίρεση ερωτημάτων.
Caches: μέγεθος, TTL, αίτημα για άνθρακα, προστασία από καταιγίδες, θέρμανση, περιφερειακές μπάλες.
Ουρές αναμονής/μεσίτες: όρια αποδοχής/παραλληλισμός, μέγεθος παρτίδων, ευφυείς καταναλωτές, ανώτατα όρια DLQ.
Σκουπίδια/παύσεις: ρύθμιση GC, ενοίκια ρυθμιστικού διαλύματος, συγκέντρωση αντικειμένων εντός λογικών ορίων.
I/O/δίσκος: ασύγχρονη I/O, συμπίεση, συμπίεση αποκρίσεων με εύλογο επίπεδο.
8) Όρια και προστασία
Χρονοδιάγραμμα του προϋπολογισμού: από πάνω προς τα κάτω για την αποφυγή καταρρακτών.
Όριο ταχύτητας/συμβολικοί κουβάδες: προβλέψιμη αποικοδόμηση αντί για «μακρύ θάνατο».
Διακόπτης κυκλώματος και σκίαση κορεσμού χαμηλής προτεραιότητας.
Backpressure: σήματα και περιορισμός του νομίσματος βαθιά μέσα στην αλυσίδα.
Διαφράγματα: απομονωτικές δεξαμενές για κρίσιμα τελικά σημεία.
Idempotency: κλειδιά για ασφαλείς επαναλήψεις υπό retraces.
9) Εργαλεία και πότε να τα επιλέξετε
k6 - laconic JS, άριστη υποστήριξη για ρυθμό άφιξης, ολοκλήρωση και γραφήματα.
Gatling - Scala DSL, γεννήτρια υψηλής απόδοσης.
JMeter - ευέλικτο, πλούσιο οικοσύστημα· βολικό για πρωτόκολλα/πρόσθετα.
Locust - Σενάρια Python, βολικό για την πολύπλοκη λογική ροής χρήστη.
Vegeta/hey/wrk - microbenchies and point runs on HTTP.
tc/netem, toxiproxy - ένεση αποδόμησης δικτύου.
Flamegraph/profiler - αναζήτηση ΚΜΕ/σωρού θερμών σημείων.
10) Παραδείγματα (σκίτσα)
k6 (ανοικτό μοντέλο, μείγμα τελικών σημείων)
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 (βαθμίδες και ακίδες)
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"))
Σχέδιο φορτίου (σκελετός YAML)
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) Αυτοματοποίηση και κύκλος ζωής
Perf- καπνός σε κάθε PR (βραχεία εκτέλεση των βασικών τελικών σημείων).
Η νυχτερινή «χωρητικότητα» τρέχει στη σκηνή με αναφορές και αντικείμενα προφίλ.
Πύλες σε CI/CD: αρχείο κατασκευής κατά την οπισθοδρόμηση p95/p99> X% της αύξησης του ρυθμού εκκίνησης ή σφάλματος.
Έκδοση γραμμών βάσης και αποθήκευση προφίλ/φλαμεγραφών ως αντικειμένων.
Ετικέτες καταλληλότητας: ποια υπηρεσία/τελικό σημείο καλύπτεται, ποιο προφίλ κυκλοφορίας χρησιμοποιείται.
12) Αντι-μοτίβα
Η γεννήτρια και η υπηρεσία δοκιμής στην ίδια μηχανή → παραμορφωμένα αποτελέσματα.
Μόνο κλειστό μοντέλο (VU) για APIbacks → υποεκτίμηση και εσφαλμένη κρίση.
Εκτελείται σε κενή βάση δεδομένων/κρύπτη χωρίς ψυχρή εκκίνηση.
Δεν υπάρχουν ρεαλιστικές κατανομές (όλα τα ερωτήματα είναι τα ίδια).
Καμία τηλεμετρία (RPS/καθυστέρηση μόνο στην πλευρά της γεννήτριας).
Σύγκριση χωρίς σταθερές γραμμές βάσης και έλεγχο του περιβάλλοντος.
«Βελτιστοποίηση» μέσω ενός αυξημένου χρόνου αντί της διόρθωσης της αιτίας.
13) Κατάλογος ελέγχου αρχιτεκτόνων
1. SLO και καθορισμένο τυπικό/μέγιστο φορτίο
2. Επιλέγεται το σωστό μοντέλο (ανοικτό/κλειστό) και περιγράφεται το προφίλ κυκλοφορίας
3. Το περίπτερο είναι ισοδύναμο στη διαμόρφωση και την τοπολογία, υπάρχει ψυχρή/θερμή κατάσταση
4. Ενεργοποιημένη τηλεμετρία και προφίλ, με ετικέτα δοκιμαστικής πληγής
5. Διαδρομές: γραμμή βάσης/ράμπα/ακίδα/πίεση/εμποτισμός - καλυμμένη
6. Έχουν καθοριστεί σημεία κορεσμού και προβλέπεται περιθώριο ασφαλείας
7. Ρυθμισμένα όρια, διακόπτες, backprescher, idempotency, πολιτικές σκίασης
8. Υπάρχουν πύλες CI για την παλινδρόμηση p95/p99 και το ποσοστό σφάλματος, είναι οι γραμμές βάσης
9. Μετά τις διορθώσεις - επαναπρογραμματισμός και ενημέρωση ισχύος του playbook
10. Τεκμηριωμένο αυτόματο ζουμ και σχέδιο έκτακτης ανάγκης
Συμπέρασμα
Οι δοκιμές φορτίου και ακραίων καταστάσεων δεν είναι εφάπαξ «αγώνες», αλλά συνεχής τεχνική πρακτική. Ένα ρεαλιστικό μοντέλο κυκλοφορίας, τα σωστά περίπτερα, η τηλεμετρία και η αυτοματοποίηση σε CI/CD μετατρέπουν την απόδοση από «μυστική μαγεία» σε μετρική ικανότητα: ξέρετε πού είναι η οροφή σας, πόσο ασφαλές είναι το απόθεμα και τι αλλάζει πραγματικά την εμπειρία του χρήστη.