Αρχική σελίδα » πως να » Διάγνωση προβλημάτων φόρτωσης διακομιστή Linux με απλό σενάριο

    Διάγνωση προβλημάτων φόρτωσης διακομιστή Linux με απλό σενάριο

    Εάν έχετε διαχειριστής για οποιοδήποτε χρονικό διάστημα, έχετε ανακαλύψει σίγουρα καταστάσεις όπου ένας διακομιστής αιχμηρά στη χρήση της CPU ή τη χρήση της μνήμης και / ή τα επίπεδα φόρτωσης. Η εκτέλεση "κορυφής" δεν θα σας δώσει πάντα την απάντηση. Λοιπόν, πώς βρίσκετε εκείνες τις ύπουλες διαδικασίες που μαζεύουν τους πόρους του συστήματός σας για να μπορέσετε να τους σκοτώσετε?

    Το παρακάτω σενάριο μπορεί να βοηθήσει. Γράφτηκε για έναν διακομιστή ιστού, έτσι έχουν μερικά μέρη του που ψάχνουν ειδικά για httpd διαδικασίες και μερικά μέρη που ασχολούνται με MySQL. Ανάλογα με την ανάπτυξη του διακομιστή σας, απλά σχολιάστε / διαγράψτε αυτές τις ενότητες και προσθέστε άλλες. Θα πρέπει να χρησιμοποιείται ως σημείο εκκίνησης.

    Προϋποθέσεις για αυτήν την έκδοση του σεναρίου είναι κάποιο δωρεάν λογισμικό που κυκλοφορεί υπό την Γενική Δημόσια Άδεια GNU που ονομάζεται mytop (διαθέσιμο στο http://jeremy.zawodny.com/mysql/mytop/) το οποίο είναι ένα φανταστικό εργαλείο για τον έλεγχο της απόδοσης του MySQL. Είναι παλιά, αλλά εξακολουθεί να λειτουργεί εξαιρετικά για τους σκοπούς μας εδώ.
    Επιπλέον, χρησιμοποιώ το mutt ως mailer - ίσως θελήσετε να αλλάξετε τη δέσμη ενεργειών για να χρησιμοποιήσετε απλώς το Linux που είναι ενσωματωμένο στο βοηθητικό πρόγραμμα 'mail'. Το τρέχω μέσω cron κάθε ώρα. ρυθμίστε όπως κρίνετε κατάλληλο. Ω - και αυτό το σενάριο πρέπει να τρέχει ως root, καθώς διαβάζει από ορισμένες προστατευμένες περιοχές του διακομιστή.

    Ας ξεκινήσουμε, λοιπόν?

    Αρχικά, ορίστε τις μεταβλητές δέσμης ενεργειών:

    #! / bin / bash
    # #
    # Script για να ελέγξετε το μέσο επίπεδο φόρτωσης του συστήματος για να προσπαθήσετε να το προσδιορίσετε
    # ποιες διαδικασίες το παίρνουν υπερβολικά υψηλό ...
    # #
    # 07Jul2010 tjones
    # #
    # set environment
    dt = "ημερομηνία +% d% b% Υ-% Χ"
    # Προφανώς, αλλάξτε τους ακόλουθους καταλόγους όπου βρίσκονται τα αρχεία καταγραφής σας
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / μηνύματα"
    mysqlLog = "/ var / log / mysqld.log"
    # το πρώτο ταχυδρομείο είναι το τυπικό μήνυμα ηλεκτρονικού ταχυδρομείου για τις αναφορές. Το δεύτερο είναι για κινητό τηλέφωνο (με αναλυτική αναφορά)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Τα ακόλουθα τρία είναι για τη χρήση mytop - χρησιμοποιήστε ένα χρήστη db που έχει αξιοπρεπή δικαιώματα
    dbusr = "όνομα χρήστη"
    dbpw = "κωδικός πρόσβασης"
    db = "yourdatabasename"
    # Το παρακάτω είναι το επίπεδο φόρτωσης για να ελέγξετε - το 10 είναι πραγματικά υψηλό, επομένως ίσως θέλετε να το μειώσετε.
    levelToCheck = 10

    Στη συνέχεια, ελέγξτε το επίπεδο φόρτωσης για να δείτε αν πρέπει να συνεχίσει η δέσμη ενεργειών:

    # Ορισμός μεταβλητών από το σύστημα:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

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

    αν [$ loadLevel -gt $ levelToCheck]; έπειτα
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Ημερομηνία: $ dt" >> $ tmpfile
    echo "Έλεγχος φόρτωσης συστήματος & διεργασίες" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

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

    # Βρείτε περισσότερες μεταβλητές από το σύστημα:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Εμφάνιση τρέχοντος επιπέδου φορτίου:
    echo "Το επίπεδο φόρτωσης είναι: $ loadLevel" >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile

    # Εμφάνιση του αριθμού των διαδικασιών httpd που τρέχουν τώρα (χωρίς παιδιά):
    echo "Αριθμός διαδικασιών httpd τώρα: $ httpdProcesses" >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση λίστας διεργασιών:
    echo "Οι τρέχουσες διαδικασίες:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση τρέχουσας πληροφορίας MySQL:
    echo "Αποτελέσματα από mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    Σημειώστε με την εντολή top, γράφουμε σε δύο αρχεία temp. Το ένα είναι για το πολύ μικρότερο μήνυμα στο κινητό τηλέφωνο. Αν δεν θέλετε το επείγον των ειδοποιήσεων για κινητά τηλέφωνα στις τρεις το πρωί, μπορείτε να το κάνετε αυτό (και να αφαιρέσετε τη δεύτερη ρουτίνα ταχυδρομείου αργότερα στο σενάριο).


    # Εμφάνιση τρέχουσας κορυφής:
    echo "κορυφή δείχνει τώρα:" >> $ tmpfile
    echo "κορυφή δείχνει τώρα:" >> $ topfile
    / usr / bin / κορυφή -b -n1 >> $ tmpfile
    / usr / bin / κορυφή -b -n1 >> $ topfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    Περισσότερες επιταγές:


    # Εμφάνιση τρέχουσας σύνδεσης:
    echo "netstat δείχνει τώρα:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Ελέγξτε το χώρο στο δίσκο
    echo "χώρος στο δίσκο:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

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

    # Αποστολή αποτελεσμάτων στο αρχείο καταγραφής:
    / bin / γάτα $ tmpfile >> $ logfile

    # Και τα αποτελέσματα ηλεκτρονικού ταχυδρομείου στο sysadmin:
    / usr / bin / mutt -s "$ μηχάνημα έχει υψηλό επίπεδο φόρτωσης! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    Και έπειτα κάποια καθαριότητα και έξοδος:

    # Αφαιρέστε το αρχείο temp:
    rm $ tmpfile
    rm $ topfile
    fi

    # #
    έξοδος 0

    Ας ελπίσουμε ότι αυτό βοηθά κάποιον εκεί έξω. Το πλήρως συναρμολογημένο σενάριο είναι:

    #! / bin / bash
    # #
    # Script για να ελέγξετε το μέσο επίπεδο φόρτωσης του συστήματος για να προσπαθήσετε να προσδιορίσετε ποιες είναι οι διαδικασίες
    # λαμβάνοντας υπερβολικά υψηλή ...
    # #
    # set environment
    dt = "ημερομηνία +% d% b% Υ-% Χ"
    # Προφανώς, αλλάξτε τους ακόλουθους καταλόγους όπου βρίσκονται τα αρχεία καταγραφής σας
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / μηνύματα"
    mysqlLog = "/ var / log / mysqld.log"
    # το πρώτο ταχυδρομείο είναι το τυπικό μήνυμα ηλεκτρονικού ταχυδρομείου για τις αναφορές. Το δεύτερο είναι για κινητό τηλέφωνο (με αναλυτική αναφορά)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "hostname"
    # Τα ακόλουθα τρία είναι για τη χρήση mytop - χρησιμοποιήστε ένα χρήστη db που έχει αξιοπρεπή δικαιώματα
    dbusr = "όνομα χρήστη"
    dbpw = "κωδικός πρόσβασης"
    db = "yourdatabasename"
    # Το παρακάτω είναι το επίπεδο φόρτωσης για να ελέγξετε - το 10 είναι πραγματικά υψηλό, επομένως ίσως θέλετε να το μειώσετε.
    levelToCheck = 10
    # Ορισμός μεταβλητών από το σύστημα:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

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

    αν [$ loadLevel -gt $ levelToCheck]; έπειτα
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Ημερομηνία: $ dt" >> $ tmpfile
    echo "Έλεγχος φόρτωσης συστήματος & διεργασίες" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    # Βρείτε περισσότερες μεταβλητές από το σύστημα:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Εμφάνιση τρέχοντος επιπέδου φορτίου:
    echo "Το επίπεδο φόρτωσης είναι: $ loadLevel" >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile

    # Εμφάνιση του αριθμού των διαδικασιών httpd που τρέχουν τώρα (χωρίς παιδιά):
    echo "Αριθμός διαδικασιών httpd τώρα: $ httpdProcesses" >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση λίστας διεργασιών:
    echo "Οι τρέχουσες διαδικασίες:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση τρέχουσας πληροφορίας MySQL:
    echo "Αποτελέσματα από mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση τρέχουσας κορυφής:
    echo "κορυφή δείχνει τώρα:" >> $ tmpfile
    echo "κορυφή δείχνει τώρα:" >> $ topfile
    / usr / bin / κορυφή -b -n1 >> $ tmpfile
    / usr / bin / κορυφή -b -n1 >> $ topfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Εμφάνιση τρέχουσας σύνδεσης:
    echo "netstat δείχνει τώρα:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Ελέγξτε το χώρο στο δίσκο
    echo "χώρος στο δίσκο:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    ηχώ "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Αποστολή αποτελεσμάτων στο αρχείο καταγραφής:
    / bin / γάτα $ tmpfile >> $ logfile

    # Και τα αποτελέσματα ηλεκτρονικού ταχυδρομείου στο sysadmin:
    / usr / bin / mutt -s "$ μηχάνημα έχει υψηλό επίπεδο φόρτωσης! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # Αφαιρέστε το αρχείο temp:
    rm $ tmpfile
    rm $ topfile
    fi

    # #
    έξοδος 0