IPMI (Intelligent Platform Management Interface) es una especificación de Intel para el monitoreo a nivel físico de un hardware. Fue impulsado por Dell, HP, Intel y NEC. Sus especificaciones y funcionamiento son independientes del sistema operativo y hardware de la maquina. Nos permite controlar valores como la temperatura de diferentes componentes del servidor, velocidad de los ventiladores, apertura del chasis, voltajes, etc.
El firmware del IPMI se encuentra en la propia placa madre y es totalmente independiente del SO, por tanto es posible monitorizar la maquina aún cuando su sistema operativo está colgado. Dado que se trata de una interfaz para monitorizar podemos utilizar herramientas como clientes SNMP, Nagios o OpenView.
Vamos a describir cómo utilizar un servidor DELL para controlar la temperatura del CPD y enviar un mail en caso de que la temperatura salga de lo habitual.
Primero de todo instalaremos las tools de IPMI. En mi servidor con RedHat es el paquete:
# rpm -q -a | grep IPMI OpenIPMI-tools-1.4.14-1.4E.13Una vez rebotado el sistema deberíamos tener arrancados los siguientes módulos en el Kernel. Si no los tenemos arrancados no podremos acceder a la interfaz de IPMI.
# lsmod | grep ipmi ipmi_devintf 13064 2 ipmi_si 36648 1 ipmi_msghandler 31720 2 ipmi_devintf,ipmi_siTambién deberíamos tener un dispositivo llamado ipmidev:
# cat /proc/devices | grep ipmi 252 ipmidevConsultemos ahora todos los valores que podemos leer con IPDMI:
# ipmitool -I open sensor list Temp | 31.000 | degrees C | ok | na | na | na | 85.000 | 90.000 | na Temp | 50.000 | degrees C | ok | na | na | na | 85.000 | 90.000 | na Temp | 40.000 | degrees C | ok | 64.000 | na | -128.000 | -128.000 | na | na Temp | 40.000 | degrees C | ok | 64.000 | na | -128.000 | -128.000 | na | na Ambient Temp | 20.000 | degrees C | nc | na | 3.000 | 8.000 | 20.000 | 47.000 | na CMOS Battery | 0x0 | discrete | 0x0080| na | na | na | na | na | na ROMB Battery | 0x0 | discrete | 0x0080| na | na | na | na | na | na VCORE | 0x0 | discrete | 0x0180| na | na | na | na | na | na VCORE | 0x0 | discrete | 0x0180| na | na | na | na | na | na CPU VTT | 0x0 | discrete | 0x0180| na | na | na | na | na | na 1.5V PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 1.8V PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 3.3V PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 5V PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na Backplane PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na Flexbay PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na Linear PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 0.9V PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 1.5V ESB2 PG | 0x0 | discrete | 0x0180| na | na | na | na | na | na 0.9V Over Volt | 0x0 | discrete | 0x0180| na | na | na | na | na | na CPU Power Fault | 0x0 | discrete | 0x0180| na | na | na | na | na | na FAN 1 RPM | 2475.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 2 RPM | 2550.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 3 RPM | 2550.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 4 RPM | 2550.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 5 RPM | 2550.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 6 RPM | 2550.000 | RPM | ok | na | 1275.000 | na | na | na | na FAN 7 RPM | 4500.000 | RPM | ok | 14400.000 | na | 0.000 | 0.000 | na | na FAN 8 RPM | 4500.000 | RPM | ok | 14400.000 | na | 0.000 | 0.000 | na | na Presence | 0x0 | discrete | 0x0180| na | na | na | na | na | na ... Memory Mirrored | na | discrete | na | na | na | na | na | na | na Memory RAID | na | discrete | na | na | na | na | na | na | na Memory Added | na | discrete | na | na | na | na | na | na | na Memory Removed | na | discrete | na | na | na | na | na | na | na Memory Cfg Err | na | discrete | na | na | na | na | na | na | na Mem Redun Gain | na | discrete | na | na | na | na | na | na | na PCIE Fatal Err | na | discrete | na | na | na | na | na | na | na Chipset Err | na | discrete | na | na | na | na | na | na | na Err Reg Pointer | na | discrete | na | na | na | na | na | na | na Mem ECC Warning | na | discrete | na | na | na | na | na | na | na Mem CRC Err | na | discrete | na | na | na | na | na | na | na USB Over-current | na | discrete | na | na | na | na | na | na | na POST Err | na | discrete | na | na | na | na | na | na | na Hdwr version err | na | discrete | na | na | na | na | na | na | na Mem Overtemp | na | discrete | na | na | na | na | na | na | na Mem Fatal SB CRC | na | discrete | na | na | na | na | na | na | na Mem Fatal NB CRC | na | discrete | na | na | na | na | na | na | na CPU Temp Interf | na | discrete | na | na | na | na | na | na | naMiremos ahora el log de problemas:
# ipmitool -I open sel list 1 | 10/16/2006 | 21:02:21 | Event Logging Disabled #0x72 | Log area reset/cleared | Asserted 2 | Pre-Init Time-stamp | Power Supply #0x74 | Redundancy Lost 3 | Pre-Init Time-stamp | Power Supply #0x64 | Failure detected | Asserted 4 | Pre-Init Time-stamp | Power Supply #0x64 | Power Supply AC lost | Asserted 5 | 06/09/2009 | 17:35:09 | Drive Slot #0x81 | Drive Present | Deasserted 6 | 06/09/2009 | 17:37:54 | Drive Slot #0x81 | Drive Present | Asserted 7 | 06/21/2010 | 15:16:47 | Temperature #0x08 | Upper Non-critical going highMiremos ahora las alarmas:
# ipmitool -I open sdr list Temp | 32 degrees C | ok Temp | 50 degrees C | ok Temp | 40 degrees C | ok Temp | 40 degrees C | ok Ambient Temp | 20 degrees C | nc CMOS Battery | 0x00 | ok ROMB Battery | 0x00 | ok VCORE | 0x01 | ok VCORE | Not Readable | ns CPU VTT | 0x01 | ok 1.5V PG | 0x01 | ok 1.8V PG | 0x01 | ok 3.3V PG | 0x01 | ok 5V PG | 0x01 | ok Backplane PG | 0x01 | ok Flexbay PG | 0x01 | ok Linear PG | 0x01 | ok 0.9V PG | 0x01 | ok 1.5V ESB2 PG | 0x01 | ok 0.9V Over Volt | 0x01 | ok CPU Power Fault | 0x01 | ok FAN 1 RPM | 2475 RPM | ok FAN 2 RPM | 2475 RPM | ok FAN 3 RPM | 2550 RPM | ok FAN 4 RPM | 2550 RPM | ok FAN 5 RPM | 2550 RPM | ok FAN 6 RPM | 2550 RPM | ok FAN 7 RPM | 4500 RPM | ok FAN 8 RPM | 4500 RPM | ok Presence | 0x01 | ok Presence | 0x02 | ok Presence | 0x01 | ok Presence | 0x01 | ok Presence | 0x01 | ok PFault Fail Safe | Not Readable | ns Status | 0x80 | ok Status | 0x00 | ok Status | 0x01 | ok Status | 0x01 | ok RAC Status | 0x00 | ok OS Watchdog | 0x00 | ok SEL | Not Readable | ns Intrusion | 0x00 | ok PS Redundancy | 0x01 | ok Fan Redundancy | 0x01 | ok Drive | 0x01 | ok Cable SAS A | 0x01 | ok Cable SAS B | 0x01 | ok Cable SAS FB | Not Readable | ns Cable Power FB | Not Readable | ns ... Mem ECC Warning | Not Readable | ns Mem CRC Err | Not Readable | ns USB Over-current | 0x01 | ok POST Err | Not Readable | ns Hdwr version err | 0x01 | ok Mem Overtemp | 0x01 | ok Mem Fatal SB CRC | 0x01 | ok Mem Fatal NB CRC | 0x01 | ok CPU Temp Interf | Not Readable | nsUna vez que sabemos de que van estos comandos podemos ver que el valor que nos interesa es el marcado por el sensor de temperatura llamado “Ambient Temp”. Este valor marca el valor de la temperatura fuera del servidor con un error de +-2Cº.
Si lanzamos el siguiente comando de shell obtendremos la temperatura ambiente:
# ipmitool sdr type Temperature | grep "Ambient Temp" |awk '{ print $10 }' | grep -v "na" | sed 's/\..*//g' | head -n1Ahora nos hacemos un script que lea la temperatura y la compare con un máximo. Si se supera ese máximo enviará un mail:
# cat /usr/share/ipmitool/control_temp.sh #!/bin/bash TEMPWARNING="31" TEMPCRITICAL="35" MAIL="sysadmin@miempresa.com" LOG=/var/log/control_temp.log TEMPERATURA=$(/usr/bin/ipmitool sdr type Temperature | grep "Ambient Temp" |awk '{ print $10 }' | grep -v "na" | sed 's/\..*//g' | head -n1) if [ -z "$TEMPERATURA" ]; then echo UNKNOWN exit 3 fi if [ $TEMPERATURA -ge $TEMPCRITICAL ]; then echo `date` CRITICAL temperatura ${TEMPERATURA}C >> $LOG echo "CRITICAL temperatura ${TEMPERATURA}C" | mail -s "Temperatura CPD CRIT" ${MAIL} exit 2 elif [ $TEMPERATURA -ge $TEMPWARNING ]; then echo `date` WARNING temperatura ${TEMPERATURA}C >> $LOG echo "WARNING temperatura ${TEMPERATURA}C" | mail -s "Temperatura CPD WARN" ${MAIL} exit 1 fi echo `date` OK temperatura ${TEMPERATURA}C >> $LOG exit 0Finalmente programamos este script para que se ejecute cada 15 minutos y compruebe la temperatura:
# crontab -l 0,15,30,45 * * * * /usr/share/ipmitool/control_temp.sh > /dev/null 2>&1Más información:
+ http://www.intel.com/design/servers/ipmi/
+ http://en.wikipedia.org/wiki/Power_usage_effectiveness
1 comentarios:
Enhorabuena por el artículo, es de gran utilidad.
hacer un comentario en esta entrada