systemadmin.es > Hardware > Check de nagios para política de cache de controladora RAID

Check de nagios para política de cache de controladora RAID

Las controladoras con cache pueden ser configuradas con política WriteThrough o bien WriteBack. Vamos a ver dichas políticas un un check de nagios para verificar que estén usando la política que indicamos.

El significado de dichas políticas implica el uso o no de la cache de la controladora:

  • WriteThrough: No usa la cache, considera un dato escrito cuando esta escrito en los discos
  • WriteBack: Usa la cache, considera un dato escrito cuando esta en la caché de la controladora, por lo tanto resulta más rápido desde el punto de vista del sistema operativo

Evidentemente, para considerar seguros los datos de dicha caché debe existir una batería para que de tiempo mover estos datos a los discos. En caso que no exista la batería o este fallando debe dejar de usarse dicha caché. El problema es que tarda bastante a considerar la batería en fallo mientras que cambia de política más fácilmente. Lo podemos ver en los siguientes logs:

Time: Tue Dec 11 21:43:43 2012
Event Description: BBU disabled; changing WB virtual disks to WT
(...)
Time: Tue Dec 11 23:09:58 2012
Event Description: Current capacity of the battery is below threshold
(...)
Time: Mon Feb  4 20:28:53 2013
Event Description: Battery needs replacement - SOH Bad

Apreciamos que tarda casi dos meses a considerar la batería en fallo, estando durante estos dos meses sin usarse la cache de la controladora. Mediante megacli podemos por cada disco cual es el política por defecto y cual es la política actual:

# /opt/MegaRAID/MegaCli/MegaCli -LDInfo -LAll -aAll
                                     

Adapter 0 -- Virtual Drive Information:
Virtual Disk: 0 (target id: 0)
Name:Virtual Disk 0
RAID Level: Primary-1, Secondary-3, RAID Level Qualifier-0
Size:557568MB
State: Optimal
Stripe Size: 64kB
Number Of Drives:2
Span Depth:4
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disk's Default

Por lo que podemos parsear dicha salida para crear un check para Nagios que nos avise cuando la política actual difiera de la política definida:

# /usr/local/nagios/libexec/check_perc_cache_policy
CRITICAL - Adapter 0 VD 0 has set the default cache policy as WriteBack, but its current policy is WriteThrough
# /usr/local/nagios/libexec/check_perc_cache_policy 
OK - Default cache policy and current policy matches

Debemos tener en cuenta que espera que el MegaCLI este instalado en el siguiente path:

/opt/MegaRAID/MegaCli/MegaCli

El script se puede descargar directamente del SVN:

svn export http://nagios-systemadmin.googlecode.com/svn/trunk/check_perc_cache_policy 

O copiando el siguiente código:

#!/usr/bin/perl

package ldmegacli;

sub new {
    my $class = shift;
    my $self  = { 
	ad => shift,
	vd => shift,
	dp => shift,
	cp => shift
	};
	
    return bless $self, $class;
}

sub getAdapterNo {
	my( $self ) = @_;
	return $self->{ad};
}

sub getVDNo {
        my( $self ) = @_;
        return $self->{vd};
}

sub getDefaultCachePolicy {
	my( $self ) = @_;
	return $self->{dp};
}

sub getCurrentCachePolicy {
	my( $self ) = @_;
        return $self->{cp};
}

package main;

my @lds;

my $tmpad;
my $tmpvd;
my $tmpdp;
my $tmpcp;
my $countfields=0;

open (MEGACLI, "/opt/MegaRAID/MegaCli/MegaCli -LDInfo -LAll -aAll |");
while (<MEGACLI>){
	my $line=$_;
	#Adapter 0 -- Virtual Drive Information:
	if($line =~ m/^Adapter (\d+) /)
	{
		$tmpad=$1;
		$countfields=1;
	}
	#Virtual Disk: 0 (target id: 0)
	if($line =~ m/^Virtual Disk: (\d+) /)
	{
		$tmpvd=$1;
		$countfields++;
	}
	#Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
	if($line =~ m/^Default Cache Policy: (\w+)/)
	{
		$tmpdp=$1;
		$countfields++;
	}
	#Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
	if(($countfields==3)&&($line =~ m/^Current Cache Policy: (\w+)/))
	{
		push(@lds,new ldmegacli($tmpad,$tmpvd,$tmpdp,$1));
		$countfields=1;
	}
		
}
close MEGACLI;

my $totallds=@lds;

if($totallds==0)
{
	print "CRITICAL - No VirtualDisk found\n";
	exit 3;
}

my $exitcode=0;

foreach $ld (@lds) {
	if($ld->getDefaultCachePolicy() ne $ld->getCurrentCachePolicy())
	{
		print "CRITICAL - " if($exitcode==0);
		print "Adapter ".$ld->getAdapterNo()." VD ".$ld->getVDNo()." has set the default cache policy as ".$ld->getDefaultCachePolicy().", but its current policy is ".$ld->getCurrentCachePolicy();
		$exitcode=3;
	}	
}

if ($exitcode!= 3)
{
	print "OK - Default cache policy and current policy matches";
}

print "\n";
exit $exitcode;

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>