Some time ago someone posted a nice script to monitor HTB classes,
classmon.pl. A friend of mine ported it to CBQ, and attached is the
result.
Suggestions are welcome.
Rubens
> #!/usr/bin/perl
>
> # Classy CBQ Operations Monitor...in Perl
> # Based on classmon.pl by Toby Cantor
> # By BLFC
>
> # The following short command line options are parsed as you might expect.
> # There is NO error checking. The options below are used as follows:
> #
> # -i <name of the interface to monitor>
> # -d <single EWMA parameter determines averager''s
"memory". Should be
> # positive but less than unity. Lower equates to faster response>
> # -u <number of updates per second. Any positive value is acceptible
here,> # including decimals. A value of 0.2 would update once every 5
seconds>> # -w <a pattern which determines which classes are displayed. May
include
> # the wildcard characters ''*'' and
''?'' and they behave as in bash>
> #
> ## EWMA is calculated every 2nd update. This was tested on a Pentium 90,
on> ## which the updates/second has a maximum of 6 or so. Do the math. The
> ## default in this case is decent. Speaking of which...
> #
> # The defaults are first and should require no explanation.
>
> ($iface, $parm, $persec, $watchclass) = (''eth0'', 0.6, 1,
''*'');
> while ($argument = shift @ARGV)
> {
> if ($argument =~ ''-i'') { $iface = shift
@ARGV; }
> elsif ($argument =~ ''-d'') { $parm = shift
@ARGV; }
> elsif ($argument =~ ''-u'') { $persec = shift
@ARGV; }
> elsif ($argument =~ ''-w'') { $watchclass = shift
@ARGV; }
>
> }
>
> use Term::Cap;
> use Time::HiRes qw(gettimeofday sleep);
>
> $clear = `clear`;
> $terminal = Tgetent Term::Cap;
> $origin = $terminal->Tgoto(''cm'',0,0);
> $origin2 = $terminal->Tgoto(''cm'',0,3);
>
> $printrates=0;
> $wait_time = 1/$persec - .1;
> $starttime = $oldtime = gettimeofday();
>
> $header = $origin . "$iface-$watchclass
> Class kbps pps backlog dropped borrowed overact. tokens
ctokens> ------ ------- ------ -------- -------- -------- -------- -------- -------
-\n";>
> format STDOUT > @<<<<< @####.# @###.# @####### @#######
@####### @####### @#######
@#######> {$classid,
@{$smoothed{$classid}}{''bytes'',''packets''},
>
@{$classdata{$classid}}{''backlog'',''dropped'',''borrowed'',''overactions'',''tokens
'',''ctokens''}}> .
>
> print $clear.$header;
>
> $watchclass =~ s/\?/\./g;
> $watchclass =~ s/\*/\.\*/g;
>
> while (@allinfo = (readpipe("tc -s class show dev $iface")))
> {
> # class cbq 1: root rate 100Mbit (bounded,isolated) prio no-transmit
> # Sent 41352703832 bytes 165540580 pkts (dropped 0, overlimits 0)
> # borrowed 0 overactions 0 avgidle 58 undertime 0
> # class cbq 1:1990 parent 1: leaf 1990: rate 4000Kbit (bounded) prio
no-transmit> # Sent 22013154608 bytes 33663376 pkts (dropped 326694, overlimits
114912551)> # borrowed 0 overactions 807479 avgidle 26432 undertime 0
> foreach (@allinfo)
> {
> next unless /\S/;
> chomp;
>
> next if ((/class cbq/ && ($classid = (split)[2])) ||
($classid !~
/$watchclass/));> next if (/Sent/ &&
>
(@{$classdata{$classid}}{''bytes'',''packets'',''dropped''}
(split)[1,3,6]));
> # next if (/backlog/ && chop && chop &&
> # ($classdata{$classid}{''backlog''} =
(split)[4]));
> next if (/borrowed/ &&
>
(@{$classdata{$classid}}{''borrowed'',''overactions''}
(split)[1,3]));
> # next if (/tokens/ &&
> #
(@{$classdata{$classid}}{''tokens'',''ctokens''}
= (split)[1,3]));
> # $classdata{$classid}{''backlog''} = 0;
> }
>
> $nowtime = gettimeofday();
> $difftime=$nowtime-$oldtime;
> $oldtime = $nowtime;
>
> print $origin2;
> foreach $classid (sort keys %classdata)
> {
> chop $classdata{$classid}{''dropped''};
> $classdata{$classid}{''bytes''} *= (8/1024);
>
> foreach $keyn
(''bytes'',''packets'')
> {
> last if $printrates;
>
> $smoothed{$classid}{$keyn} > $parm *
(($classdata{$classid}{$keyn} -
$olddata{$classid}{$keyn})/($nowtime - $last_time)) +> (1-$parm) * $smoothed{$classid}{$keyn};
>
> if ($nowtime-$starttime < 2/$persec) {
$smoothed{$classid}{$keyn} = 0; }> $olddata{$classid}{$keyn} = $classdata{$classid}{$keyn};
> }
>
>
> write;
> }
> $last_time = $nowtime unless $printrates;
> $time_err = $difftime - 1/$persec;
> $wait_time -= 3*$time_err/5;
> sleep($wait_time);
> $printrates++;
> $printrates %=2;
> }
>
>