#!/usr/bin/perl # Make a log-based histogram of object sizes # # perl object-size-hist.pl < /usr/local/squid/logs/access.log > hist # gnuplot # > set logscale x # > plot 'hist' using 1:4 with lines $SF = 10; while (<>) { @F = split; next unless ($F[3] =~ /^TCP_\S+\/200/); $size = $F[4]; next unless ($size > 0); $bin = int( $SF * log($size) + 0.5); $H[$bin]++; } $sum1 = 0; $sum2 = 0; for ($i=0; $i<=$#H; $i++) { $sum1 += $H[$i]; } for ($i=0; $i<=$#H; $i++) { $sum2 += $H[$i]; printf "%14.5f %9d %10.5f %10.5f\n", exp($i/$SF), $H[$i], $H[$i]/$sum1, $sum2/$sum1; } # print the median $sum3 = 0; for ($i=0; $i<=$#H; $i++) { $sum3 += $H[$i]; $S[$i] = $sum3; last if ($sum3 / $sum1 >= 0.5); } $X = $S[$i-1]; $Z = $S[$i]; $Y = $sum2 / 2; print "#i=$i\n"; print "#X=$X\n"; print "#Z=$Z\n"; print "#Y=$Y\n"; die if ($Y < $X); die if ($Y > $Z); $B = ($i -1) + ($Y-$X) / ($Z - $X); print "#B=$B\n"; printf "# median is %f bytes\n", exp($B/$SF);