/[ps-trend]/ps2rrd.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /ps2rrd.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (show annotations)
Sun Jul 19 17:49:55 2009 UTC (14 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 2746 byte(s)
added --by-veid to show only containers

1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use Data::Dump qw/dump/;
7 use RRD::Simple;
8 use POSIX qw/mktime/;
9 use Getopt::Long;
10
11 my $debug = 0;
12 my $zoom = 2;
13
14 my $only_veid;
15 my $by_veid;
16 my $too_small = 64; # M
17 my $filter = qr{(apache|mysql|postgres|cgi-bin|SIP)};
18
19 GetOptions(
20 'debug!' => \$debug,
21 'zoom=i' => \$zoom,
22 'only-veid=i' => \$only_veid,
23 'by-veid!' => \$by_veid,
24 'size=i' => \$too_small,
25 );
26
27
28 my $veids;
29 my $vsz;
30
31 $too_small *= 1024; # k
32
33 sub count {
34 my $file = shift;
35 open(my $fh, '<', $file) || die "$file: $!";
36
37 my $t = mktime( 0, $5, $4, $3, $2 - 1, $1 - 1900 ) if $file =~ m{(\d\d\d\d)-(\d\d)-(\d\d)/(\d\d)(\d\d)};
38
39 # warn "# $file ", -s $file, " bytes [$t]\n" if $debug;
40 print STDERR "\n$file\t";
41
42 my $cols = <$fh>;
43 $cols =~ s/^\s+//;
44 my @c = split(/\s+/,$cols);
45 # warn "# c = ",dump( @c );
46 our $cp;
47 $cp->{$c[$_]} = $_ foreach 0 .. $#c;
48 our @r;
49 sub c {
50 return $r[ $cp->{$_[0]} ]; # XXX speedup
51
52 my $name = shift;
53 my $n = $cp->{$name};
54 die "no column $name in ",dump( $cp ) unless defined $n;
55 return $r[$n];
56 }
57
58 while(<$fh>) {
59 chomp;
60 s/^\s+//g;
61 s/\s+$//g;
62 @r = split(/\s+/, $_, $#c + 1 );
63
64 my $veid = c('VEID');
65 next if defined $only_veid && $only_veid != $veid;
66 $veid =~ s/^0$/_hw_0/;
67
68 my $s = c('VSZ');
69 my $cmd = c('COMMAND');
70 if ( ! $by_veid && $cmd =~ $filter ) {
71
72 $veid .= '-' . $1;
73 $vsz->{$t}->{$veid} += $s * 1024;
74 print STDERR uc(substr($1,0,1));
75
76 } elsif ( $s < $too_small || $by_veid ) {
77
78 $vsz->{$t}->{$veid}+= $s * 1024;
79 print STDERR ".";
80
81 } else {
82
83 $cmd =~ s{-.+$}{};
84 $cmd =~ s{^/\S+/(\w+?)}{$1};
85 $cmd =~ s{^\w+ /\S+/(\w+?)}{$1};
86 $cmd =~ s{:?\s+.*$}{};
87 $cmd =~ s{\W+}{_}g;
88 $veid .= '-' . $cmd;
89 $veid = substr($veid,0,16);
90 $vsz->{$t}->{$veid}+= $s * 1024;
91 print STDERR substr($cmd,0,1);
92 }
93 $veids->{$veid}++;
94 }
95
96 }
97
98 print STDERR "parsing ps with grouping < $too_small k";
99
100 count $_ foreach @ARGV;
101
102 #print "VSZ: ",dump( $vsz );
103
104 my @veids = sort keys %$veids;
105 warn "# veids = ",dump( @veids );
106
107 my $rrd_file = 'ps.rrd';
108 unlink $rrd_file if -e $rrd_file;
109
110 my @t = sort keys %$vsz;
111
112 print "\ndrawing $#t intervals ", $t[0], " - ", $t[$#t];
113
114 my $rrd = RRD::Simple->new( file => $rrd_file );
115 $rrd->create( map { ( $_ => 'GAUGE' ) } @veids );
116
117 foreach my $t ( @t ) {
118 print STDERR ".";
119 # warn "## ",dump( %{ $vsz->{$t} } );
120
121 eval {
122 $rrd->update($t, map {
123 ( $_ => $vsz->{$t}->{$_} )
124 } @veids );
125 };
126 warn "SKIP $t: $@\n" if $@;
127 }
128
129 $rrd->graph(
130 sources => [ sort @veids ],
131 source_drawtypes => [ map { $_ ? 'STACK' : 'AREA' } 0 .. $#veids ],
132 periods => [ qw/hour 6hour 12hour day week month year 3years/ ],
133 extended_legend => 1,
134 title => "memory > $too_small K",
135 width => 500 * $zoom,
136 height => 200 * $zoom,
137 );
138

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26