Diagnosticar problemas de carga del servidor Linux con un simple script
Si ha sido administrador por un período de tiempo prolongado, ciertamente ha descubierto situaciones en las que un servidor aumenta el uso de la CPU o la utilización de la memoria y / o los niveles de carga. Ejecutar 'top' no siempre te dará la respuesta, tampoco. Entonces, ¿cómo encuentras esos procesos astutos que están consumiendo los recursos de tu sistema para poder matarlos??
La siguiente secuencia de comandos podría ser de ayuda. Fue escrito para un servidor web, por lo que tiene algunas partes de él que están específicamente buscando procesos httpd y otras partes que tratan con MySQL. Dependiendo de la implementación de su servidor, simplemente comente / elimine esas secciones y agregue otras. Se debe utilizar para un punto de partida..
Los requisitos previos para esta versión del script son algunos de los programas gratuitos publicados bajo la Licencia Pública General de GNU llamada mytop (disponible en http://jeremy.zawodny.com/mysql/mytop/) que es una herramienta fantástica para verificar el rendimiento de MySQL. Se está haciendo viejo, pero todavía funciona muy bien para nuestros propósitos aquí..
Además, uso mutt como el programa de correo: es posible que desee cambiar la secuencia de comandos para usar simplemente la utilidad de correo integrada de Linux. Lo ejecuto a través de cron cada hora; Ajusta como mejor te parezca. Ah, y esta secuencia de comandos debe ejecutarse como root ya que se lee desde algunas áreas protegidas del servidor.
Así que vamos a empezar, vamos?
Primero, establece tus variables de script:
#! / bin / bash
#
# Script para verificar los niveles promedio de carga del sistema para tratar de determinar
# ¿Qué procesos lo están tomando demasiado alto ...
#
# 07jul2010 tjones
#
entorno # set
dt = "fecha +% d% b% Y-% X"
# Obviamente, cambie los siguientes directorios a donde realmente se guardan sus archivos de registro
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# el primer correo es un correo electrónico estándar para informes. La segunda es para teléfono celular (con un informe reducido)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "nombre de host"
# Los siguientes tres son para uso de mytop: use un usuario de base de datos que tenga derechos decentes.
dbusr = "nombre de usuario"
dbpw = "contraseña"
db = "yourdatabasename"
# El siguiente es el nivel de carga que se debe verificar: 10 es realmente alto, por lo que es posible que desee reducirlo..
levelToCheck = 10
A continuación, compruebe su nivel de carga para ver si el script debe continuar:
# Establecer variables desde el sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Si el nivel de carga es mayor que el deseado, inicie el proceso de script. De lo contrario, salida 0
si [$ loadLevel -gt $ levelToCheck]; entonces
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Fecha: $ dt" >> $ tmpfile
echo "Comprobar la carga del sistema y los procesos" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Y continúe con las comprobaciones, escribiendo los resultados en el archivo temporal. Agregue o elimine elementos desde aquí donde corresponda a su situación:
# Obtener más variables del sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostrar el nivel de carga actual:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile# Mostrar el número de procesos httpd que se están ejecutando (sin incluir hijos):
echo "Número de procesos httpd ahora: $ httpdProcesses" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar lista de procesos:
echo "Procesos ahora en ejecución:" >> $ tmpfile
ps f -ef >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar información de MySQL actual:
echo "Resultados de mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Note que con el comando superior, estamos escribiendo en dos archivos temporales. Uno es para el mensaje mucho más pequeño al teléfono celular. Si no desea la urgencia de las alertas telefónicas a las tres de la mañana, puede eliminar esto (y eliminar la segunda rutina de envío de correos más adelante en el script).
# Mostrar la parte superior actual:
echo "arriba ahora muestra:" >> $ tmpfile
echo "arriba ahora muestra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Más cheques:
# Mostrar conexiones actuales:
echo "netstat ahora muestra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Comprobar el espacio en disco
echo "espacio en disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Luego, escriba el contenido del archivo temporal en un archivo de registro más permanente y envíe los resultados por correo electrónico a las partes correspondientes. El segundo envío es los resultados reducidos que consisten simplemente en el estándar de 'top':
# Enviar resultados al archivo de registro:
/ bin / cat $ tmpfile >> $ logfile# Y enviar los resultados por correo electrónico a sysadmin:
/ usr / bin / mutt -s "$ machine tiene un alto nivel de carga! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
Y luego un poco de limpieza y salida:
# Y luego eliminar el archivo temporal:
rm $ tmpfile
rm $ topfile
fi#
salida 0
Esperemos que esto ayude a alguien por ahí. El script completamente ensamblado es:
#! / bin / bash
#
# Script para verificar los niveles promedio de carga del sistema para tratar de determinar qué procesos son
# tomando demasiado alto ...
#
entorno # set
dt = "fecha +% d% b% Y-% X"
# Obviamente, cambie los siguientes directorios a donde realmente se guardan sus archivos de registro
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# el primer correo es un correo electrónico estándar para informes. La segunda es para teléfono celular (con un informe reducido)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "nombre de host"
# Los siguientes tres son para uso de mytop: use un usuario de base de datos que tenga derechos decentes.
dbusr = "nombre de usuario"
dbpw = "contraseña"
db = "yourdatabasename"
# El siguiente es el nivel de carga que se debe verificar: 10 es realmente alto, por lo que es posible que desee reducirlo..
levelToCheck = 10
# Establecer variables desde el sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Si el nivel de carga es mayor que el deseado, inicie el proceso de script. De lo contrario, salida 0
si [$ loadLevel -gt $ levelToCheck]; entonces
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Fecha: $ dt" >> $ tmpfile
echo "Comprobar la carga del sistema y los procesos" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Obtener más variables del sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Mostrar el nivel de carga actual:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile# Mostrar el número de procesos httpd que se están ejecutando (sin incluir hijos):
echo "Número de procesos httpd ahora: $ httpdProcesses" >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar lista de procesos:
echo "Procesos ahora en ejecución:" >> $ tmpfile
ps f -ef >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar información de MySQL actual:
echo "Resultados de mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar la parte superior actual:
echo "arriba ahora muestra:" >> $ tmpfile
echo "arriba ahora muestra:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Mostrar conexiones actuales:
echo "netstat ahora muestra:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Comprobar el espacio en disco
echo "espacio en disco:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
eco "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Enviar resultados al archivo de registro:
/ bin / cat $ tmpfile >> $ logfile# Y enviar los resultados por correo electrónico a sysadmin:
/ usr / bin / mutt -s "$ machine tiene un alto nivel de carga! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Y luego eliminar el archivo temporal:
rm $ tmpfile
rm $ topfile
fi#
salida 0