From: Peter Dinda Date: Mon, 30 Jun 2014 22:35:05 +0000 (-0500) Subject: Visualization and stats scripts for memory access tracking X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=afb92c93a4ab44461270987cd4da9844ea12fd3a Visualization and stats scripts for memory access tracking --- diff --git a/linux_usr/v3_guest_mem_track_stat.pl b/linux_usr/v3_guest_mem_track_stat.pl new file mode 100755 index 0000000..ee0a9b1 --- /dev/null +++ b/linux_usr/v3_guest_mem_track_stat.pl @@ -0,0 +1,200 @@ +#!/usr/bin/perl -w + +use IO::Handle; +use Getopt::Long; +use Time::HiRes qw / usleep / ; +use List::Util qw / min max /; + +my $period=0; +my $numtimes=1; +my $i; +my $j; +my $core; +my $mhz=get_mhz(); +my $topk=10; + + +&GetOptions("period=i"=>\$period, "numtimes=i"=>\$numtimes, "topk=i"=>\$topk); + +$#ARGV==0 or die "v3_guest_mem_track_stat.pl [--numtimes=num(-1=forever)] [--period=milliseconds] [--topk=num] /dev/v3-vmN\n"; + +$vm=shift; + +while ($numtimes--) { + + $data = `v3_guest_mem_track $vm snapshot text _`; + + $data=~/Time:\s+(\d+)/ or die "Cannot parse for time\n"; + $time=$1; + + $data=~/Interval:\s+(\d+)\s+cycles/ or die "Cannot parse for time\n"; + $interval=$1; + + $data=~/Access:\s+(\S+)/ or die "Cannot parse for access\n"; + $access=$1; + + $data=~/Reset:\s+(\S+)/ or die "Cannot parse for reset\n"; + $reset=$1; + + $data=~/Cores:\s*(\d+)/ or die "Cannot parse for cores\n"; + $numcores=$1; + + $data=~/Pages:\s*(\d+)/ or die "Cannot parse for pages\n"; + $numpages=$1; + + #print $numpages; + + for ($core=0;$core<$numcores;$core++) { + $data=~/Core\s+$core\s+\((\d+)\s+to\s+(\d+)\,\s+(\d+)\s+pages\s+touched\)\s+\:\s+(\S+)/ or die "Cannot parse core $core\n"; + $start[$core]=$1; + $end[$core]=$2; + $pages[$core]=$3; + $bits[$core]=$4; + } + + + $earliest=min(@start); + $latest=max(@end); + + print "\033[2J\033[0;0H"; # clear + + print "VM:\t$vm\n"; + print "MHz:\t$mhz\n"; + print "Time:\t$time seconds\n"; + print "Access:\t$access\n"; + print "Reset:\t$reset\n"; + print "Inter:\t$interval cycles (",$interval/$mhz/1000," ms)\n"; + print "Cores:\t$numcores\n"; + print "Pages:\t$numpages\n"; + print "Time:\t$earliest to $latest (",($latest-$earliest)/$mhz/1000," ms interval)\n\n"; + + for ($core=0;$core<$numcores;$core++) { + print "Core $core: $pages[$core] pages ($start[$core] to $end[$core])\n"; + } + + for ($i=0; $i<$numcores; $i++) { + for ($j=0; $j<=$i; $j++) { +# print "$i x $j\n"; + $common[$i][$j]=count(intersect($bits[$i],$bits[$j])); + } + } + + print "\nIntersection (count)\n\n"; + + for ($i=0;$i<$numcores;$i++) { + print "\t$i"; + } + print "\n"; + + for ($i=0;$i<$numcores;$i++) { + print "$i : "; + for ($j=0;$j<=$i;$j++) { + print "\t",$common[$i][$j]; + } + print "\n"; + } + + print "\nIntersection (%)\n\n"; + + for ($i=0;$i<$numcores;$i++) { + print "\t$i"; + } + print "\n"; + + for ($i=0;$i<$numcores;$i++) { + print "$i :"; + for ($j=0;$j<=$i;$j++) { + print "\t", sprintf("%4.2f",($common[$i][$j]/$numpages)); + } + print "\n"; + } + + %ph=page_hash(\@bits); + + @pageranks = sort { $#{$ph{$b}} != $#{$ph{$a}} ? ($#{$ph{$b}} <=> $#{$ph{$a}}) : $a<=>$b } keys %ph; + + print "\nPages by popularity and sharing cores (top-$topk)\n\n"; + + print "Page\tCores\n"; + for ($i=0;$i[$i]);$j++) { + if ((substr($br->[$i],$j,1) eq "X")) { + push @{$h{$j}}, $i; + } + } + } + + return %h; + +} diff --git a/linux_usr/v3_guest_mem_track_viz.pl b/linux_usr/v3_guest_mem_track_viz.pl new file mode 100755 index 0000000..44be0ad --- /dev/null +++ b/linux_usr/v3_guest_mem_track_viz.pl @@ -0,0 +1,62 @@ +#!/usr/bin/perl -w + +use IO::Handle; +use Getopt::Long; +use Time::HiRes qw /usleep/; + +$period=0; +$numtimes=1; + +&GetOptions("period=i"=>\$period, "numtimes=i"=>\$numtimes); + +$#ARGV==0 or die "v3_guest_mem_track_viz.pl [--numtimes=num(-1=forever)] [--period=milliseconds] /dev/v3-vmN\n"; + +$vm=shift; + +open(G,"|gnuplot") or die "Cannot open gnuplot\n"; +G->autoflush(1); +STDIN->autoflush(1); + +while ($numtimes--) { + + $data = `v3_guest_mem_track $vm snapshot text _`; + + $data=~/Cores:\s*(\d+)/ or die "Cannot parse for cores\n"; + $numcores=$1; + + $data=~/Pages:\s*(\d+)/ or die "Cannot parse for pages\n"; + $numpages=$1; + + #print $numpages; + + for ($core=0;$core<$numcores;$core++) { + $data=~/Core\s+$core\s+\(.*\)\s+\:\s+(\S+)/ or die "Cannot parse core $core\n"; + $bits[$core]=$1; + } + + $side=int(sqrt($numpages)); + + $x=$side; + $y=int($numpages/$side); + + print G "set xrange [0:$x]\n"; + print G "set yrange [0:$y]\n"; + + print G "plot ", join(",", map {"'-' using 1:2 with points title 'core $_' "} (0..$numcores-1) ),"\n"; + for ($core=0;$core<$numcores;$core++) { + for ($i=0;$i<$numpages;$i++) { + # print substr($bits,$i,1); + if (substr($bits[$core],$i,1) eq "X") { + print G join("\t", int($i/$side), $i % $side), "\n"; + } + } + print G "e\n"; + } + + if ($period) { + usleep($period*1000); + } +} + +print "Hit enter to finish\n"; +;