Μια φόρμα που εμφανίζεται σε λιγότερο από ένα δευτερόλεπτο σε τοπικό δίκτυο χρειάζεται πέντε δευτερόλεπτα μέσω VPN, ενώ η αντιγραφή αρχείου στην ίδια ζεύξη τρέχει με πλήρη ταχύτητα. Η διαφορά δεν είναι το εύρος ζώνης. Η φόρμα περιμένει μια ακολουθία απαντήσεων και πληρώνει ολόκληρη τη μετάβαση σε κάθε βήμα, ενώ η αντιγραφή αρχείου κρατά τα byte συνεχώς σε κίνηση. Μετρήστε αυτές τις αναμονές πριν αγγίξετε τη γραμμή πρόσβασης.

Το σύμπτωμα είναι μια οθόνη, όχι ένα ερώτημα

Κάθε ερώτημα σε αυτή την οθόνη μπορεί να είναι γρήγορο και η οθόνη να παραμένει αργή, γιατί το σύνολο είναι το άθροισμα των αναμονών και όχι το άθροισμα των χρόνων εκτέλεσης. Μια δήλωση που εκτελείται σε δύο χιλιοστά του δευτερολέπτου κοστίζει ακόμα μια ολόκληρη μετάβαση όταν ο πελάτης πρέπει να λάβει το αποτέλεσμά της πριν στείλει την επόμενη. Σε μια διαδρομή με καθυστέρηση σαράντα χιλιοστών του δευτερολέπτου, εκατό εξαρτημένες κλήσεις αθροίζονται σε περίπου τέσσερα δευτερόλεπτα πριν ξεκινήσει οποιαδήποτε εργασία απόδοσης. Αυτή η αριθμητική είναι ένα μοντέλο της αναμονής, όχι μια μέτρηση της ζεύξης σας.

Γι' αυτό μια δοκιμή ταχύτητας φαίνεται αθώα. Η μαζική μεταφορά μετρά τη ρυθμοαπόδοση, μια ομιλητική φόρμα μετρά την καθυστέρηση, και ένα VPN μπορεί να είναι εξαιρετικό στο ένα και συνηθισμένο στο άλλο. Επομένως η διάγνωση της οθόνης σημαίνει μέτρηση της οθόνης και όχι της ζεύξης.

Καταγράψτε τον χρόνο από άκρη σε άκρη μιας ενέργειας χρήστη πριν αλλάξετε οτιδήποτε. Αυτός ο αριθμός είναι η μόνη γραμμή βάσης που μπορεί να σας πει αν μια μεταγενέστερη διόρθωση λειτούργησε.

Μετρήστε τις διαδοχικές αναμονές σε μία ενέργεια χρήστη

Μετρήστε στον πελάτη αντί να μαντεύετε. Στο psql το \timing on εκτυπώνει τον χρόνο που πέρασε για κάθε δήλωση, και το EXPLAIN (ANALYZE, BUFFERS) δείχνει πόσο από αυτόν τον χρόνο ξόδεψε πραγματικά ο διακομιστής στη δουλειά.

Η διαφορά μεταξύ αυτών των δύο αριθμών είναι το δίκτυο και το κόστος του πελάτη σας. Αν μια δήλωση εκτελείται σε δύο χιλιοστά του δευτερολέπτου και ο πελάτης καταγράφει εξήντα, τα υπόλοιπα πενήντα οκτώ είναι ταξίδι και τοπική επεξεργασία, και κανένα ευρετήριο δεν θα τα αφαιρέσει. Επαναλάβετε αυτή τη σύγκριση για κάθε δήλωση που εκδίδει η οθόνη και προσθέστε τις διαφορές και όχι τους χρόνους εκτέλεσης.

Γράψτε το αποτέλεσμα ως πλήθος διαδοχικών αναμονών. Αυτό είναι το μέγεθος που μπορούν να μειώσουν οι επόμενες δύο ενότητες, και είναι ένας αριθμός για τον οποίο μπορείτε να επιχειρηματολογήσετε με στοιχεία.

Ομαδοποιήστε τις ανεξάρτητες κλήσεις, κρατήστε τις εξαρτημένες

Δύο δηλώσεις που δεν διαβάζουν η μία τα αποτελέσματα της άλλης μπορούν να ταξιδέψουν μαζί και να συλλεχθούν μία φορά, κάτι που μετατρέπει δύο αναμονές σε μία. Δύο δηλώσεις όπου η δεύτερη χρειάζεται την τιμή της πρώτης δεν μπορούν, γιατί η εξάρτηση είναι πραγματική και η ομαδοποίηση θα άλλαζε το τι κάνει το πρόγραμμα. Ταξινομήστε τις κλήσεις σε αυτούς τους δύο σωρούς πριν ξαναγράψετε οτιδήποτε, και το μέγεθος κάθε σωρού σας λέει τι είναι δυνατόν.

