Skip to content

Instantly share code, notes, and snippets.

@savonarola
Created November 25, 2014 19:34
Show Gist options
  • Save savonarola/b217af489615f61f4128 to your computer and use it in GitHub Desktop.
Save savonarola/b217af489615f61f4128 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @ps_output = `ps ax -o pid,ppid,rss,command`;
shift @ps_output;
my %processes = map{ $_->[0], { pid => $_->[0], ppid => $_->[1], rss => $_->[2], command => $_->[3] } } map { [split(/\s+/, $_, 4)] } map { chomp; s/^\s+//; $_ } @ps_output;
foreach my $ps_info (values %processes) {
if($ps_info->{command} =~ /fb-(\w+)(-\w+)\.sh/) {
my $service = $1;
my $parent_pid = "fb-$service";
$processes{$parent_pid} ||= {
ppid => 1,
pid => $parent_pid,
rss => 0,
command => '',
};
$ps_info->{ppid} = $parent_pid;
}
}
foreach my $ps_info (values %processes) {
$ps_info->{children} ||= [];
my $pps_info = $processes{$ps_info->{ppid}};
$pps_info->{children} ||= [];
push @{$pps_info->{children}}, $ps_info->{pid};
}
sub total_rss {
my $ps_info = shift;
my $total_rss = $ps_info->{rss};
foreach my $children (@{$ps_info->{children}}) {
$total_rss += total_rss($processes{$children});
}
$total_rss;
}
foreach my $ps_info (values %processes) {
$ps_info->{total_rss} = total_rss($ps_info);
}
sub print_tree {
my ($pad, $pid) = @_;
$pad ||= '';
my $ps_info = $processes{$pid};
print $pad, $ps_info->{total_rss}, "KB\tpid=", $pid, "\t", $ps_info->{command}, "\n";
my @children = sort { $processes{$b}{total_rss} <=> $processes{$a}{total_rss} } @{$ps_info->{children}};
foreach my $child (@children) {
print_tree("\t".$pad, $child)
}
}
print_tree('+ ', 1);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment