If-Koubou

Диагностицирайте проблемите със зареждането на сървър на Linux с обикновен скрипт

Диагностицирайте проблемите със зареждането на сървър на Linux с обикновен скрипт (Как да)

Ако сте били администрирани за определен период от време, със сигурност сте открили ситуации, при които даден сървър се увеличава при използването на процесора или използването на паметта и / или нивата на зареждане. Пускането на "горе" не винаги ще ви даде отговора. И така, как откривате тези подъл процеси, които дъвчат системните си ресурси, за да ги убиете?

Следният скрипт може да ви помогне. Той е написан за уеб сървър, така че има някои части от него, които специално търсят httpd процеси и някои части, които се занимават с MySQL. В зависимост от разполагането на сървъра си, просто коментирайте / изтрийте тези секции и добавете други. То трябва да се използва като начална точка.

Необходими условия за тази версия на скрипта са някои безплатни програми, пуснати под генералния лиценз на GNU, наречен mytop (достъпен на http://jeremy.zawodny.com/mysql/mytop/), което е фантастично средство за проверка на ефективността на MySQL. Става, но все пак работи добре за нашите цели тук.
Освен това, аз използвам mutt като Mailer - може да искате да промените скрипта, за да използвате Linux, построен в "mail" полезност. Аз го изпълнявам през cron всеки час; коригирайте, както смятате за подходящо. О - и този скрипт трябва да работи като root, тъй като той чете от някои защитени области на сървъра.

Така че, нека да започнем, нали?

Първо, задайте променливите на скрипта:

#! / Хамбар / Баш
#
# Скрипт, за да проверите средните нива за зареждане на системата, за да се опитате да определите
# какви процеси го приемат прекалено високи ...
#
# 07Jul2010 tjones
#
# зададена среда
dt = "дата +% d% b% Y-% X"
# Очевидно, променете следните директории, където действително се съхраняват вашите дневници
tmpfile = "/ TMP / checkSystemLoad.tmp"
лог = "/ TMP / checkSystemLoad.log"
msgLog = "/ VAR / дневник / съобщения"
mysqlLog = "/ Var / дневник / mysqld.log"
# първата пощенска кутия е стандартният имейл за отчети. Втората е за мобилен телефон (с по-отчетлив отчет)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
машина = "хост"
# Следните три са за използване от mytop - използвайте db потребител, който има прилични права
dbusr = "потребителско име"
dbpw = "парола"
db = "yourdatabasename"
# Следващото е нивото на натоварване за проверка - 10 е много високо, така че може да искате да го намалите.
levelToCheck = 10

След това проверете нивото на натоварване, за да видите дали скриптът трябва да продължи:

# Задаване на променливи от системата:
loadLevel = "котка / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)

# ако нивото на зареждане е по-голямо от желаното, стартирайте процеса на скрипта. В противен случай излез 0

ако [$ loadLevel -gt $ levelToCheck]; тогава
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
ехо "Дата: $ dt" >> $ tmpfile
echo "Проверете системното зареждане & процеси" >> $ tmpfile
echo "**************************************" >> $ tmpfile

И да продължите с проверките, като напишете резултатите до временния файл. Добавете или изтрийте елементи оттук, където е приложимо за вашата ситуация:

# Вземете повече променливи от системата:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

# Показване на текущото ниво на зареждане:
ехо "Нивото на зареждане е: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile

# Показване на броя на процесите на httpd, които се изпълняват сега (без да се включват децата):
echo "Брой на httpd процесите сега: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на списъка на процесите:
echo "Процеси, които сега се изпълняват:" >> $ tmpfile
PS f-еф >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на текущата информация за MySQL:
echo "Резултати от mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

Забележете с горната команда, че пишете на два временни файла. Едната е за много по-малко послание към мобилния телефон. Ако не искате спешната нужда от сигнали за клетъчни телефони в три сутринта, можете да го направите (и да излезете второто пощата по-късно в скрипта).


# Показване на текущия връх:
echo "top сега показва:" >> $ tmpfile
echo "top сега показва:" >> $ topfile
/ usr / bin / нагоре -b -n1 >> $ tmpfile
/ usr / bin / нагоре -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

Още проверки:


# Показване на текущите връзки:
echo "netstat сега показва:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Проверете дисковото пространство
echo "дисково пространство:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

След това напишете временното съдържание на файл в по-постоянен регистрационен файл и изпратете резултатите до съответните страни. Второто изпращане на съобщения е по-сложен резултат, който се състои само от стандартния "отгоре":

# Изпращане на резултати до файл за логване:
/ bin / котка $ tmpfile >> $ logfile

# И резултатите от имейла до sysadmin:
/ usr / bin / mutt -s "$ машина има високо ниво на зареждане! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s " ! - $ dt "$ mailstop1> $ logfile

И след това някои домакинство и излизане:

# И след това премахнете темп файла:
rm $ tmpfile
rm $ topfile
Fi

#
изход 0

Надяваме се, че това помага на някого там. Напълно сглобеният скрипт е:

#! / Хамбар / Баш
#
# Сценарий, за да проверите средните нива на зареждане на системата, за да се опитате да определите кои са процесите
# прекалено висок ...
#
# зададена среда
dt = "дата +% d% b% Y-% X"
# Очевидно, променете следните директории, където действително се съхраняват вашите дневници
tmpfile = "/ TMP / checkSystemLoad.tmp"
лог = "/ TMP / checkSystemLoad.log"
msgLog = "/ VAR / дневник / съобщения"
mysqlLog = "/ Var / дневник / mysqld.log"
# първата пощенска кутия е стандартният имейл за отчети. Втората е за мобилен телефон (с по-отчетлив отчет)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
машина = "хост"
# Следните три са за използване от mytop - използвайте db потребител, който има прилични права
dbusr = "потребителско име"
dbpw = "парола"
db = "yourdatabasename"
# Следващото е нивото на натоварване за проверка - 10 е много високо, така че може да искате да го намалите.
levelToCheck = 10
# Задаване на променливи от системата:
loadLevel = "котка / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)

# ако нивото на зареждане е по-голямо от желаното, стартирайте процеса на скрипта. В противен случай излез 0

ако [$ loadLevel -gt $ levelToCheck]; тогава
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
ехо "Дата: $ dt" >> $ tmpfile
echo "Проверете системното зареждане & процеси" >> $ tmpfile
echo "**************************************" >> $ tmpfile

# Вземете повече променливи от системата:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

# Показване на текущото ниво на зареждане:
ехо "Нивото на зареждане е: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile

# Показване на броя на процесите на httpd, които се изпълняват сега (без да се включват децата):
echo "Брой на httpd процесите сега: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на списъка на процесите:
echo "Процеси, които сега се изпълняват:" >> $ tmpfile
PS f-еф >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на текущата информация за MySQL:
echo "Резултати от mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на текущия връх:
echo "top сега показва:" >> $ tmpfile
echo "top сега показва:" >> $ topfile
/ usr / bin / нагоре -b -n1 >> $ tmpfile
/ usr / bin / нагоре -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Показване на текущите връзки:
echo "netstat сега показва:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Проверете дисковото пространство
echo "дисково пространство:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile

# Изпращане на резултати до файл за логване:
/ bin / котка $ tmpfile >> $ logfile

# И резултатите от имейла до sysadmin:
/ usr / bin / mutt -s "$ машина има високо ниво на зареждане! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s " ! - $ dt "$ mailstop1> $ logfile

# И след това премахнете темп файла:
rm $ tmpfile
rm $ topfile
Fi

#
изход 0