Pagina inicial » como » Diagnosticar problemas de carga do servidor Linux com um script simples

    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