Η εργασία με σύνολα αφαιρεί τις αναμονές πιο διεξοδικά από την ομαδοποίηση. Ένα ερώτημα που επιστρέφει τις γραμμές που ένας βρόχος έφερνε μία κάθε φορά εξαλείφει τον βρόχο καθώς και τις μεταβάσεις. Ψάξτε πρώτα τον βρόχο, γιατί συνήθως είναι το μεγαλύτερο κέρδος και η ευκολότερη αλλαγή για έλεγχο.

Μια ομάδα πρέπει ακόμα να διατηρεί τη διαχείριση σφαλμάτων και τα όρια συναλλαγών. Η συνένωση άσχετων δηλώσεων σε ένα κείμενο δεν είναι ασφαλής βελτιστοποίηση, και μια ομάδα που κρύβει μια αποτυχημένη δήλωση πίσω από μια επιτυχημένη υποβολή είναι χειρότερη από τις αναμονές που εξοικονόμησε.

Επαναχρησιμοποιήστε τις συνδέσεις πριν αγοράσετε εύρος ζώνης

Μια νέα σύνδεση κοστίζει ανάλυση ονόματος, χειραψία TCP, διαπραγμάτευση TLS και πιστοποίηση, και σε μια διαδρομή υψηλής καθυστέρησης καθεμία από αυτές είναι άλλη μια μετάβαση πριν εκτελεστεί το πρώτο ερώτημα. Οι ομάδες συνδέσεων υπάρχουν για να πληρώνεται αυτό το κόστος μία φορά ανά διεργασία και όχι μία φορά ανά κλήση.

Στο ADO.NET, το κλείσιμο ή η απόρριψη μιας συγκεντρωμένης σύνδεσης την επιστρέφει για επαναχρησιμοποίηση αντί να ανοίξει μια νέα φυσική, οπότε το μοτίβο που μοιάζει με διαρροή είναι συχνά η σωστή χρήση. Επαληθεύστε ότι η ομάδα χρησιμοποιείται πραγματικά αντί να το υποθέσετε: καταγράψτε τη δημιουργία φυσικών συνδέσεων ή παρακολουθήστε τον αριθμό συνεδριών στον διακομιστή όσο τρέχει η οθόνη. Οι οδηγίες απόδοσης SQL λένε το ίδιο για τη μείωση των μεταβάσεων και την ομαδοποίηση συχνών ad hoc κλήσεων, με παραδείγματα ειδικά για την υπηρεσία που πρέπει να αντιστοιχίσετε στην ανάπτυξή σας.

Η συγκέντρωση αφαιρεί το κόστος εγκατάστασης και αφήνει τις διαδοχικές αναμονές ερωτημάτων ανέγγιχτες. Είναι προϋπόθεση για μια καθαρή μέτρηση και όχι διόρθωση από μόνη της.

Ζυγίστε τη μετακίνηση της εκτέλεσης πιο κοντά στα δεδομένα

Η εκτέλεση της εφαρμογής κοντά στη βάση δεδομένων αντικαθιστά πολλές απομακρυσμένες ανταλλαγές με τη βάση με μία απομακρυσμένη συνεδρία προβολής. Για ένα ομιλητικό φορτίο αυτό μπορεί να είναι μεγάλη αλλαγή, και είναι λειτουργική αλλαγή όσο και αλλαγή απόδοσης: η διαχείριση συνεδριών, ο έλεγχος πρόσβασης, η ανάπτυξη λογισμικού και η εμπειρία χρήστη μετακινούνται όλα μαζί με την εφαρμογή.

Μετρήστε την πραγματική διεπαφή και τα δεδομένα που μεταφέρει πριν υποθέσετε ότι οποιαδήποτε κατεύθυνση είναι ταχύτερη. Μια απομακρυσμένη συνεδρία επιφάνειας εργασίας μετακινεί pixel, και μια οθόνη με πυκνά γραφικά μπορεί να αποδώσει χειρότερα στην ίδια διαδρομή από τα ερωτήματα που αντικατέστησε, ειδικά όταν ο πελάτης ξαναζωγραφίζει συνεχώς.

Στη συνέχεια επαναλάβετε την αρχική ενέργεια και συγκρίνετε τρεις αριθμούς: διαδοχικές αναμονές, όγκο αποτελεσμάτων και χρόνο ολοκλήρωσης από άκρη σε άκρη. Μια βελτίωση που αλλάζει τη μετρούμενη εργασία χρήστη διατηρώντας την ορθότητα των δεδομένων και την πολιτική πρόσβασης είναι αυτή που αξίζει να κρατήσετε.

Σχετικά άρθρα