プロセスの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 %)