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ź. Jak więc 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 ma pewne jego części, które szczególnie szukają procesów httpd i niektórych części zajmujących się MySQL. W zależności od wdrożenia serwera po prostu skomentuj / usuń te sekcje i dodaj inne. Należy go użyć 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 nadal 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ę; dostosuj 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 są zbyt wysokie ...
#
# 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 są przeznaczone do użycia w mejtopach - 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 tutaj, jeśli dotyczy Twojej sytuacji:
# Uzyskaj więcej zmiennych z systemu:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"
# Pokaż aktualny 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ż aktualne 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 tymczasową zawartość pliku 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 "Maszyna $ ma wysoki poziom obciążenia ! - $ 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 zmontowany skrypt to:
#! / bin / bash
#
# Skrypt do sprawdzenia ś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 są przeznaczone do użycia w mejtopach - 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ż aktualny 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ż aktualne 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 "Maszyna $ ma wysoki poziom obciążenia ! - $ dt "$ mailstop1> $ logfile# A następnie usuń plik tymczasowy:
rm $ tmpfile
rm $ topfile
fi#
exit 0