Διάγνωση προβλημάτων φόρτωσης διακομιστή 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