1 5184 ek110237 #!/usr/bin/perl 2 5184 ek110237 # 3 5184 ek110237 # CDDL HEADER START 4 5184 ek110237 # 5 5184 ek110237 # The contents of this file are subject to the terms of the 6 5184 ek110237 # Common Development and Distribution License (the "License"). 7 5184 ek110237 # You may not use this file except in compliance with the License. 8 5184 ek110237 # 9 5184 ek110237 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 5184 ek110237 # or http://www.opensolaris.org/os/licensing. 11 5184 ek110237 # See the License for the specific language governing permissions 12 5184 ek110237 # and limitations under the License. 13 5184 ek110237 # 14 5184 ek110237 # When distributing Covered Code, include this CDDL HEADER in each 15 5184 ek110237 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 5184 ek110237 # If applicable, add the following below this CDDL HEADER, with the 17 5184 ek110237 # fields enclosed by brackets "[]" replaced with your own identifying 18 5184 ek110237 # information: Portions Copyright [yyyy] [name of copyright owner] 19 5184 ek110237 # 20 5184 ek110237 # CDDL HEADER END 21 5184 ek110237 # 22 5184 ek110237 # 23 6750 ek110237 # Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 5184 ek110237 # Use is subject to license terms. 25 5184 ek110237 # 26 5184 ek110237 # ident "%Z%%M% %I% %E% SMI" 27 5184 ek110237 # 28 5184 ek110237 29 5184 ek110237 # 30 5184 ek110237 # Compare filebench results 31 5184 ek110237 # 32 5184 ek110237 # Usage: filebench_summary <dir1> <dir2> ... 33 5184 ek110237 # 34 5184 ek110237 35 5184 ek110237 use CGI ':standard'; 36 5184 ek110237 37 5184 ek110237 $maxiopsoverall = 0; 38 5184 ek110237 $maxiopsrate = 0; 39 5184 ek110237 $maxbandwidth = 0; 40 5184 ek110237 41 5184 ek110237 # 42 5184 ek110237 # Create html and text 43 5184 ek110237 # 44 5184 ek110237 open (HTML, ">index.html"); 45 5184 ek110237 print HTML start_html(-title=>'Filebench'); 46 5184 ek110237 print HTML "<body>"; 47 5184 ek110237 # 48 5184 ek110237 # Print aggregate flowop stats 49 5184 ek110237 # 50 5184 ek110237 foreach $dir (@ARGV) { 51 5184 ek110237 52 5184 ek110237 printf ("Generating html for $dir\n"); 53 5184 ek110237 open (PROFILE, "<$dir/thisrun.prof"); 54 5184 ek110237 $description = <PROFILE>; 55 5184 ek110237 $description =~ s/.*"(.+)".*/$1/; 56 5184 ek110237 57 5184 ek110237 $files = `ls $dir/stats.*.out $dir/*/stats.*.out 2>/dev/null`; 58 5184 ek110237 foreach $file (split(/\n/, $files)) { 59 5184 ek110237 print "file = $file\n"; 60 6750 ek110237 61 6750 ek110237 # Search backwards in-case the hostname is of FQDN or there's a 62 6750 ek110237 # '.' in $dir. 63 6750 ek110237 $rstr = reverse $file; 64 6750 ek110237 ($rfstype, $rworkload, $rprefix) = split(/\./, $rstr); 65 6750 ek110237 $prefix = reverse $rprefix; 66 6750 ek110237 $workload = reverse $rworkload; 67 6750 ek110237 $fstype = reverse $rfstype; 68 6750 ek110237 69 5184 ek110237 $dataset = $dir; 70 5184 ek110237 $dataset =~ s/.*\/(.+)$/$1/; 71 5184 ek110237 $dataset =~ s/\/$//; 72 5184 ek110237 $desc{$dataset} = "$description"; 73 6750 ek110237 74 5184 ek110237 open (STATS, $file); 75 5184 ek110237 $tmp = <STATS>; 76 5184 ek110237 while (<STATS>) { 77 5184 ek110237 ($flowop, $ops, $bandwidth, $latency, $cpu, $wait, $seconds) = split(/[ \t]+/, $_); 78 5184 ek110237 79 5184 ek110237 if (/^$/) { 80 5184 ek110237 $tmp = <STATS>; 81 5184 ek110237 ($fluff, $opcnt, $ops, $reads, $writes, $bandwidth, 82 5184 ek110237 $cpu) = split(/[ \tA-z:\/,]+/, $tmp); 83 5184 ek110237 $ops{$workload, $dataset} = $ops; 84 5184 ek110237 last; 85 5184 ek110237 } 86 5184 ek110237 87 5184 ek110237 $ops =~ s/ops\/s//; 88 5184 ek110237 $bandwidth =~ s/mb\/s//; 89 5184 ek110237 $latency =~ s/ms\/op//; 90 5184 ek110237 $cpu =~ s/us\/op//; 91 5184 ek110237 92 5184 ek110237 # Collapse shadow reads into single metric 93 5184 ek110237 if ($flowop =~ /shadowread/) { 94 5184 ek110237 $flowop = "shadow-read"; 95 5184 ek110237 } 96 5184 ek110237 97 5184 ek110237 # Collapse database writes into single metric 98 5184 ek110237 if ($flowop =~ /db.*write/) { 99 5184 ek110237 $flowop = "db-write"; 100 5184 ek110237 } 101 5184 ek110237 102 5184 ek110237 # Collapse database writes into single metric 103 5184 ek110237 if ($flowop =~ /db.*write/) { 104 5184 ek110237 $flowop = "db-write"; 105 5184 ek110237 } 106 5184 ek110237 107 5184 ek110237 $datasets{$dataset} = $dataset; 108 5184 ek110237 $workloads{$workload} = $workload; 109 5184 ek110237 110 5184 ek110237 $flowops{$flowop} = $flowop; 111 5184 ek110237 $wkl_flowops{$flowop, $workload} = $flowop; 112 5184 ek110237 $wkl_workload{$flowop, $workload} = $workload; 113 5184 ek110237 $flow_ops{$flowop, $workload, $dataset} += $ops; 114 5184 ek110237 $flow_bandwidth{$flowop, $workload, $dataset} += $bandwidth; 115 5184 ek110237 $flow_latency{$flowop, $workload, $dataset} += $latency; 116 5184 ek110237 $flow_cpu{$flowop, $workload, $dataset} += $cpu; 117 5184 ek110237 118 5184 ek110237 $bandwidth{$workload, $dataset} += $bandwidth; 119 5184 ek110237 $latency{$workload, $dataset} += $latency; 120 5184 ek110237 $cpu{$workload, $dataset} += $cpu; 121 5184 ek110237 122 5184 ek110237 $flowopcnt{$flowop, $workload, $dataset}++; 123 5184 ek110237 $workloadcnt{$workload, $dataset}++; 124 5184 ek110237 } 125 5184 ek110237 close(STATS); 126 5184 ek110237 } 127 5184 ek110237 } 128 5184 ek110237 129 5184 ek110237 # HTML IOPS 130 5184 ek110237 print HTML h1('Throughput breakdown (ops per second)'); 131 5184 ek110237 print HTML "<table border=1>"; 132 5184 ek110237 print HTML "<b><td>Workload</td>"; 133 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 134 5184 ek110237 print HTML "<td>$desc{$dataset}</td>"; 135 5184 ek110237 } 136 5184 ek110237 print HTML "</b></tr>"; 137 5184 ek110237 138 5184 ek110237 foreach $workload (sort (keys %workloads)) { 139 5184 ek110237 print HTML "<b><tr><td>$workload</td>"; 140 5184 ek110237 $last = 0; 141 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 142 5184 ek110237 $color = "white"; 143 5184 ek110237 $this = $ops{$workload, $dataset}; 144 5184 ek110237 if ($last && ($this - $last) < ($last * -0.1)) { 145 5184 ek110237 $color = "red"; 146 5184 ek110237 } 147 5184 ek110237 if ($last && ($this - $last) > ($last * 0.1)) { 148 5184 ek110237 $color = "green"; 149 5184 ek110237 } 150 5184 ek110237 printf HTML ("<td>%d</td\n", $this); 151 5184 ek110237 $last = $ops{$workload, $dataset}; 152 5184 ek110237 } 153 5184 ek110237 print HTML "</b></tr>"; 154 5184 ek110237 } 155 5184 ek110237 print HTML "</table>"; 156 5184 ek110237 157 5184 ek110237 # HTML Bandwidth 158 5184 ek110237 print HTML h1('Bandwidth breakdown (MB/s)'); 159 5184 ek110237 print HTML "<table border=1>"; 160 5184 ek110237 print HTML "<td>Workload</td>"; 161 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 162 5184 ek110237 print HTML "<td>$desc{$dataset}</td>"; 163 5184 ek110237 } 164 5184 ek110237 print HTML "</tr>"; 165 5184 ek110237 foreach $workload (sort (keys %workloads)) { 166 5184 ek110237 $bandwidth = 0; 167 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 168 5184 ek110237 $bandwidth += $bandwidth{$workload, $dataset}; 169 5184 ek110237 } 170 5184 ek110237 next if ($bandwidth == 0); 171 5184 ek110237 print HTML "<tr><td>$workload</td>"; 172 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 173 5184 ek110237 printf HTML ("<td>%d</td>\n", $bandwidth{$workload, $dataset}); 174 5184 ek110237 } 175 5184 ek110237 print HTML "</tr>"; 176 5184 ek110237 } 177 5184 ek110237 print HTML "</table>"; 178 5184 ek110237 179 5184 ek110237 # HTML Latency 180 5184 ek110237 print HTML h1('Latency breakdown (ms per op)'); 181 5184 ek110237 print HTML "<table border=1>"; 182 5184 ek110237 print HTML "<td>Workload</td>"; 183 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 184 5184 ek110237 print HTML "<td>$desc{$dataset}</td>"; 185 5184 ek110237 } 186 5184 ek110237 187 5184 ek110237 print HTML "</tr>"; 188 5184 ek110237 foreach $workload (sort (keys %workloads)) { 189 5184 ek110237 print HTML "<tr><td>$workload</td>"; 190 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 191 5184 ek110237 if ( $workloadcnt{$workload, $dataset}) { 192 5184 ek110237 printf HTML ("<td>%.1f</td>", $latency{$workload, 193 5184 ek110237 $dataset} / $workloadcnt{$workload, $dataset}); 194 5184 ek110237 } else { 195 5184 ek110237 printf HTML ("<td></td>"); 196 5184 ek110237 } 197 5184 ek110237 } 198 5184 ek110237 print HTML "</tr>"; 199 5184 ek110237 foreach $flowop (keys %wkl_flowops) { 200 5184 ek110237 next if ("$wkl_workload{$flowop}" ne "$workload"); 201 5184 ek110237 print HTML "<tr><td><i>__$wkl_flowops{$flowop}</td>"; 202 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 203 5184 ek110237 if ( $flowopcnt{$flowop, $dataset}) { 204 5184 ek110237 printf HTML ("<td>%.1f</td>\n", $flow_latency{$flowop, 205 5184 ek110237 $dataset} / $flowopcnt{$flowop, $dataset}); 206 5184 ek110237 } else { 207 5184 ek110237 printf HTML ("<td></td>"); 208 5184 ek110237 } 209 5184 ek110237 } 210 5184 ek110237 print HTML "</i></tr>"; 211 5184 ek110237 } 212 5184 ek110237 } 213 5184 ek110237 print HTML "</table>"; 214 5184 ek110237 215 5184 ek110237 # HTML Efficiency 216 5184 ek110237 print HTML h1('Efficiency breakdown (Code path length in uS/op)'); 217 5184 ek110237 print HTML "<table border=1>"; 218 5184 ek110237 print HTML "<td>Workload</td>"; 219 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 220 5184 ek110237 print HTML "<td>$desc{$dataset}</td>"; 221 5184 ek110237 } 222 5184 ek110237 print HTML "</tr>"; 223 5184 ek110237 foreach $workload (sort (keys %workloads)) { 224 5184 ek110237 print HTML "<tr><td>$workload</td>"; 225 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 226 5184 ek110237 if ($workloadcnt{$workload, $dataset}) { 227 5184 ek110237 printf HTML ("<td>%d</td>", $cpu{$workload, $dataset} 228 5184 ek110237 / $workloadcnt{$workload, $dataset}); 229 5184 ek110237 } else { 230 5184 ek110237 printf HTML ("<td></td>"); 231 5184 ek110237 } 232 5184 ek110237 } 233 5184 ek110237 print HTML "</tr>"; 234 5184 ek110237 foreach $flowop (keys %wkl_flowops) { 235 5184 ek110237 next if ("$wkl_workload{$flowop}" ne "$workload"); 236 5184 ek110237 print HTML "<tr><td><i>__$wkl_flowops{$flowop}</td>"; 237 5184 ek110237 foreach $dataset (sort {$a cmp $b}(keys %datasets)) { 238 5184 ek110237 if ($flowopcnt{$flowop, $dataset}) { 239 5184 ek110237 printf HTML ("<td>%d</td>\n", $flow_cpu{$flowop, 240 5184 ek110237 $dataset} / $flowopcnt{$flowop, $dataset}); 241 5184 ek110237 } else { 242 5184 ek110237 printf HTML ("<td></td>"); 243 5184 ek110237 } 244 5184 ek110237 } 245 5184 ek110237 print HTML "</i></tr>"; 246 5184 ek110237 } 247 5184 ek110237 } 248 5184 ek110237 print HTML "</table>"; 249 5184 ek110237 250 5184 ek110237 end_html(); 251