Δοκιμή φορτίου και στρες
Δοκιμή φορτίου και στρες
1) Γιατί το χρειάζεστε
Στόχοι:- Επιβεβαίωση χωρητικότητας (πόσες συνεδριάσεις RPS/διαγωνισμού θα αντέξει το σύστημα σε δεδομένη SLO).
- Εύρεση σημείων συμφόρησης (CPU/IO/DB/δίκτυα/κλειδαριές/δεξαμενές).
- Κατάρτιση προϋπολογισμών επιδόσεων και πυλών σε CI/CD.
- Μείωση του κινδύνου απελευθέρωσης (p95/p99 παλινδρόμηση, αύξηση σφάλματος αιχμής).
- Χωρητικότητα/κόστος σχεδίου (κλίμακα και αποθέματα).
2) Τύποι δοκιμών perf
Φορτίο: ρεαλιστική κίνηση κοντά στις κορυφές. Επικύρωση SLO.
Στρες: ανάπτυξη προς/πάνω από το όριο συμπεριφοράς υποβάθμισης όπου σπάει.
Ακίδα: άλμα γρήγορου φορτίου → ελαστικότητα/αυτόματη κλιμάκωση.
Εμποτισμός/Αντοχή: ώρες/ημέρα → διαρροές, κατακερματισμός, μετατόπιση της καθυστέρησης.
Ικανότητα/κλιμάκωση: πώς μεταβάλλεται η απόδοση/η καθυστέρηση με κλιμάκωση· Νόμος Amdal/Gustafson.
Καπνός perf: ένα σύντομο «καπνό» σε κάθε απελευθέρωση (αξιοπρέπεια απόδοσης).
3) Μοντέλα παραγωγής κυκλοφορίας
Σταθερή VU/concurrency: «N» χρήστες, καθένας από τους οποίους ζητά να → ουρά αναμονής στον πελάτη. Κίνδυνος απόκρυψης υπερφόρτωσης.
Ρυθμός άφιξης: ροή εφαρμογών με ένταση λ (req/s), όπως στην πραγματική ζωή. Πιο ορθή για τις δημόσιες API.
Νόμος του Little 's: 'L = λ × W'.
Για τη δεξαμενή/υπηρεσία, ελάχιστος παραλληλισμός ≈ 'λ × W' (προσθήκη 20-50% της απογραφής).
Όπου το «λ» διακινείται, το «W» είναι ο μέσος χρόνος υπηρεσίας.
4) Προφίλ φορτίου και σενάρια
Συνδυασμός ταξιδιού χρήστη: μετοχές σεναρίων (σύνδεση, περιήγηση, κατάθεση, checkout...).
Χρόνος σκέψης: παύση χρήστη (κατανομές: εκθετική/lognormal).
Προφίλ δεδομένων: μέγεθος των απαντήσεων, ωφέλιμο φορτίο, μεταβλητότητα των παραμέτρων.
Συσχέτιση: βήματα ζεύξης (cookies/mokens/ID) όπως στην πραγματική ροή.
Κρύο/ζεστό/ζεστό κρύπτη: μεμονωμένες διαδρομές.
Read vs Γράψτε: ισορροπία αναγνώσεων/εγγραφών, idempotency for retrays.
Πολυπεριφέρεια: RTT, διανομή από POP/ASN.
5) Περιβάλλον δοκιμών
Απομόνωση: το περίπτερο είναι κοντά στο προϊόν στην τοπολογία/ρυθμίσεις (αλλά δεν «χτυπά» το προϊόν).
Στοιχεία: συγκάλυψη PII, όγκοι, δείκτες όπως στις πωλήσεις.
Γεννήτριες φορτίου: να μην στηρίζονται στην ΚΜΕ/δίκτυο. κατανεμημένοι δρομείς, συγχρονισμός χρόνου.
Παρατηρησιμότητα: μετρήσεις/μονοπάτια/κούτσουρα, συνθετικά στην περίμετρο, εξαγωγή προφίλ ΚΜΕ/σωρού.
6) Μετρήσεις και SLI
Απόδοση: RPS/Συναλλαγές/sec
Καθυστέρηση: p50/p95/p99, TTFB, χρόνος εξυπηρετητή έναντι δικτύου.
Σφάλματα: μερίδιο των σφαλμάτων 5xx/4xx/τομέα.
Κορεσμός: CPU, φορτίο avg, GC, δίσκος IOps/καθυστέρηση, δίκτυο, πισίνα αναμονής.
Business SLI: ≤ 5s επιτυχία κατάθεσης, ≤ 2s επιβεβαίωση παραγγελίας.
Πάρτε τα κατώτατα όρια από το SLO (π.χ. "99. 95% 300 m ), παρακολούθηση του ρυθμού καύσης κατά τη διάρκεια της διαδρομής.
7) Εύρεση σημείων συμφόρησης (τεχνική)
1. Σταθερή προθέρμανση του συστήματος κατά 60-80% του φορτίου στόχου.
2. Αύξηση των βαθμίδων (κεκλιμένο επίπεδο) → διόρθωση όπου αυξάνεται το p95/p99 και ο ρυθμός σφάλματος.
- ουρές σε ομάδες (DB/HTTP),
- ανάπτυξη της WAIT/κλειδαριών (DB),
- GC-παύση/σωρός,
- αναμεταδόσεις δικτύου/απώλεια πακέτων,
- αστοχίες λανθάνουσας/κρύπτης δίσκου.
- 4. Εντοπισμός: δυαδική αναζήτηση μέσω διαδρομής ερωτήματος, προφίλ (CPU/OBI/lock-profile).
- 5. Διορθώστε τη «φιάλη» → ρυθμίζοντας → επαναλαμβάνοντας το τρέξιμο.
8) Συμπεριφορά υπό πίεση
Χαριτωμένη υποβάθμιση: όρια, διακόπτες κυκλωμάτων, ουρές αντίθλιψης, αποδεκτές για επεξεργασία.
Retrays: μέγιστο 1, idempotent μόνο. νευρικότητα· ο προϋπολογισμός επανακαταμέτρησης ≤ το 10% της RPS.
Αποτυχία-άνοιγμα/αποτυχία-κλείσιμο: για μη κρίσιμες εξαρτήσεις, επιτρέψτε την αποτυχία-άνοιγμα (cache/stubs).
Βλάβη κατακράτησης: απομόνωση των δεξαμενών/ποσοστώσεων (διαφράγματα), ταχεία χρονομέτρηση, «ομαλή» απενεργοποίηση των λειτουργιών (σημαίες χαρακτηριστικών).
9) Εργαλεία (επιλογή καθηκόντων)
k6 (JavaScript, ανοικτό/ανοικτό μοντέλο, γρήγορο, βολικό σε CI).
JMeter (πλούσιο σε οικοσύστημα, GUI/CLI, πρόσθετα, αλλά βαρύτερο).
Gatling (Scala DSL, υψηλές επιδόσεις).
Locust (Python, ευελιξία γραφής).
Vegeta/hey/wrk (μικρο-πάγκοι και γρήγορος έλεγχος).
Κανόνας: ένα «κύριο» εργαλείο + ελαφρύ CLI για στυλό καπνού σε PR.
10) Παραδείγματα (snippets)
10. 1 k6 (ανοικτό μοντέλο με τιμή άφιξης)
js import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'ramping-arrival-rate',
startRate: 200, timeUnit: '1s',
preAllocatedVUs: 200, maxVUs: 2000,
stages: [
{ target: 500, duration: '5m' }, // до 500 rps
{ target: 800, duration: '5m' }, // стресс
{ target: 0, duration: '1m' }
]
}
},
thresholds: {
http_req_duration: ['p(95)<300', 'p(99)<800'],
http_req_failed: ['rate<0.005'],
},
};
export default function () {
const res = http.get(`${__ENV.BASE_URL}/api/catalog?limit=20`);
sleep(Math.random() 2); // think-time
}
10. 2 JMeter (ιδέα προφίλ)
Thread Group + Stepping Thread или Concurrency Thread (open-like).
Προκαθορισμένες αιτήσεις HTTP, διαχειριστής Cookie, σύνολο δεδομένων CSV.
Backend ακροατής → InfluxDB/Grafana; Ισχυρισμοί ανά χρόνο/κωδικό.
10. Ακρίδες (Python)
python from locust import HttpUser, task, between class WebUser(HttpUser):
wait_time = between(0.2, 2.0)
@task(5)
def browse(self): self.client.get("/api/catalog?limit=20")
@task(1)
def buy(self): self.client.post("/api/checkout", json={"sku":"A1","qty":1})
11) Στοιχεία, συσχέτιση, προετοιμασία
Δεδομένα σπόρων: κατάλογοι, χρήστες, ισοζύγια, μάρκες - όπως στις πωλήσεις.
Μάσκα PII/ανωνυμοποίηση; δημιουργία συνθετικών πάνω από πραγματικές διανομές.
Συσχέτιση: Εξαγωγή ταυτοτήτων/σημάτων από απαντήσεις (RegExp/JSONPath) και χρήση σε μεταγενέστερα στάδια.
12) Παρατηρησιμότητα κατά τις διαδρομές
Ταμπλό RED (τιμή, σφάλματα, διάρκεια) κατά μήκος των διαδρομών.
Υποδείγματα - μετάβαση από τις μετρήσεις στα ίχνη (trace_id).
Αρχεία καταγραφής σφαλμάτων: δειγματοληψία + συσσώρευση, αντίγραφα/ταυτότητα.
Σύστημα: CPU/GC/σωρός, δίσκοι/δίκτυο, αναμονή πισίνας.
DB: top queries, locks, index scans, bloat.
13) Πύλες αυτοματισμού και επιδόσεων
CI: σύντομες διαδρομές συγχώνευσης (π.χ. k6 2-3 λεπτά) με κατώφλια.
Νυχτερινή/εβδομαδιαία: μακρύς εμποτισμός/πίεση σε ξεχωριστό μέσο. εκθέσεις και τάσεις.
Canary κυκλοφορίες: ανάλυση του SLO (ποσοστό σφάλματος, p95) ως «πύλη» της προώθησης.
Οπισθοδρόμηση: γραμμή βάσης έναντι τρέχουσας κατασκευής· προειδοποίηση για επιδείνωση> X%.
14) Σχεδιασμός χωρητικότητας και κόστος
Καμπύλες throughput→latency: ορίστε το σημείο γόνατος - αφού το p99 μεγαλώσει απότομα.
Κλίμακα: Μέτρηση της απόδοσης κλιμάκωσης (δέλτα RPS/κόμβος δέλτα).
Κόστος: «RPS ανά $/ώρα», αποθεματικό για εκδηλώσεις αιχμής + αποθεματικό DR.
15) Αντι-μοτίβα
Χτυπήστε το στήριγμα χωρίς έλεγχο ή δοκιμή σε «κενό» περιβάλλον, όχι όπως το prod.
Κλειστό μοντέλο με σταθερές VU που κρύβουν υπερφόρτωση.
Έλλειψη χρόνου σκέψης/δεδομένων - μη ρεαλιστικές κρύπτες ή αντίστροφα - θύελλα στην πηγή.
Ένα σενάριο «/ping «αντί της προσαρμοσμένης ροής.
Έλλειψη παρατηρησιμότητας: «βλέπουμε μόνο RPS και μέση καθυστέρηση».
Μη ελεγχόμενες επαναλήψεις → αυτο-DDoS.
Ανάμειξη της δοκιμής και βελτιστοποιήσεις χωρίς καθορισμό υποθέσεων/αλλαγών.
16) Κατάλογος σημείων ελέγχου (0-30 ημέρες)
0- 7 ηµέρες
Καθορισμός προφίλ κυκλοφορίας SLI/SLO και στόχων (μίξη, χρόνος σκέψης, δεδομένα).
Επιλέξτε το εργαλείο (k6/JMeter/Locust), ανεβάστε τα ταμπλό RED.
Προετοιμασία των δεδομένων για το περίπτερο και τους σπόρους, απενεργοποίηση των ορίων/captchas τρίτων.
8-20 ημέρες
Σενάρια κατασκευής: ανοικτό μοντέλο (ποσοστό άφιξης), κρύο/ζεστό/ζεστό κρύπτη.
Τρέξιμο φορτίου → ακραίες τάσεις → ακίδα· να καθορίζουν το σημείο του γόνατος και τα σημεία συμφόρησης.
Εφαρμογή πυλών επιδόσεων σε ΚΚΠ (μικρο-run).
21- 30 ηµέρες
Δοκιμή εμποτισμού 4-24 ώρες: διαρροές GC/μετατόπιση, σταθεροποίηση.
Όρια εγγράφων, σχέδιο χωρητικότητας, εικονογραφήσεις «RPS→p95/oshibki».
Προετοιμασία του runbook «πώς να αυξήσει τα όρια/κλίμακα» και «πώς να υποβαθμιστεί».
17) Μετρήσεις διάρκειας
Υπάρχουν ρεαλιστικά προφίλ (μείγμα, χρόνος σκέψης, δεδομένα) που καλύπτουν ≥ το 80% της κίνησης.
Τα RED ταμπλό + ιχνηλάτηση συνδέονται για όλες τις δοκιμές.
Οι πύλες επιδόσεων μπλοκάρουν τις εκλύσεις κατά την οπισθοδρόμηση p95/σφάλματα.
Η χωρητικότητα και το σημείο γόνατος τεκμηριώνονται από βασικές υπηρεσίες.
Το μηνιαίο εμποτισμό/άγχος τρέχει και εκθέσεις προόδου.
Η αντοχή στην «ακίδα» επιβεβαιώνεται από την αυτόματη κλίμακα και την απουσία βλάβης του καταρράκτη.
18) Συμπέρασμα
Η δοκιμή φορτίου είναι μια τακτική τεχνική πρακτική, όχι μια εφάπαξ "μέτρηση. "Μοντέλο πραγματικών χρηστών (ανοικτό μοντέλο), μέτρηση τι αντανακλά την εμπειρία του πελάτη (SLI/SLO), διατήρηση της παρατηρησιμότητας και των πυλών σε CI/CD, διεξαγωγή τρεξίματος στρες/ακίδα/μούσκεμα και διόρθωση του σημείου γόνατος. Στη συνέχεια, τα γεγονότα αιχμής και οι μαύροι κύκνοι μετατρέπονται σε διαχειρίσιμα σενάρια, και η απόδοση μετατρέπεται σε μια προβλέψιμη και μετρήσιμη παράμετρο της πλατφόρμας σας.