Projstat.pl

Page last edited hace 2181 días 2 horas
De Solaris-ES
Saltar a: navegación, buscar
#!/usr/bin/perl

# *********************************************************************** #
#                                                                         #
#  SCRIPT: projstat                                                       #
#  AUTHOR: mariano.obarrio@gmail.com                                      #
#    DATE: 11/05/10                                                       #
#     REV: 0.1                                                            #
#                                                                         #
#  PLATFORM: Solaris 10                                                   #
#                                                                         #
#  PROPOSITO: Recolecta estadisticas de los proyectos.                    #
#             Es la union del "prstat -J" y "rcapstat".                   #
#                                                                         #
#  ESTE ESCRIPT ES LLAMADO DESDE:                                         #
#                                                                         #
#     Linea de comando                                                    #
#                                                                         #
#                                                                         #
#  EXIT CODES:                                                            #
#                                                                         #
#  NOTE: You must have root privileges to execute this script.            #
#                                                                         #
# Historico:                                                              #
#    Mariano 11/05/2010 -> Rev. 0.1                                       #
#    Mariano 10/06/2010 ->                                                #
#                                                                         #
# *********************************************************************** #
use Switch;
use Getopt::Std;
use IO;
use POSIX;

getopts("c:i:d:oh", \%args);

my $DEBUG     = ($args{d}?$args{d}:0);
my $interact  = ($args{i}?$args{i}:0);
my $count     = ($args{c}?$args{c}:1);
my $Pmap      = "/usr/bin/pmap";
my $Prtconf   = "/usr/sbin/prtconf -v";
my $Prstat    = "/usr/bin/prstat -cJ -n1 1 1";
my $Rcapstat  = "/usr/bin/rcapstat 1 2";
my $Grep      = "/usr/bin/grep";
my $Egrep     = "/usr/bin/egrep";
my $Awk       = "/usr/bin/awk";
my $Ps        = "/usr/bin/ps";
my $Ps2       = "/usr/ucb/ps";
my $Sort      = "/usr/bin/sort";
my $TotMem    = 0;
my $start     = strftime "%Y-%m-%d %H:%M:%S", localtime;
my $temp      = strftime "%Y%m%d%H%M%S", localtime;
if($args{o})
{
  my $filename  = "./projstat_$temp.out";
  open (OUTFILE, ">$filename") or die "an error occured: $!"; 
  print OUTFILE "###\n";
  print OUTFILE "### Inicio        : $start\n";
  print OUTFILE "### Interacciones : $count\n";
  print OUTFILE "### Intervalo     : $interact (Seg.)\n";
  print OUTFILE "### Salida        : $filename\n" if($args{o});
  print OUTFILE "###\n";
  print OUTFILE "FECHA               PROJID NPROC     SWAP      RSS      CAP       AT  AVGAT       PG  AVGPG  MEMRSS  MEMASG    CPU PROYECTO\n";
}
else
{ 
  print "###\n";
  print "### Inicio        : $start\n";
  print "### Interacciones : $count\n";
  print "### Intervalo     : $interact (Seg.)\n";
  print "###\n";
  print "FECHA               PROJID NPROC     SWAP      RSS      CAP       AT  AVGAT       PG  AVGPG  MEMRSS  MEMASG    CPU PROYECTO\n";
}

if($args{h}){ usage(); exit; }

### Calcula el total de memoria del equipo
###
### prtconf -v|grep "Memory size"
###
$cmd = "$Prtconf|$Grep 'Memory size'";
$TotMem = qx($cmd);
$TotMem =~ s/^.+: //;
$TotMem =~ s/ .+$//;
###


###
### prstat -cJ -n1 1 1
### DESDE: PROJID   HASTA: load averages
###
for($i=1;$i <= $count;$i++)
{
  my %Salida = ();
  my $cmd = "$Prstat 2>/dev/null";
  my $bool = 0;
  @out = qx($cmd);
  foreach $line (@out)
  {
    chomp($line);                  # no newline
    $bool = 1 if($line =~ m/PROJID/);
    $bool = 0 if($line =~ m/load averages/);
    if($bool == 1)
    {
       next if($line =~ m/PROJID/);
       $line =~ s/ +/ /g; # Elimina multiples espacios en blanco
       $line =~ s/^ +//g; # Elimina el espacio inicial
       $line =~ s/ $//g;  # Elimina el espacio Final
       $line =~ s/ /;/g;  # Reemplaza los blancos por dospuntos
       # Estructura de la linea
       # PROJID    NPROC  SWAP   RSS    MEMORY      TIME  CPU PROJECT
       ($PROJID,$NPROC,$SWAP,$RSS,$MEMORY,$TIME,$CPU,$PROJECT) = split(/;/,$line);
       $Salida{$PROJID}{nproc}   = $NPROC;
       $Salida{$PROJID}{time}    = $TIME;
       $Salida{$PROJID}{memory}  = "$MEMORY";
       $Salida{$PROJID}{cpu}     = "$CPU";
    }
  }
  my $nowstr    = strftime "%Y-%m-%d %H:%M:%S", localtime;
  my $cmd = "$Rcapstat 2>/dev/null";
  my $bool = 0;
  @out = qx($cmd);
  foreach $line (@out)
  {
    chomp($line);                  # no newline
    $bool++ if($line =~ m/id project/);
    next if($bool < 2);
    next if($line =~ m/id project/);
    $line =~ s/ +/ /g; # Elimina multiples espacios en blanco
    $line =~ s/^ +//g; # Elimina el espacio inicial
    $line =~ s/ $//g;  # Elimina el espacio Final
    $line =~ s/ /;/g;  # Reemplaza los blancos por dospuntos
    # id project         nproc    vm   rss   cap    at avgat    pg avgpg
    # $PROJID,$PROJECT,$NPROC,$SWAP,$RSS,$CAP,$AT,$AVGAT,$PG,$AVGPG
    ($PROJID,$PROJECT,$NPROC,$SWAP,$RSS,$CAP,$AT,$AVGAT,$PG,$AVGPG) = split(/;/,$line);
    #print "$PROJID - EXISTE\n" if(exists($Salida{$PROJID}{memory}));
    #$Salida{$PROJID}{swap}    = $SWAP;
    #$Salida{$PROJID}{rss}     = $RSS;
    #$Salida{$PROJID}{cap}     = $CAP;
    #$Salida{$PROJID}{at}      = $AT;
    #$Salida{$PROJID}{avgat}   = $AVGAT;
    #$Salida{$PROJID}{pg}      = $PG;
    #$Salida{$PROJID}{avgpg}   = $AVGPG;
    #$Salida{$PROJID}{project} = $PROJECT;
    #$MEMASG = ceil(($Salida{$PROJID}{cap}/$TotMem)*100);
    #$MEMASG = floor(($Salida{$PROJID}{cap}/$TotMem)*100);
    $MEMASG = ($CAP/$TotMem)*100;
    if($args{o})
    {
       printf(OUTFILE "%19s %6s %5s %8s %8s %8s %8s %6s %8s %6s %7s %6s%1s %6s %s\n", 
		$nowstr, 
		$PROJID, 
		$Salida{$PROJID}{nproc}, 
		$SWAP, 
		$RSS, 
		$CAP, 
		$AT, 
		$AVGAT, 
		$PG, 
		$AVGPG, 
		$Salida{$PROJID}{memory},
		$MEMASG, '%', 
		$Salida{$PROJID}{cpu}, 
		$PROJECT 
	);
    }
    else
    {
       printf("%19s %6s %5s %8s %8s %8s %8s %6s %8s %6s %7s %6s%1s %6s %s\n", 
		$nowstr, 
		$PROJID, 
		$Salida{$PROJID}{nproc}, 
		$SWAP, 
		$RSS, 
		$CAP, 
		$AT, 
		$AVGAT, 
		$PG, 
		$AVGPG, 
		$Salida{$PROJID}{memory},
		$MEMASG, '%', 
		$Salida{$PROJID}{cpu}, 
		$PROJECT 
	);
    }
  }
  sleep($interact) if($i<$count);
}
if($args{o}) { close(OUTFILE); }
print "# Recoleccion finalizada.\n";
;


sub usage{
        print "\n-- projstat: Estadisticas de los proyectos de Solaris v0.1 by Mariano J. Obarrio Miles (http://groups.google.es/group/solaris-es)\n\n";
        print "Usage:\n";
        print "\n";
        print "$0 -h \n";
        print "       -c: Interacciones\n";
        print "       -i: Intervalo de tiempo en segundos.\n";
        print "       -o: Salida a fichero\n";
        print "       -h: Help\n";
	print " Nota: -c 120 -i 30 == 1Hs, -c 960 -i 30 == 8Hs\n";
        print "\nEj.: $0\n\n";
        exit;
}

