#!/usr/bin/perl #Author: Jose Juan Mora (http://jjmora.es/) #Usage: ./cpu_perf.pl ##data show: Cpu saturation $SLEEP=3; $MEM=0; $CPU=0; $INICIO=0; for ($i=0;$i<=$#ARGV;$i++) { if ($ARGV[$i]=~/-i/) { if ($ARGV[$i+1]=~/\d+/) {$SLEEP=$ARGV[$i+1];} } if ($ARGV[$i]=~/-\w*m\w*/) {$MEM=1} if ($ARGV[$i]=~/-\w*c\w*/) {$CPU=1} if ($ARGV[$i]=~/-\w*t\w*/) {$TIME=1} if ($ARGV[$i]=~/-h/) {help();exit 0;} } while(1) { open(CMD,"kstat -p -m cpu_stat |"); while() { $linea=$_; if ($linea=~/^(.*):\d+:(.*):(\S+)\s+(\d+)/) { $cpu{$2}{$3}=$4; $ncpu=$2; $var=$3; $val=(($cpu{$ncpu}{$var}-$last_cpu{$ncpu}{$var})/$SLEEP); #printf("\n %s \t %s\t\t %.1f /s ",$ncpu,$var,$val); $last_cpu{$ncpu}{$var}=$cpu{$ncpu}{$var}; $cpu{$ncpu}{$var}=$val; } } close CMD; open(CMD,"kstat -p -n sysinfo |"); while() { $linea=$_; if ($linea=~/^(.*):\d+:(.*):(\S+)\s+(\d+)/) { $sysinfo{$3}=$4; $var=$3; $val=(($sysinfo{$var}-$last_sysinfo{$var})/$SLEEP); $last_sysinfo{$var}=$sysinfo{$var}; $sysinfo{$var}=$val; } } if ($TIME) { ($seg,$min,$hour)=localtime(); printf("\nTime %02d:%02d:%02d\n",$hour,$min,$seg); } printf("cpu usr ker id rq rb rw iow "); if ($CPU) { printf(" mig sysc mtex nthd xcal swch ");} if ($MEM) {printf("pgin pout swi swo mf sr prec sema msg namei")} print "\n"; $brunque=1; $bwaiting=1; foreach $ncpu (keys %cpu) { $cad= $ncpu; $cad=~s/cpu_stat//g; printf("%d % 3d % 3d % 4d ",$cad,$cpu{$ncpu}{user},$cpu{$ncpu}{kernel},$cpu{$ncpu}{idle}); printf("% 3d % 2d % 2d ",$sysinfo{runque},$sysinfo{waiting},$sysinfo{swpque}); printf("% 3d",$cpu{$ncpu}{iowait}); if ($CPU && $INICIO) { printf("% 5d% 6d% 6d% 5d% 6d% 6d",$cpu{$ncpu}{cpumigrate},$cpu{$ncpu}{syscall},$cpu{$ncpu}{mutex_adenters},$cpu{$ncpu}{nthreads},$cpu{$ncpu}{xcalls},$cpu{$ncpu}{pswitch}); } if ($MEM && $INICIO) { printf(" % 4d% 5d% 5d% 5d% 5d% 5d% 6d ",$cpu{$ncpu}{pgin},$cpu{$ncpu}{pgout},$cpu{$ncpu}{pgswapin},$cpu{$ncpu}{pgswapout},$cpu{$ncpu}{maj_fault},$cpu{$ncpu}{scan},$cpu{$ncpu}{pgrec}); printf("% 4d% 5d% 7d",$cpu{$ncpu}{sema},$cpu{$ncpu}{msg},$cpu{$ncpu}{namei}); } if ($cpu{$ncpu}{mutex_adenters}>200) { if ($cpu{$ncpu}{mutex_adenters}>400) {$msg="$msg\n [$ncpu] El num de mutex es MUY alto. Posible problema de bloqueos entre threads.";} else {$msg="$msg\n [$ncpu] El num de mutex es alto. Posible problema de bloqueos entre threads.";} $sys=$cpu{$ncpu}{kernel}; $usr=$cpu{$ncpu}{user}; if ($usr < 1){$usr=1} if ($sys < 1){$sys=1} if (($usr/$sys) > 1) {$msg="$msg Proceso de USR."} else {$msg="$msg Proceso de SYS."} } if ($cpu{$ncpu}{iowait}>25) {$msg="$msg\n [$ncpu] iowait es alto. Posible contencion en los discos"} if ($cpu{$ncpu}{scan}>200) { if ($cpu{$ncpu}{scan}>300) {$msg="$msg\n [$ncpu] Scan Rate es MUY alto. Posible problema con la memoria."} else {$msg="$msg\n [$ncpu] Scan Rate es alto en CPU $ncpu."} } if (($sysinfo{runque} > 5) && ($brunque)) {$msg="$msg\n [runque] El num de procesos la cola de ejecución es alto." } if (($sysinfo{waiting} > 5) && ($bwaiting)) {$msg="$msg\n [runque] El num de procesos esperando IO es alto."} print "\n"; } $msg=~s/cpu_stat//g; if (($msg!~/^$/) && ($INICIO)) {print "$msg\n"} $msg=""; sleep $SLEEP; $INICIO=1; } sub help() { print "\nUso: cpu_perf.pl [-cm] [-i ]"; print "\n\n\t -c Estadisticas de CPU."; print "\n\t -m Estadisticas de memoria."; print "\n\t -i Intervalo de segundos"; print "\n\n"; }