Diagnosticar problemas de carga do servidor Linux com um script simples
Se você tem sido um administrador por qualquer período de tempo, certamente descobriu situações em que um servidor aumenta o uso da CPU ou a utilização da memória e / ou os níveis de carga. Correr 'top' nem sempre lhe dará a resposta. Então, como você encontra esses processos sorrateiros que estão destruindo seus recursos do sistema para matá-los??
O script a seguir pode ajudar. Ele foi escrito para um servidor da Web, assim, algumas partes dele estão especificamente procurando por processos httpd e algumas partes que lidam com o MySQL. Dependendo da implantação do seu servidor, simplesmente comente / exclua essas seções e adicione outras. Deve ser usado para um ponto de partida.
Pré-requisitos para esta versão do script são alguns freewares lançados sob a GNU General Public License chamada mytop (disponível em http://jeremy.zawodny.com/mysql/mytop/) que é uma ferramenta fantástica para verificar como o MySQL está executando. Está ficando velho, mas ainda funciona muito bem para nossos propósitos aqui.
Além disso, eu uso o mutt como o mailer - você pode querer mudar o script para simplesmente usar o linux embutido no utilitário 'mail'. Eu corro via cron a cada hora; ajuste como achar melhor. Ah - e este script precisa ser executado como root, já que lê algumas áreas protegidas do servidor.
Então, vamos começar, devemos?
Primeiro, defina suas variáveis de script:
#! / bin / bash
#
# Script para verificar os níveis médios de carga do sistema para tentar determinar
# quais processos estão levando muito alto…
#
# 07Jul2010 tjones
#
# set ambiente
dt = "data +% d% b% Y-% X"
# Obviamente, altere os seguintes diretórios para onde seus arquivos de log são mantidos
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# a primeira mailstop é o email padrão para relatórios. O segundo é para celular (com um relatório simplificado)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Os três seguintes são para uso do mytop - use um usuário db que tenha direitos decentes
dbusr = "nome de usuário"
dbpw = "password"
db = "yourdatabasename"
# O seguinte é o nível de carga para verificar - 10 é realmente alto, então você pode querer abaixá-lo.
levelToCheck = 10
Em seguida, verifique seu nível de carga para ver se o script deve continuar:
# Definir variáveis do sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# se o nível de carga for maior do que você deseja, inicie o processo de script. Caso contrário, saia 0
if [$ loadLevel -gt $ levelToCheck]; então
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Verificar carga do sistema e processos" >> $ tmpfile
echo "**************************************" >> $ tmpfile
E continue com as verificações, escrevendo os resultados no arquivo temporário. Adicione ou exclua itens aqui, quando aplicável à sua situação:
# Obtenha mais variáveis do sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostrar o nível de carga atual:
echo "O nível de carga é: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Mostrar o número de processos httpd agora em execução (não incluindo filhos):
echo "Número de processos httpd agora: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar lista de processos:
echo "Processos agora em execução:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar informações atuais do MySQL:
echo "Resultados do mytop:" >> $ tmpfile
/ usr / bin / mytop-u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Observe com o comando top, estamos gravando em dois arquivos temporários. Uma é a mensagem muito menor para o celular. Se você não quer a urgência dos alertas de telefone celular às três da manhã, pode tirar isso (e retirar a segunda rotina de correspondência mais tarde no script).
# Mostrar o topo atual:
echo "top agora mostra:" >> $ tmpfile
echo "top agora mostra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Mais cheques:
# Mostrar conexões atuais:
echo "netstat agora mostra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Verifique o espaço em disco
eco "espaço em disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Em seguida, grave o conteúdo do arquivo temporário em um arquivo de log mais permanente e envie os resultados por e-mail para as partes apropriadas. A segunda correspondência é os resultados simplificados consistindo simplesmente no padrão fora do 'topo':
# Envie os resultados para o arquivo de log:
/ bin / cat $ tmpfile >> $ logfile# E resultados de email para sysadmin:
/ usr / bin / mutt -s "$ máquina tem um alto nível de carga! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
E então algumas tarefas domésticas e sair:
# E, em seguida, remova o arquivo temporário:
rm $ tmpfile
rm $ topfile
fi#
sair 0
Espero que isso ajude alguém lá fora. O script totalmente montado é:
#! / bin / bash
#
# Script para verificar os níveis médios de carga do sistema para tentar determinar quais processos são
# levando-o excessivamente alto ...
#
# set ambiente
dt = "data +% d% b% Y-% X"
# Obviamente, altere os seguintes diretórios para onde seus arquivos de log são mantidos
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# a primeira mailstop é o email padrão para relatórios. O segundo é para celular (com um relatório simplificado)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Os três seguintes são para uso do mytop - use um usuário db que tenha direitos decentes
dbusr = "nome de usuário"
dbpw = "password"
db = "yourdatabasename"
# O seguinte é o nível de carga para verificar - 10 é realmente alto, então você pode querer abaixá-lo.
levelToCheck = 10
# Definir variáveis do sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# se o nível de carga for maior do que você deseja, inicie o processo de script. Caso contrário, saia 0
if [$ loadLevel -gt $ levelToCheck]; então
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Data: $ dt" >> $ tmpfile
echo "Verificar carga do sistema e processos" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Obtenha mais variáveis do sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostrar o nível de carga atual:
echo "O nível de carga é: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Mostrar o número de processos httpd agora em execução (não incluindo filhos):
echo "Número de processos httpd agora: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar lista de processos:
echo "Processos agora em execução:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar informações atuais do MySQL:
echo "Resultados do mytop:" >> $ tmpfile
/ usr / bin / mytop-u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar o topo atual:
echo "top agora mostra:" >> $ tmpfile
echo "top agora mostra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar conexões atuais:
echo "netstat agora mostra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Verifique o espaço em disco
eco "espaço em disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Envie os resultados para o arquivo de log:
/ bin / cat $ tmpfile >> $ logfile# E resultados de email para sysadmin:
/ usr / bin / mutt -s "$ máquina tem um alto nível de carga! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# E, em seguida, remova o arquivo temporário:
rm $ tmpfile
rm $ topfile
fi#
sair 0