lunes, julio 12, 2010

Ola de calor . . . y los servidores!

Este verano (2010) en el nor-este de Alemania hemos tenido temperaturas llegado a los 40°C, algo muy poco usual y que por supuesto ha estado estresando mas de la cuenta a los sistemas de refrigeración de nuestros cuartos de servidores.

Esta situación me llevo a instalar y configurar el paquete lm_sensors en mis servidores con CentOS. En principio todo era cuestión de instalar el paquete, detectar los sensores disponibles en el hardware (sensors-detect), cargar alguno módulos en memoria y revisar la temperatura con el comando
'sensors'. claro, la vida no es fácil, y el modulo coretemp que se necesitaba no esta instalado en CentOs, a pesar de que es incluido por defecto en versiones del kernel >= 2.6.22, pero la versión mas actual de CentOs 5.4 es 2.6.18. Ya me veía compilando el kernel y el modulo faltante.

Afortunadamente antes de enfrentar tan emocionante tarea hice una búsqueda que me ayudó a encontrar este sitio, en donde precisamente cuentan como instalar el modulo coretemp en centos 5.4.

En resumen:

1.- Descargar el rpm del modulo para el sistema deseado, en mi caso fue e15
2.- Instalar el modulo rpm -ivh kmod-coretemp-1.1-2.el5.x86_64.rpm
3.- ejecutrar (como root) sensors-detect
4.- ejecutar sensors, para ver las lecturas actuales de temperatura.

A este punto los sensores deben estar funcionando, claro con algo de suerte.

Para facilitar un poco el monitoreo escribí (partiendo de otro script que encontré en la web, pero cuya ubicación no recuerdo .-() un pequeño script de Perl que ejecuta 'sensors', guarda los datos en una base rrd, y crea las gráficas correspondientes al comportamiento de la temperatura. El script se puede ejecutar via cron, colectando datos cada 5 minutos.

Aquí esta el script:

#!/usr/bin/perl

use strict;
use warnings;
use RRDs;

# rrdtool databases
my $rrd = '/path/to/rrd/database/';
# output location of images
my $img = '/path/to/rrd/output/graphics/';

&CoreTemp();

sub CoreTemp{
my %cores;
my @CoreTemp=`sensors |grep Core`;
foreach my $line(@CoreTemp){
chomp $line;
if($line=~/^Core\s+(\d+):\s+([+-]\d+)°C/){
$cores{$1}=$2;
}
}
foreach my $core(keys %cores){
#if rrdtool database doesn't exist, create it
my $rrd_db="tempcore".$core.".rrd";
if(! -e "$rrd/$rrd_db"){
print "Creating RDD DB $rrd_db in $rrd . . . \n";
RRDs::create "$rrd/$rrd_db",
"-s 300",
"DS:temp:GAUGE:600:0:100",
"RRA:AVERAGE:0.5:1:576",
"RRA:AVERAGE:0.5:6:672",
"RRA:AVERAGE:0.5:24:732",
"RRA:AVERAGE:0.5:144:1460";
}
# insert value into rrd
RRDs::update "$rrd/$rrd_db",
"-t", "temp",
"N:$cores{$core}";
CreateGraph($core, "day");
CreateGraph($core, "week");
CreateGraph($core, "month");
CreateGraph($core, "year");
}
}

sub CreateGraph{
my ($core,$interval)=@_;
print "$core,$interval\n";
my $rrd_db="tempcore".$core.".rrd";
my $img_file="core".$core."-".$interval.".png";
RRDs::graph "$img/$img_file",
"--lazy",
"-s -1$interval",
"-t core temperature :: Core $core ",
"-h", "80", "-w", "600",
"-a", "PNG",
"-v degrees C",
"DEF:temp=$rrd/$rrd_db:temp:AVERAGE",
"LINE2:temp#0000FF:$core (Core $core)",
"GPRINT:temp:MIN: Min\\: %2.lf",
"GPRINT:temp:MAX: Max\\: %2.lf",
"GPRINT:temp:AVERAGE: Avg\\: %4.1lf",
"GPRINT:temp:LAST: Current\\: %2.lf degrees C\\n";
if (RRDs::error) { print "$0: unable to generate Core $core graph: $RRDs::error\n"; }
}


No hay comentarios.: