Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Avoid strict-aliasing related issues when compiling with optimization
[palacios.git] / linux_usr / v3_guest_mem_track_stat.pl
1 #!/usr/bin/perl -w
2
3 use IO::Handle;
4 use Getopt::Long;
5 use Time::HiRes qw / usleep / ;
6 use List::Util qw / min max /;
7
8 my $period=0;
9 my $numtimes=1;
10 my $i;
11 my $j;
12 my $core;
13 my $mhz=get_mhz();
14 my $topk=10;
15
16
17 &GetOptions("period=i"=>\$period, "numtimes=i"=>\$numtimes, "topk=i"=>\$topk);
18
19 $#ARGV==0 or die "v3_guest_mem_track_stat.pl [--numtimes=num(-1=forever)] [--period=milliseconds] [--topk=num] /dev/v3-vmN\n";
20
21 $vm=shift;
22
23 while ($numtimes--) { 
24
25   $data = `v3_guest_mem_track $vm snapshot text _`;
26
27   $data=~/Time:\s+(\d+)/ or die "Cannot parse for time\n";
28   $time=$1;
29
30   $data=~/Interval:\s+(\d+)\s+cycles/ or die "Cannot parse for time\n";
31   $interval=$1;
32   
33   $data=~/Access:\s+(\S+)/ or die "Cannot parse for access\n";
34   $access=$1;
35
36   $data=~/Reset:\s+(\S+)/ or die "Cannot parse for reset\n";
37   $reset=$1;
38   
39   $data=~/Cores:\s*(\d+)/ or die "Cannot parse for cores\n";
40   $numcores=$1;
41   
42   $data=~/Pages:\s*(\d+)/ or die "Cannot parse for pages\n";
43   $numpages=$1;
44   
45   #print $numpages;
46
47   for ($core=0;$core<$numcores;$core++) {
48     $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";
49     $start[$core]=$1;
50     $end[$core]=$2;
51     $pages[$core]=$3;
52     $bits[$core]=$4;
53   }
54
55   
56   $earliest=min(@start);
57   $latest=max(@end);
58
59   print "\033[2J\033[0;0H"; # clear
60
61   print "VM:\t$vm\n";
62   print "MHz:\t$mhz\n";
63   print "Time:\t$time seconds\n";
64   print "Access:\t$access\n";
65   print "Reset:\t$reset\n";
66   print "Inter:\t$interval cycles (",$interval/$mhz/1000," ms)\n";
67   print "Cores:\t$numcores\n";
68   print "Pages:\t$numpages\n";
69   print "Time:\t$earliest to $latest (",($latest-$earliest)/$mhz/1000," ms interval)\n\n";
70   
71   for ($core=0;$core<$numcores;$core++) {
72     print "Core $core: $pages[$core] pages ($start[$core] to $end[$core])\n";
73   }
74
75   for ($i=0; $i<$numcores; $i++) { 
76     for ($j=0; $j<=$i; $j++) { 
77 #      print "$i x $j\n";
78       $common[$i][$j]=count(intersect($bits[$i],$bits[$j]));
79     }
80   }
81   
82   print "\nIntersection (count)\n\n";
83   
84   for ($i=0;$i<$numcores;$i++) { 
85     print "\t$i";
86   }
87   print "\n";
88
89   for ($i=0;$i<$numcores;$i++) { 
90     print "$i : ";
91     for ($j=0;$j<=$i;$j++) { 
92       print  "\t",$common[$i][$j];
93     }
94     print "\n";
95   }
96
97   print "\nIntersection (%)\n\n";
98   
99   for ($i=0;$i<$numcores;$i++) { 
100     print "\t$i";
101   }
102   print "\n";
103
104   for ($i=0;$i<$numcores;$i++) { 
105     print "$i :";
106     for ($j=0;$j<=$i;$j++) { 
107       print "\t", sprintf("%4.2f",($common[$i][$j]/$numpages));
108     }
109     print "\n";
110   }
111
112   %ph=page_hash(\@bits);
113
114   @pageranks = sort { $#{$ph{$b}} != $#{$ph{$a}} ? ($#{$ph{$b}} <=> $#{$ph{$a}}) : $a<=>$b } keys %ph;
115
116   print "\nPages by popularity and sharing cores (top-$topk)\n\n";
117
118   print "Page\tCores\n";
119   for ($i=0;$i<min($topk,$#pageranks+1);$i++) { 
120     print $pageranks[$i],"\t", join(" ",@{$ph{$pageranks[$i]}}),"\n";
121   }
122   print "\n";
123   
124
125
126   if ($period) {  
127     usleep($period*1000);
128   }
129 }
130
131
132
133   
134
135 sub count {
136   my $data = shift;
137   my $n = length($data);
138   my $c =0;
139   my $i;
140   
141   for ($i=0;$i<$n;$i++) {
142     if ((substr($data,$i,1) eq "X")) { 
143       $c++;
144     }
145   }
146
147   return $c;
148 }
149
150
151 sub intersect {
152   my ($left, $right)=@_;
153
154   my $n;
155   my $i;
156   my $out="";
157
158   $n=length($left);
159
160   $out="." x $n;
161
162
163   for ($i=0;$i<$n;$i++) {
164     if ((substr($left,$i,1) eq "X") && (substr($right,$i,1) eq "X")) { 
165       substr($out,$i,1)="X";
166     } else {
167       substr($out,$i,1)=".";
168     }
169   }
170
171   return $out;
172 }
173
174
175 sub get_mhz  {
176   my $data=`cat /proc/cpuinfo`;
177
178   $data=~/cpu\s+MHz\s+:\s+(\S+)/ or die "Cannot find MHz\n";
179
180   return $1;
181 }
182
183
184 sub page_hash {
185   my $br=shift;
186   my $i;
187   my $j;
188   my %h;
189
190   for ($i=0;$i<=$#{$br};$i++) {
191     for ($j=0;$j<length($br->[$i]);$j++) {
192       if ((substr($br->[$i],$j,1) eq "X")) {
193         push @{$h{$j}}, $i;
194       }
195     }
196   }
197    
198   return %h;
199
200 }