Μετάβαση στο περιεχόμενο
EuroVPSEuroVPS
Περιοχή πελατών

Τους είπαμε να μην αγοράσουν περισσότερη RAM.

Ένα e-shop οικιακών ειδών είχε ένα πρωί με σφάλματα «too many connections». Η προφανής λύση ήταν περισσότερη RAM. Τα δεδομένα είπαν μην τα ξοδέψετε: το working set χωρούσε ήδη στη μνήμη, και η απάντηση βρισκόταν στους κανόνες της ίδιας της εφαρμογής.

Από EuroVPS EngineeringΤο μηχανοστάσιο

5 λεπτά ανάγνωσης
Σε αυτό το άρθρο 3 ενότητες
Εν συντομία
  • Η βάση δεδομένων ενός e-shop οικιακών ειδών άρχισε να επιστρέφει ERROR 1040: Too many connections ένα πρωί, αμέσως μόλις γέμισε ο χώρος των temp tables.
  • Η προφανής λύση ήταν περισσότερη RAM: μια βάση μεγαλύτερη από το buffer pool της μοιάζει να πεινάει. Η αύξηση του pool θα κόστιζε χρήματα και δεν θα διόρθωνε τίποτα.
  • Η μέτρηση το ανέτρεψε. Το buffer pool πετύχαινε το cache σχεδόν κάθε φορά και είχε ακόμη χώρο. Το working set ήταν ήδη στη μνήμη.
  • Η πραγματική αιτία ήταν ένας πίνακας κανόνων εκπτώσεων που είχε μεγαλώσει πολύ πέρα από ό,τι χρειαζόταν το κατάστημα. Η διόρθωση ήταν στους κανόνες της εφαρμογής, όχι σε περισσότερη RAM.

Ξεκίνησε ως ένα πρωί με σφάλματα σύνδεσης. Ο χώρος των temp tables, σε tmpfs, είχε γεμίσει, και δευτερόλεπτα αργότερα η βάση άρχισε να απαντά ERROR 1040: Too many connections. Ο μηχανικός μας σε ετοιμότητα το είχε στην οθόνη μέσα σε λίγα λεπτά, και το δουλέψαμε μαζί με τους developers του καταστήματος από την αρχή.

THE MORNING, IN TWO LINES
temp-table space (tmpfs) ........ FULL
… seconds later …
mysqld: ERROR 1040 (HY000): Too many connections

Η ακριβή απάντηση, και γιατί την αφήσαμε στην άκρη

THE REFLEX THAT LOOKS LIKE PROGRESS

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

Η ΑΚΡΙΒΗ ΑΠΑΝΤΗΣΗΤΙ ΕΙΠΑΝ ΤΑ ΔΕΔΟΜΕΝΑ
Η βάση είναι μεγαλύτερη από το pool. Μεγαλώστε το pool.Ο λόγος cache-hit ήταν σχεδόν τέλειος. Το working set ζούσε ήδη στη μνήμη.
Ένα μεγαλύτερο cache διορθώνει την υπερχείλιση.Το pool είχε ήδη αχρησιμοποίητο χώρο. Περισσότερη RAM θα έβαζε στο cache δεδομένα που ήταν ήδη στο cache.
ΤΑ ΔΕΔΟΜΕΝΑ ΚΕΡΔΙΣΑΝΠροσθέστε hardware, πρόβλημα λυμένο.Ο υπερμεγέθης πίνακας συνεχίζει να μεγαλώνει πίσω από το μεγαλύτερο pool μέχρι να ξαναϋπερχειλίσει.

Δύο μετρήσεις το έκριναν. Το buffer pool σχεδόν ποτέ δεν αστοχούσε, και είχε ακόμη ελεύθερες σελίδες. Μαζί λένε ένα πράγμα: το working set χωρούσε ήδη ολόκληρο στη μνήμη. Δεν υπήρχαν δεδομένα που περίμεναν στον δίσκο για να τα κρατήσει ένα μεγαλύτερο cache.

Η πραγματική αιτία ήταν στα μεγέθη των πινάκων

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

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

WHERE THE SPACE WENT
# table name is an illustrative rename.
> table sizes, largest first
discount_rule_combinations   largest table by a wide margin
  ↳ generated from the active discount rules
  ↳ combinations grow with the SQUARE of the rule count

Η πειθαρχημένη απάντηση και η ακριβή απάντηση έδειχναν σε αντίθετες κατευθύνσεις

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

Το μηχάνημα δεν ήταν ποτέ το πρόβλημα. Τα δεδομένα έδειξαν ότι το working set χωρούσε ήδη στη μνήμη, οπότε η διόρθωση ήταν στους κανόνες της εφαρμογής, όχι σε περισσότερη RAM. Το πιο χρήσιμο πράγμα που μπορούσαμε να δώσουμε σε αυτόν τον πελάτη δεν ήταν περισσότερο από το hardware μας. Ήταν ένας λόγος να μην το αγοράσει.

“Μερικές φορές το πιο πολύτιμο πράγμα που μπορεί να σας πει ένας πάροχος είναι: μην ξοδέψετε τα χρήματα.”

ΤΟ ΜΑΘΗΜΑ

Ευθείες απαντήσεις

Η βάση μου έβγαλε «ERROR 1040: Too many connections». Να αυξήσω το όριο συνδέσεων;+

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

Να προσθέσω περισσότερη RAM αν η βάση μου είναι μεγαλύτερη από το buffer pool μου;+

Όχι μόνο με αυτό το δεδομένο. Ο αριθμός που το κρίνει είναι το ποσοστό επιτυχίας του buffer pool, όχι το μέγεθος στον δίσκο. Αν το pool πετυχαίνει ήδη σχεδόν κάθε φορά και έχει ελεύθερες σελίδες, το working set χωράει στη μνήμη και η επιπλέον RAM θα έβαζε στο cache δεδομένα που είναι ήδη εκεί.

Ποιος είναι ένας φυσιολογικός λόγος επιτυχίας του InnoDB buffer pool;+

Πάνω από 99 τοις εκατό μόλις το working set χωρέσει στη μνήμη. Αν το pool είναι ήδη εκεί και έχει ακόμη ελεύθερες σελίδες, ένα μεγαλύτερο pool δεν αγοράζει τίποτα. Κοιτάξτε τα queries.

Γιατί ο χώρος των temp tables της MySQL μου γεμίζει συνέχεια;+

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

Θα μου πει η EuroVPS να μην αγοράσω μια αναβάθμιση;+

Ναι, όταν τα δεδομένα λένε ότι η αναβάθμιση δεν διορθώνει τίποτα. Προτιμάμε να εντοπίσουμε την πραγματική αιτία παρά να σας πουλήσουμε hardware που την κρύβει. Σε αυτή την περίπτωση η ειλικρινής απάντηση ήταν: μη μεγαλώσετε το buffer pool, τακτοποιήστε τους κανόνες.

Πριν αγοράσετε την αναβάθμιση, αφήστε μας να διαβάσουμε τους αριθμούς.

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

Μιλήστε με έναν μηχανικό

Φτάσατε στο τέλος.

Βάλτε την ανάγνωση σε εφαρμογή

Τι τρέχετε;

Πείτε μας για τον φόρτο εργασίας, την κίνηση και τις απαιτήσεις ανάκαμψης. Ξεκινήστε από το εργαλείο διαμόρφωσης server ή συζητήστε τις λεπτομέρειες με έναν μηχανικό.

Γραμμένο από τους μηχανικούς που χτίζουν και λειτουργούν την υποδομή που περιγράφει.
Μιλήστε με έναν μηχανικό
XIn

5 λεπτά ακόμη