# ******************************************************************************************************************************** #
# EJEMPLO DE EJECUCION E INFORMACION DE LOS DATOS QUE SE RECOLECTAN                                                                #
# ******************************************************************************************************************************** #
# ./projstat -h                                                                                                                    #
#            -c[numerico]: Interacciones                                                                                           #
#            -i[numerico]: Intervalo de tiempo en segundos.                                                                        #
#            -o: Salida a fichero                                                                                                  #
#            -h: Help                                                                                                              #
#  Nota: -c 120 -i 30 == 1Hs, -c 960 -i 30 == 8Hs                                                                                  #
#                                                                                                                                  #
# ./projstat -c1 -i1                                                                                                               #
# ###                                                                                                                              #
# ### Inicio        : 2010-07-06 11:43:26                                                                                          #
# ### Interacciones : 1                                                                                                            #
# ### Intervalo     : 0 (Seg.)                                                                                                     #
# ###                                                                                                                              #
# FECHA               PROJID NPROC     SWAP      RSS      CAP       AT  AVGAT       PG  AVGPG  MEMRSS  MEMASG    CPU PROYECTO      #
# 2010-07-06 11:43:26    100    62    2543M    2362M    6144M       0K     0K       0K     0K     14%   37.5%   3.4% user.oracle   #
# 2010-07-06 11:43:26    101    35     953M     903M    9216M       0K     0K       0K     0K    5.5%  56.25%   0.5% user.postgres #
# 2010-07-06 11:43:26    103    21    1508M    1552M    2048M       0K     0K       0K     0K    9.5%   12.5%   0.0% pkg57         #
# # Recoleccion finalizada.                                                                                                        #
#                                                                                                                                  #
# FECHA   : Hora y fecha de la ejecicion. (projstat)                                                                               #
# PROJID  : ID del Proyecto. (prstat -J y rcapstat)                                                                                #
# NPROC   : Numero de Procesos del proyecto (prstat -J)                                                                            #
# SWAP    : Tamaño total de la memoria virtual para un proyecto o una zona, incluye todos los archivos y dispositivos              #
#           mapeados en kilobytes (K), megabytes (M) o gigabytes (G) (rcapstat)                                                    #
# RSS     : Tamano total de la memoria residente (Resident Set Size - RSS) de un proyecto o una zona en kilobytes (K),             #
#           megabytes (M) o gigabytes (G)                                                                                          #
#           La cantidad no cuenta las paginas compartidas (shared pages) (rcapstat)                                                #
# CAP     : Es la cuota asignada de memoria RSS para el proyecto o la zona. (rcapstat)                                             #
# AT      : La cantidad total de memoria que RCAPD intenta paginar.                                                                #
#           Paginacion es el acto de reacomodar porciones de memoria llamadas paginas, de o hacia la memoria fisica.               #
#           RCAPD reacomoda las paginas menos utilizadas. (rcapstat)                                                               #
# AVGAT   : Es la cantidad promedio de memoria que RCAPD intenta paginar durante un ciclo de muestreo.                             #
#           La tasa de muestreos se puede definir con el comando RCAPDADM. (rcapstat)                                              #
# PG      : Es una estimacion de la cantidad de memoria que RCAPD pagino exitisamente. (rcapstat)                                  #
# AVG PG  : Es una estimacion promedio de la cantidad de memoria que RCAPD pagino durante un ciclo de muestreo.                    #
#           La tasa de muestreos se puede definir con el comando RCAPDADM. (rcapstat)                                              #
# MEMRSS  : Muestra el porcentaje de memoria que esta utilizando el proyecto o la zona actualmente. (projstat)                     #
# MEMASG  : Muestra el porcentaje de memoria que tiene asignado como maximo (CAP) el proyecto o la zona. (projstat)                #
# CPU     : Muestra el consumo de CPU que esta teniendo el projecto o la zona. (prstat -J)                                         #
# PROYECTO: Muestra el nombre asignado al projecto. (prstat -J)                                                                    #
#                                                                                                                                  #
# Nota: Los Porcentajes de consumo de memoria se obtienen sobre el total de la memoria del equipo.                                 #
# ******************************************************************************************************************************** #