Homepage » come » Diagnostica i problemi di caricamento del server Linux con uno script semplice

    Diagnostica i problemi di caricamento del server Linux con uno script semplice

    Se sei stato un amministratore per un certo periodo di tempo, hai sicuramente scoperto situazioni in cui un server picchia nell'utilizzo della CPU o nell'utilizzo della memoria e / o nei livelli di carico. Eseguire 'top' non ti darà sempre la risposta. Quindi, come si trovano quei processi subdoli che stanno masticando le risorse del sistema per essere in grado di ucciderli?

    Il seguente script potrebbe essere in grado di aiutare. È stato scritto per un server web, quindi ha alcune parti che sono specificamente alla ricerca di processi httpd e alcune parti che si occupano di MySQL. A seconda della distribuzione del server, è sufficiente commentare / eliminare quelle sezioni e aggiungerne altre. Dovrebbe essere usato per un punto di partenza.

    I prerequisiti per questa versione dello script sono alcuni freeware rilasciati sotto la GNU General Public License chiamata mytop (disponibile all'indirizzo http://jeremy.zawodny.com/mysql/mytop/) che è uno strumento fantastico per verificare come MySQL sta eseguendo. Sta diventando vecchio, ma funziona ancora alla grande per i nostri scopi qui.
    Inoltre, uso mutt come mailer - potresti voler cambiare lo script semplicemente usando l'utility linux integrata in "mail". Lo faccio tramite cron ogni ora; regolare come meglio credi. Oh - e questo script deve essere eseguito come root poiché legge da alcune aree protette del server.

    Quindi iniziamo, dobbiamo?

    Per prima cosa, imposta le tue variabili di script:

    #! / Bin / bash
    #
    # Script per verificare i livelli di carico medio del sistema per provare a determinare
    # quali processi stanno prendendo troppo in alto ...
    #
    # 07Jul2010 tjones
    #
    # set environment
    dt = "data +% d% b% Y-% X"
    # Ovviamente, cambia le seguenti directory dove vengono effettivamente conservati i tuoi file di registro
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    MSGLOG = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # il primo mailstop è l'e-mail standard per i report. Il secondo è per il cellulare (con un rapporto ridotto)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    Macchina = "host"
    # I seguenti tre sono per uso mytop: utilizzare un utente db con diritti decenti
    dbusr = "username"
    DBPW = "password"
    db = "YourDatabaseName"
    # Quanto segue è il livello di carico da controllare - 10 è veramente alto, quindi potresti volerlo abbassare.
    levelToCheck = 10

    Successivamente, controlla il tuo livello di carico per vedere se lo script deve continuare:

    # Imposta variabili dal sistema:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # se il livello di carico è maggiore di quello desiderato, avviare la procedura di script. Altrimenti, esci 0

    se [$ loadLevel -gt $ levelToCheck]; poi
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Data: $ dt" >> $ tmpfile
    echo "Verifica caricamento e processi del sistema" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    E continua attraverso i controlli, scrivendo i risultati nel file temporaneo. Aggiungi o elimina elementi da qui dove applicabile alla tua situazione:

    # Ottieni più variabili dal sistema:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Mostra il livello di carico attuale:
    echo "Load Level Is: $ loadLevel" >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile

    # Mostra il numero dei processi httpd ora in esecuzione (esclusi i bambini):
    echo "Numero di processi httpd ora: $ httpdProcesses" >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra elenco processi:
    echo "Processi ora in esecuzione:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra le informazioni attuali su MySQL:
    echo "Risultati da mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    Notare con il comando in alto, stiamo scrivendo su due file temporanei. Uno è per il messaggio molto più piccolo al telefono cellulare. Se non vuoi l'urgenza degli avvisi del cellulare alle tre del mattino, puoi farlo (e prendere la seconda routine di mailing più avanti nella sceneggiatura).


    # Mostra la parte superiore corrente:
    echo "top ora mostra:" >> $ tmpfile
    echo "top ora mostra:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    Più controlli:


    # Mostra connessioni attuali:
    echo "netstat ora mostra:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Controlla lo spazio del disco
    echo "spazio su disco:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    Quindi scrivi il contenuto del file temporaneo in un file di registro permanente e invia i risultati alle parti appropriate. Il secondo mailing è il risultato ridotto che consiste semplicemente nello standard di "top":

    # Invia risultati al file di registro:
    / bin / cat $ tmpfile >> $ logfile

    # E i risultati dell'email a sysadmin:
    / usr / bin / mutt -s "$ machine ha un alto livello di carico! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    E poi alcune pulizie e uscita:

    # E quindi rimuovere il file temporaneo:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    uscita 0

    Speriamo che questo aiuti qualcuno là fuori. Lo script completamente assemblato è:

    #! / Bin / bash
    #
    # Script per verificare i livelli di carico medio del sistema per provare a determinare quali processi sono
    # prendendo troppo in alto ...
    #
    # set environment
    dt = "data +% d% b% Y-% X"
    # Ovviamente, cambia le seguenti directory dove vengono effettivamente conservati i tuoi file di registro
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    MSGLOG = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    # il primo mailstop è l'e-mail standard per i report. Il secondo è per il cellulare (con un rapporto ridotto)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    Macchina = "host"
    # I seguenti tre sono per uso mytop: utilizzare un utente db con diritti decenti
    dbusr = "username"
    DBPW = "password"
    db = "YourDatabaseName"
    # Quanto segue è il livello di carico da controllare - 10 è veramente alto, quindi potresti volerlo abbassare.
    levelToCheck = 10
    # Imposta variabili dal sistema:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # se il livello di carico è maggiore di quello desiderato, avviare la procedura di script. Altrimenti, esci 0

    se [$ loadLevel -gt $ levelToCheck]; poi
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Data: $ dt" >> $ tmpfile
    echo "Verifica caricamento e processi del sistema" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    # Ottieni più variabili dal sistema:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Mostra il livello di carico attuale:
    echo "Load Level Is: $ loadLevel" >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile

    # Mostra il numero dei processi httpd ora in esecuzione (esclusi i bambini):
    echo "Numero di processi httpd ora: $ httpdProcesses" >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra elenco processi:
    echo "Processi ora in esecuzione:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra le informazioni attuali su MySQL:
    echo "Risultati da mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra la parte superiore corrente:
    echo "top ora mostra:" >> $ tmpfile
    echo "top ora mostra:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Mostra connessioni attuali:
    echo "netstat ora mostra:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Controlla lo spazio del disco
    echo "spazio su disco:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    eco "************************************************ * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Invia risultati al file di registro:
    / bin / cat $ tmpfile >> $ logfile

    # E i risultati dell'email a sysadmin:
    / usr / bin / mutt -s "$ machine ha un alto livello di carico! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # E quindi rimuovere il file temporaneo:
    rm $ tmpfile
    rm $ topfile
    fi

    #
    uscita 0