#! /usr/bin/ksh # flowsize - a script to do plots based on the distribution of cflowd flow sizes # Dave Plonka , Jul 24 2000 # set -x exec flowdumper -cn \ \ -I "@timerange=qw($*);"' $base = 2; for ($n = 0; $base**$n <= 2**32; $n++) { $val = $base**$n; $exp{$val} = $n; $range{$val} = length($val) > 4? "$base^$n" : $val } @range = sort { $a <=> $b } keys %range' \ \ -e 'foreach (@range) { if ($Cflow::bytes < $_) { $lt{$_}++; $bytes{$_} += $Cflow::bytes; last } } foreach (@range) { if ($Cflow::pkts < $_) { $plt{$_}++; $pkts{$_} += $Cflow::pkts; last } } $flows++; $Bytes += $Cflow::bytes; $Pkts += $Cflow::pkts' \ \ -E 'if (2 == $base) { @xtics = split(", ", "\"1\" 0, \"2\" 1, \"4\" 2, \"8\" 3, \"16\" 4, \"32\" 5, \"64\" 6, \"128\" 7, \"256\" 8, \"512\" 9, \"1K\" 10, \"2K\" 11, \"4K\" 12, \"8K\" 13, \"16K\" 14, \"32K\" 15, \"64K\" 16, \"128K\" 17, \"256K\" 18, \"512K\" 19, \"1M\" 20, \"2M\" 21, \"4M\" 22, \"8M\" 23, \"16M\" 24, \"32M\" 25, \"64M\" 26, \"128M\" 27, \"256M\" 28, \"512M\" 29, \"1G\" 30, \"2G\" 31, \"4G\" 32") } else { foreach (sort { $a <=> $b } keys(%range)) { push(@xtics, "\"<$range{$_}\" $exp{$_}") } } $timerange[0] =~ m/\.([^.]*)$/; $timerange = "~$1"; if (@timerange > 1) { $timerange[$#timerange] =~ m/\.([^.]*)$/; $timerange .= " -> ~$1" } $timerange =~ s/_/ /g; print "cat > flowsize.gnuplot <<_EOF_\n"; print "set terminal postscript color solid \"Helvetica\" 10\n"; print "set title \"Distribution of Internet Flow Sizes, $flows flows, $timerange\"\n"; print "set size 1,0.75\n"; print "set xlabel \"Flow Size\"\n"; print "set ylabel \"Cumulative Percentage of Total Flows\"\n"; print "set xtics mirror rotate (", join(", ", @xtics), ")\n"; print "plot \"flowsize.dat\" using 1:2 title \"bytes\" with steps, \"flowsize.dat\" using 1:3 title \"pkts\" with steps\n"; print "_EOF_\n"; print "cat > flowsize2.gnuplot <<_EOF_\n"; print "set terminal postscript color solid \"Helvetica\" 10\n"; print "set title \"Distribution of Internet Flow Sizes, $flows flows, $timerange\"\n"; print "set size 1,0.75\n"; print "set xlabel \"Flow Size\"\n"; print "set ylabel \"Percentage of Content (IP headers+payload)\"\n"; print "set xtics mirror rotate (", join(", ", @xtics), ")\n"; print "set grid\n"; print "plot \"flowsize.dat\" using 1:4 title \"bytes\" with steps, \"flowsize.dat\" using 1:5 title \"pkts\" with steps\n"; print "_EOF_\n"; print "cat > flowsize.dat <<_EOF_\n"; print "#\n"; print "# power_of_$base\tflow_pct_by_bytes\tflow_pct_by_pkts\tpct_bytes\tpct_pkts\n"; print "#\n"; foreach (@range) { $pct += 100*((0+$lt{$_})/$flows); $ppct += 100*((0+$plt{$_})/$flows); $B = 100*((0+$bytes{$_})/$Bytes); $p = 100*((0+$pkts{$_})/$Pkts); print "$exp{$_}\t", $pct, "\t", $ppct, "\t", $B, "\t", $p, "\n"; } print "_EOF_\n"' \ \ "$@"