Diagnozuj problemy z serwerem Linux Załaduj problemy za pomocą prostego skryptu
Jeśli jesteś administratorem przez dłuższy czas, z pewnością odkryłeś sytuacje, w których serwer przyspiesza wykorzystanie procesora lub wykorzystanie pamięci i / lub poziomów obciążenia. Uruchomienie "góry" nie zawsze da ci odpowiedź. Więc jak znaleźć te podstępne procesy, które przeżuwają zasoby systemowe, aby móc je zabić?
Poniższy skrypt może pomóc. Został napisany dla serwera WWW, więc niektóre jego części szczególnie szukają procesów httpd i niektórych części, które dotyczą MySQL. W zależności od wdrożenia serwera, po prostu skomentuj / usuń te sekcje i dodaj inne. Powinien być użyty do punktu wyjścia.
Warunkiem wstępnym dla tej wersji skryptu jest darmowe oprogramowanie wydane na licencji GNU General Public Licence o nazwie mytop (dostępne pod adresem http://jeremy.zawodny.com/mysql/mytop/), które jest fantastycznym narzędziem do sprawdzania, jak działa MySQL. Starzeje się, ale wciąż działa świetnie dla naszych celów tutaj.
Dodatkowo używam mutt jako programu pocztowego - możesz chcieć zmienić skrypt, aby po prostu użyć wbudowanego w Linuksa narzędzia "mail". Prowadzę go przez crona co godzinę; dopasuj według własnego uznania. Aha - i ten skrypt musi działać jako root, ponieważ czyta z niektórych chronionych obszarów serwera.
Więc zaczynajmy, dobrze?
Najpierw ustaw zmienne skryptu:
#! / bin / bash
#
# Skrypt do sprawdzenia średnich poziomów obciążenia systemu, aby spróbować określić
# jakie procesy biorą to zbyt wysoko ...
#
# 07Jul2010 tjones
#
# ustaw środowisko
dt = "data +% d% b% Y-% X"
# Oczywiście, zmień następujące katalogi na miejsca, w których przechowywane są pliki dziennika
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# pierwszy mailstop to standardowy e-mail do raportów. Druga dotyczy telefonu komórkowego (z raportem skrótu)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Poniższe trzy dotyczą użycia mytopów - użyj użytkownika db, który ma przyzwoite uprawnienia
dbusr = "nazwa użytkownika"
dbpw = "hasło"
db = "twoja nazwa bazy danych"
# Poniżej znajduje się poziom obciążenia do sprawdzenia - 10 jest naprawdę wysoki, więc możesz go obniżyć.
levelToCheck = 10
Następnie sprawdź poziom obciążenia, aby sprawdzić, czy skrypt powinien kontynuować:
# Ustaw zmienne z systemu:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jeśli poziom obciążenia jest większy, niż chcesz, rozpocznij proces skryptu. W przeciwnym razie wyjdź 0
if [$ loadLevel -gt $ levelToCheck]; następnie
echo ""> $ tmpfile
echo "****************************** >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Sprawdź ładowanie i procesy systemowe" >> $ tmpfile
echo "****************************** >> $ tmpfile
I kontynuuj sprawdzanie, zapisując wyniki w pliku tymczasowym. Dodaj lub usuń elementy z tego miejsca, które dotyczą Twojej sytuacji:
# Uzyskaj więcej zmiennych z systemu:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Pokaż bieżący poziom obciążenia:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile# Pokaż liczbę uruchomionych procesów httpd (bez dzieci):
echo "Liczba procesów httpd: $ httpdProcesses" >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż listę procesów:
echo "Procesy teraz uruchomione:" >> $ tmpfile
ps f -ef >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż bieżące informacje MySQL:
echo "Wyniki z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Zawiadomienie za pomocą polecenia top, zapisujemy do dwóch plików tymczasowych. Jedna dotyczy znacznie mniejszej wiadomości na telefon komórkowy. Jeśli nie chcesz, aby powiadomienia o telefonach komórkowych były pilne o trzeciej nad ranem, możesz je wziąć (i wyjąć drugą procedurę pocztową później w skrypcie).
# Pokaż bieżący szczyt:
echo "top teraz pokazuje:" >> $ tmpfile
echo "top teraz pokazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Więcej czeków:
# Pokaż bieżące połączenia:
echo "netstat wyświetla teraz:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Sprawdź miejsce na dysku
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Następnie zapisz zawartość pliku tymczasowego do bardziej stałego pliku dziennika i wyślij wyniki pocztą elektroniczną do odpowiednich stron. Drugi mailing to zredukowane wyniki, składające się po prostu ze standardu poza "top":
# Wyślij wyniki do pliku dziennika:
/ bin / cat $ tmpfile >> $ logfile# I wyniki email do sysadmin:
/ usr / bin / mutt -s "Maszyna $ ma wysoki poziom obciążenia! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
A potem trochę sprzątania i wyjścia:
# A następnie usuń plik tymczasowy:
rm $ tmpfile
rm $ topfile
fi#
exit 0
Mam nadzieję, że to pomoże komuś tam. W pełni złożony skrypt to:
#! / bin / bash
#
# Skrypt do sprawdzania średnich poziomów obciążenia systemu, aby spróbować określić, jakie procesy są
# biorąc to zbyt wysoko ...
#
# ustaw środowisko
dt = "data +% d% b% Y-% X"
# Oczywiście, zmień następujące katalogi na miejsca, w których przechowywane są pliki dziennika
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# pierwszy mailstop to standardowy e-mail do raportów. Druga dotyczy telefonu komórkowego (z raportem skrótu)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Poniższe trzy dotyczą użycia mytopów - użyj użytkownika db, który ma przyzwoite uprawnienia
dbusr = "nazwa użytkownika"
dbpw = "hasło"
db = "twoja nazwa bazy danych"
# Poniżej znajduje się poziom obciążenia do sprawdzenia - 10 jest naprawdę wysoki, więc możesz go obniżyć.
levelToCheck = 10
# Ustaw zmienne z systemu:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jeśli poziom obciążenia jest większy, niż chcesz, rozpocznij proces skryptu. W przeciwnym razie wyjdź 0
if [$ loadLevel -gt $ levelToCheck]; następnie
echo ""> $ tmpfile
echo "****************************** >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Sprawdź ładowanie i procesy systemowe" >> $ tmpfile
echo "****************************** >> $ tmpfile# Uzyskaj więcej zmiennych z systemu:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Pokaż bieżący poziom obciążenia:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile# Pokaż liczbę uruchomionych procesów httpd (bez dzieci):
echo "Liczba procesów httpd: $ httpdProcesses" >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż listę procesów:
echo "Procesy teraz uruchomione:" >> $ tmpfile
ps f -ef >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż bieżące informacje MySQL:
echo "Wyniki z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż bieżący szczyt:
echo "top teraz pokazuje:" >> $ tmpfile
echo "top teraz pokazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Pokaż bieżące połączenia:
echo "netstat wyświetla teraz:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Sprawdź miejsce na dysku
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
Echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Wyślij wyniki do pliku dziennika:
/ bin / cat $ tmpfile >> $ logfile# I wyniki email do sysadmin:
/ usr / bin / mutt -s "Maszyna $ ma wysoki poziom obciążenia! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# A następnie usuń plik tymczasowy:
rm $ tmpfile
rm $ topfile
fi#
exit 0