Σήμερα ο ιστότοπος έχει κολλήσει ξανά και βρίσκεται μεγάλος αριθμός ύπνου
Αιτίες ύπνου:
1 Το πρόγραμμα-πελάτης δεν κάλεσε το mysql_close() πριν από την έξοδο.
2 Ο πελάτης κοιμόταν περισσότερο από wait_timeout ή interactive_timeout δευτερόλεπτα χωρίς να υποβάλει κανένα αίτημα στον διακομιστή.
3 Το πρόγραμμα πελάτη τερματίστηκε απότομα στη μέση μιας μεταφοράς δεδομένων
Εάν ο αριθμός των διεργασιών ύπνου την ίδια περίοδο είναι πολύ υψηλός και ο συνολικός αριθμός συνδέσεων σε άλλες καταστάσεις υπερβαίνει την τιμή max_connection, τότε η MySQL δεν μπορεί πλέον να επεξεργαστεί κανένα αίτημα εκτός από τον χρήστη root, δεν μπορεί να δημιουργήσει σύνδεση με οποιοδήποτε αίτημα ή κολλάει απευθείας
Λύση:
1. Πρώτα, ελέγξτε εάν το πρόγραμμά σας χρησιμοποιεί τη μέθοδο pconnect και, δεύτερον, ελέγξτε εάν το mysql_close() καλείται εγκαίρως πριν από την εκτέλεση της σελίδας. Προσπαθήστε να μην χρησιμοποιείτε τη μέθοδο pconnect, δηλαδή να χρησιμοποιείτε mysql_connect. Όταν εκτελείται το πρόγραμμα, θα πρέπει να γίνεται ρητή επίκληση του mysql_close
2. Προσθέστε wait_timeout και interactive_timeout στο my.cnf, ορίστε την τιμή μικρότερη, από προεπιλογή η τιμή wait_timeout είναι 8 ώρες, μπορείτε να την αλλάξετε σε 1 ώρα ή μισή ώρα. Με αυτόν τον τρόπο η mysql θα σκοτώσει τις νεκρές συνδέσεις πιο γρήγορα. Αποτρέψτε τον συνολικό αριθμό συνδέσεων να υπερβεί την τιμή max_connection.
wait_timeout πολύ μεγάλο θα προκαλέσει την έγκαιρη κυκλοφορία μεγάλου αριθμού διεργασιών SLEEP στη MySQL, μειώνοντας την απόδοση του συστήματος, αλλά εάν οι ρυθμίσεις είναι πολύ μικρές, ενδέχεται να αντιμετωπίσετε προβλήματα όπως "Η MySQL έχει φύγει"
Ορίστε την τιμή max_connection σε υψηλότερη τιμή, αλλά αυτό προφανώς δεν είναι κατάλληλο, όσο περισσότερες συνδέσεις έχετε, τόσο περισσότερο άγχος ασκεί στον διακομιστή σας. Στην πραγματικότητα, αυτές οι συνδέσεις είναι περιττές και η εξόντωσή τους το συντομότερο δυνατό είναι η καλύτερη πολιτική.
3. Αναλύστε το ερώτημα SQL του συστήματος βήμα προς βήμα, βρείτε την SQL που είναι πολύ αργή και βελτιστοποιήστε την
1)interactive_timeout: Σημασία παραμέτρου: Ο αριθμός των δευτερολέπτων που περιμένει ο διακομιστής για μια δραστηριότητα πριν απενεργοποιήσει τη διαδραστική σύνδεση. Ένας αλληλεπιδραστικός πελάτης ορίζεται ως ένας υπολογιστής-πελάτης που χρησιμοποιεί CLIENT_INTERACTIVE επιλογή στην mysql_real_connect(). Προεπιλογή παραμέτρου: 28800 δευτερόλεπτα (8 ώρες)
(2)wait_timeout: Σημασία παραμέτρου: Ο αριθμός των δευτερολέπτων που περιμένει ο διακομιστής για δραστηριότητα πριν κλείσει τη μη αλληλεπιδραστική σύνδεση. Κατά την έναρξη του νήματος, η τιμή wait_timeout συνεδρίας αρχικοποιείται με βάση την τιμή του καθολικού wait_timeout ή του καθολικού interactive_timeout, ανάλογα με τον τύπο πελάτη (που ορίζεται CLIENT_INTERACTIVE τις επιλογές σύνδεσης του mysql_real_connect()). Προεπιλογή παραμέτρου: 28800 δευτερόλεπτα (8 ώρες)
Υπάρχει ένα ανώτατο όριο στον μέγιστο αριθμό συνδέσεων που μπορεί να υποστηρίξει ο MySQL Server, καθώς κάθε σύνδεση δημιουργείται και καταναλώνει μνήμη, οπότε αναμένουμε από τους πελάτες να αποσυνδέσουν και να ελευθερώσουν την κατειλημμένη μνήμη μετά τη σύνδεση στον MySQL Server για να χειριστούν την αντίστοιχη λειτουργία. Εάν ο MySQL Server σας έχει μεγάλο αριθμό αδρανών συνδέσεων, όχι μόνο θα καταναλώνουν μάταια μνήμη, αλλά εάν οι συνδέσεις συνεχίσουν να συσσωρεύονται και να ανοίγουν, θα φτάσουν τελικά τον μέγιστο αριθμό συνδέσεων στον MySQL Server, ο οποίος θα αναφέρει το σφάλμα «πάρα πολλές συνδέσεις». Η ρύθμιση της τιμής του wait_timeout θα πρέπει να κρίνεται ανάλογα με τη λειτουργία του συστήματος. Αφού το σύστημα λειτουργεί για κάποιο χρονικό διάστημα, μπορείτε να ελέγξετε την κατάσταση σύνδεσης του τρέχοντος συστήματος μέσω της εντολής show processlist, εάν βρείτε μεγάλο αριθμό συνδεδεμένων διεργασιών σε κατάσταση αναστολής λειτουργίας, σημαίνει ότι η ρύθμιση παραμέτρων είναι πολύ μεγάλη και μπορείτε να κάνετε τις κατάλληλες προσαρμογές για να κάνετε μικρότερες προσαρμογές.
Εντολή SQL:
Αυτή η μέθοδος τροποποίησης είναι σεΜετά την επανεκκίνηση της υπηρεσίας mysql, δεν θα είναι έγκυρη, επομένως είναι καλύτερο να διαμορφώσετε αυτές τις δύο ιδιότητες στο αρχείο διαμόρφωσης mySQL.
Τροποποιήστε το αρχείο my.cnf στο Linux:
|