#! /usr/bin/perl use strict; use warnings; local *F; my $pscmd="ps axwl"; open F,"$pscmd|" or die "$pscmd: $!"; my %pid; my $rsstotal=0; local $_; while () { /^(?:\S+\s+){2}(\S+)\s+(?:\S+\s+){4}(\S+)/ or die $_; die if $pid{$1}; $pid{$1}=$_; $rsstotal+=$2 if $2 ne "RSS"; } close F or die "$pscmd: $!"; my $head=delete $pid{"PID"} or die; my %swap; for my $pid (keys(%pid)) { my $line=$pid{$pid}; my $kb=0; my $fn="/proc/$pid/smaps"; if (!open F,$fn) { warn "$fn: $line: $!" if $line!~/ $pscmd$/; next; } while () { $kb+=$1 if /^Swap:\s+(\d+) kB\n$/; } close F or die "$fn: $!"; push @{$swap{$kb}},$line; } sub printfmt($$) { my($kb,$line)=@_; printf "%10s %s",$kb,$line; } printfmt "SWAP",$head; my $swaptotal=0; for my $kb (sort { $b<=>$a; } keys(%swap)) { for my $line (@{$swap{$kb}}) { printfmt $kb,$line; $swaptotal+=$kb; } } print "SWAP total: $swaptotal\n"; print "RSS total: $rsstotal\n";