Όλα ξεκινούν από ένα ερώτημα: τι κάνουν αυτοί οι χρήστες; Χίλια άτομα συνδεδεμένα σε μια εφαρμογή δεν κάνουν χίλια αιτήματα το δευτερόλεπτο, και μια σελίδα που εξυπηρετείται από cache κοστίζει εκατό φορές λιγότερο από μια σελίδα που υπολογίζεται. Ο οδηγός αυτός μετατρέπει τους χρήστες σε αιτήματα, τα αιτήματα σε επεξεργαστή και μνήμη, και έπειτα δείχνει πώς να το επαληθεύσετε με μια δοκιμή φορτίου.
Οι «ταυτόχρονοι χρήστες» σημαίνουν τρία διαφορετικά μεγέθη, ανάλογα με το ποιος μιλά:
Περνάμε από το ένα στο άλλο με τον νόμο του Little: ο αριθμός των αιτημάτων σε εξέλιξη ισούται με τη ροή, σε αιτήματα ανά δευτερόλεπτο, πολλαπλασιασμένη με τη μέση διάρκεια ενός αιτήματος.
Παράδειγμα. 600 ενεργοί χρήστες την ίδια στιγμή, που ο καθένας στέλνει ένα αίτημα κάθε 20 δευτερόλεπτα, κάνουν 30 αιτήματα το δευτερόλεπτο. Αν κάθε αίτημα διαρκεί 100 ms, ο διακομιστής έχει κατά μέσο όρο μόλις 3 αιτήματα σε εξέλιξη. Το διακύβευμα βρίσκεται αλλού: στις αιχμές και στα αργά αιτήματα.
Ένα αίτημα απασχολεί τον επεξεργαστή όσο διαρκεί ο υπολογισμός του: εκτέλεση του κώδικα, ερώτημα στη βάση, κατασκευή της απάντησης. Ένα vCPU επεξεργάζεται λοιπόν το πολύ 1.000 ÷ t αιτήματα το δευτερόλεπτο, όπου t είναι ο χρόνος υπολογισμού ενός αιτήματος σε χιλιοστά του δευτερολέπτου. Ο χρόνος αναμονής (ένα εξωτερικό API, ένας δίσκος) δεν απασχολεί τον επεξεργαστή, απασχολεί όμως έναν worker.
| Είδος αιτήματος | Τυπικός χρόνος υπολογισμού | Ανά vCPU, τάξη μεγέθους |
|---|---|---|
| Στατικό αρχείο, ή σελίδα από cache | Κάτω από 1 ms | Αρκετές χιλιάδες αιτήματα το δευτερόλεπτο |
| Σελίδα WordPress από cache σελίδων | 1 έως 5 ms | Αρκετές εκατοντάδες το δευτερόλεπτο |
| API JSON (Node.js, Go, FastAPI) με ένα ερώτημα SQL σε ευρετήριο | 5 έως 20 ms | 50 έως 200 το δευτερόλεπτο |
| Σελίδα WordPress ή Laravel που υπολογίζεται σε κάθε επίσκεψη | 100 έως 300 ms | 3 έως 10 το δευτερόλεπτο |
| Αναφορά, εξαγωγή, δημιουργία PDF | 500 ms έως αρκετά δευτερόλεπτα | Λιγότερα από 2 το δευτερόλεπτο |
Με αυτές τις τάξεις μεγέθους, 30 αιτήματα API το δευτερόλεπτο με 10 ms υπολογισμού απασχολούν το 30 % ενός μόνο vCPU. Τα ίδια 30 αιτήματα το δευτερόλεπτο σε σελίδες WordPress χωρίς cache ζητούν 3 έως 9 vCPU. Η cache σελίδων υπάρχει ακριβώς για να μεταφέρει μια σελίδα από την τέταρτη γραμμή του πίνακα στη δεύτερη.
Κάθε αίτημα σε εξέλιξη το αναλαμβάνει ένας worker, και οι workers καταλαμβάνουν μνήμη, είτε δουλεύουν είτε όχι. Συχνά η μνήμη, περισσότερο από τον επεξεργαστή, καθορίζει πόσα αιτήματα επεξεργάζονται παράλληλα:
pm.max_children ορίζει το ανώτατο όριο: 20 διεργασίες σημαίνουν 800 MB έως 1,6 GB.max_connections.Οι μόνιμες συνδέσεις (websockets, ειδοποιήσεις σε πραγματικό χρόνο) μετρούν χωριστά: ανοιχτές διαρκώς, καταναλώνουν λίγο επεξεργαστή και μερικές δεκάδες kilobyte μνήμης η καθεμία. Ένας διακομιστής Node.js κρατά χιλιάδες από αυτές σε μερικές εκατοντάδες MB.
Σε μια πραγματική εφαρμογή, ο διακομιστής σπάνια φτάνει στον κορεσμό εκεί που το περιμένει κανείς. Οι πιο συχνές αιτίες, με τη σειρά που αξίζει να τις αναζητήσετε:
pg_stat_statements στην PostgreSQL, ή το αρχείο αργών ερωτημάτων της MySQL, το εντοπίζει.Οι τάξεις μεγέθους δίνουν ένα πρώτο μέγεθος. Μια δοκιμή φορτίου δίνει το πραγματικό. Η αρχή: προσομοιώνετε όλο και περισσότερους χρήστες σε ένα αντίγραφο της εφαρμογής, και σημειώνετε τη στιγμή που ο χρόνος απόκρισης εκτινάσσεται.
wrk -t2 -c50 -d30s --latency https://preprod.i-istoselida-sas.com/
Για μια πλήρη διαδρομή (σύνδεση, περιήγηση, αναζήτηση), το k6 περιγράφει ένα σενάριο σε JavaScript και ανεβάζει το φορτίο σταδιακά:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 300 },
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
export default function () {
http.get('https://preprod.i-istoselida-sas.com/');
sleep(15);
}
htop για τον επεξεργαστή, free -h για τη μνήμη, τα αρχεία καταγραφής για τα σφάλματα.Η σειρά που κοστίζει λιγότερο και αποδίδει περισσότερο:
Τα τρία πρώτα βήματα καλύπτουν τη μεγάλη πλειονότητα των επιχειρηματικών εφαρμογών, των ιστοσελίδων και των API: αρκετές εκατοντάδες ενεργοί χρήστες την ίδια στιγμή χωρούν σε έναν μόνο, καλά ρυθμισμένο διακομιστή.
Το VPS Pro διατίθεται σε έξι μεγέθη, σε επεξεργαστές Intel Xeon, μνήμη ECC και NVMe SSD σε κατοπτρισμό, και περνά στο επόμενο μέγεθος οποιαδήποτε στιγμή, χωρίς επανεγκατάσταση. Η Ολοκληρωμένη υποστήριξη περιλαμβάνεται: πείτε μας πόσους χρήστες περιμένετε στην έναρξη και σε έναν χρόνο, και σας προτείνουμε το μέγεθος. Και όταν μια σελίδα επιβραδύνεται, κάνουμε τη διάγνωση και σας λέμε τι να κάνετε, από το σύστημα έως τον κώδικα της εφαρμογής σας.
Για ένα API ή μια εφαρμογή της οποίας τα αιτήματα χρειάζονται 10 έως 20 ms υπολογισμού, αρκετές εκατοντάδες ενεργούς χρήστες την ίδια στιγμή. Για μια ιστοσελίδα WordPress χωρίς cache σελίδων, περίπου εκατό. Η διαφορά οφείλεται στον χρόνο υπολογισμού κάθε αιτήματος και στην cache, και γι’ αυτό αξίζει μια δοκιμή φορτίου.
Ο αριθμός επισκεπτών ανά ημέρα λέει λίγα: αυτό που μετράει είναι η αιχμή. Για να περάσετε από το ένα στο άλλο, διαιρέστε τις επισκέψεις της ημέρας με τις ώρες δραστηριότητας, πολλαπλασιάστε με τις σελίδες ανά επίσκεψη, και έπειτα με έναν συντελεστή αιχμής από 3 έως 5. 10.000 επισκέψεις σε 10 ώρες, με 4 σελίδες η καθεμία, δίνουν περίπου 1 σελίδα το δευτερόλεπτο κατά μέσο όρο, και 3 έως 5 στην αιχμή.
Τρία σημάδια: ο χρόνος απόκρισης ανεβαίνει μαζί με την κίνηση, ο επεξεργαστής μένει πάνω από 80 % τις ώρες αιχμής, ή η διαθέσιμη μνήμη πέφτει κοντά στο μηδέν. Τα αρχεία καταγραφής του διακομιστή web δείχνουν τότε σφάλματα 502 ή 504, και τα αιτήματα περιμένουν έναν ελεύθερο worker.
Ναι: μια σύνδεση websocket μένει ανοιχτή διαρκώς. Καταναλώνει λίγο επεξεργαστή και μερικές δεκάδες kilobyte μνήμης. Ένας διακομιστής Node.js κρατά χιλιάδες από αυτές. Τα μηνύματα που αποστέλλονται, περισσότερο από τις ανοιχτές συνδέσεις, είναι αυτά που φορτώνουν τον επεξεργαστή.
Simafri
Ας μιλήσουμε για την ιστοσελίδα σας
Πείτε μας με λίγα λόγια για το έργο σας: θα επικοινωνήσουμε σύντομα μαζί σας.
Ευχαριστούμε! Το αίτημά σας εστάλη. Θα επικοινωνήσουμε σύντομα μαζί σας.
Προτιμάτε email; Γράψτε μας στο support@simafri.com.