Home | History | Annotate | Download | only in scripts
      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