tomando temperatura al cpd

23 de junio de 2010

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.13

Una 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_si

También deberíamos tener un dispositivo llamado ipmidev:
# cat /proc/devices | grep ipmi  
252 ipmidev

Consultemos 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        | na  

Miremos 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 high

Miremos 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      | ns

Una 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 -n1

Ahora 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 0

Finalmente 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>&1

Más información:
+ http://www.intel.com/design/servers/ipmi/
+ http://en.wikipedia.org/wiki/Power_usage_effectiveness

1 comentarios:

Adrià dijo...

Enhorabuena por el artículo, es de gran utilidad.