プロセスのCoW共有しているメモリのサイズ

もはや伝説と化した記事がありますが、
http://d.hatena.ne.jp/naoya/20080212/1202830671

諸々の都合でLinux::Smaps入れると商用と開発入れなきゃいけないし、
管理上一台だけ入れるって訳にも行かないし、閉ざされた世界なのでcpanminiこしらえなきゃ・・・
とかお悩みのオレのために/proc/PID/smapsをそのままコリコリ読むスクリプト書いてみました。

つまりLinux::Smaps入れないでもOKです。(List::Utilは5.8以降だとコアモジュールなので使ってます。)

ペロッと貼ってご利用ください。

#!/bin/env perl

use strict;
use warnings;

use List::Util ();

@ARGV or die "usage: %0 [pid ...]";

my @output;

for my $pid (@ARGV) {
   die "invalid pid '$pid'" if $pid =~ /\D/;
   my @smaps = `cat /proc/$pid/smaps`;
   die if $? != 0;
   my @shared = map { /(\d+)\s+kB/; $1 } grep { /^Shared_(Clean|Dirty)/ } @smaps;
   my $shared_total = List::Util::sum(@shared);
   my @rss = map { /(\d+)\s+kB/; $1 } grep { /^Rss/ } @smaps;
   my $rss_total = List::Util::sum(@rss);
   my $parcent = sprintf '(%d %%)', int(($shared_total / $rss_total) * 100);
   push @output, [$pid, $rss_total, $parcent];
}

unshift @output, [qw(PID RSS SHARED)];

for my $out (@output) {
    print join "\t", @$out;
    print "\n";
}

使い方もこんな感じで一緒です。

# perl shared_memory_size.pl  `pgrep httpd$`
$ sudo perl shared_memory_size.pl  `pgrep httpd$`

お悩みの諸兄!一人じゃない!けど大勢でもない!

ちなみにオレオレサーバ・・・。もうちょっと頑張れそうですね。

# perl shared_memory_size.pl  `pgrep httpd$`
PID     RSS     SHARED
5273    46800   (65 %)
5297    47208   (65 %)
5325    47184   (65 %)
5341    2912    (76 %)
5359    46052   (67 %)
5436    3060    (77 %)
5444    2932    (76 %)
5450    2884    (82 %)
5455    45464   (69 %)
5458    44584   (72 %)
5467    2892    (77 %)
5469    2896    (77 %)
5471    2860    (78 %)
5472    3112    (76 %)
5477    2708    (83 %)
5486    2724    (81 %)
5487    2716    (81 %)
5490    2832    (77 %)
5491    2756    (84 %)
5492    2260    (90 %)
5493    46420   (70 %)
5495    2748    (79 %)
5498    2204    (90 %)
5499    2196    (90 %)
5500    2200    (91 %)
5501    2196    (91 %)
25394   41824   (77 %)
25406   2292    (89 %)