CLOVER🍀

That was when it all began.

「ps aux」のRSSの結果を、プロセス名ごとに合算する

タイトル通り。

「ps aux」のRSSの部分を、プロセスの「文字列単位」に合算します。

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.0 225636  9612 ?        Ss   14:31   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    14:31   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   14:31   0:00 [kworker/0:0H]
root         5  0.0  0.0      0     0 ?        I    14:31   0:00 [kworker/u16:0]
root         6  0.0  0.0      0     0 ?        I<   14:31   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    14:31   0:00 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    14:31   0:01 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    14:31   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    14:31   0:00 [migration/0]

〜省略〜

合算時には、psコマンドのヘッダー部は要らないので、「h」オプションを付けます。

$ ps auxh

合算の条件は、以下です。

  • "COMMAND"の最初の文字列単位で合算する(オプションなどは無視する)
  • RSSのサイズを単純に合計する
  • 合算後のメモリサイズの昇順にソートする

よって、引数の差異や、プロセスを起動するコマンドが同じで、引数によって用途が大きく異なるものを別々に合算することは
できません。

まあ、簡易的なものです。

この後でコマンドが出てきますが、上記のような条件が合わなければ(PIDを見たいなど)、集計時のキーを調整すれば
ある程度集計の軸は変更できます。

コマンドの実行結果は、こんな感じ。

/lib/systemd/systemd-journald = 42972 KB
/usr/lib/gnome-settings-daemon/gsd-clipboard = 48596 KB
/usr/lib/gnome-settings-daemon/gsd-keyboard = 49492 KB
/usr/lib/ibus/ibus-x11 = 49620 KB
/usr/lib/gnome-settings-daemon/gsd-wacom = 50628 KB
/usr/bin/Xwayland = 51904 KB
/usr/lib/gnome-settings-daemon/gsd-xsettings = 52364 KB
/usr/lib/gnome-settings-daemon/gsd-power = 52860 KB
/usr/lib/gnome-settings-daemon/gsd-media-keys = 53640 KB
/usr/lib/gnome-settings-daemon/gsd-color = 54092 KB
/usr/lib/packagekit/packagekitd = 61324 KB
/usr/bin/python = 62528 KB
/usr/lib/evolution/evolution-calendar-factory-subprocess = 62828 KB
/usr/bin/dockerd = 66552 KB
/usr/lib/evolution/evolution-calendar-factory = 67444 KB
nautilus-desktop = 69144 KB

Perl One Linerで書きます。

出力結果をKB単位にした場合。

$ $ ps auxh | perl -wnl -a -e 'print "$F[5] $F[10]"' | perl -wnl -a -e 'BEGIN { %sum = (); } $sum{$F[1]} += $F[0]; END { foreach my $p (keys(%sum)) { print sprintf("%s = %d KB", $p, $sum{$p}); } }' | sort -k 3 -n

MB単位にした場合。

$ ps auxh | perl -wnl -a -e 'print "$F[5] $F[10]"' | perl -wnl -a -e 'BEGIN { %sum = (); } $sum{$F[1]} += $F[0]; END { foreach my $p (keys(%sum)) { print sprintf("%s = %.2f MB", $p, $sum{$p} / 1024); } }' | sort -k 3 -n

GB単位にした場合。

$ ps auxh | perl -wnl -a -e 'print "$F[5] $F[10]"' | perl -wnl -a -e 'BEGIN { %sum = (); } $sum{$F[1]} += $F[0]; END { foreach my $p (keys(%sum)) { print sprintf("%s = %.2f GB", $p, $sum{$p} / 1024 / 1024); } }' | sort -k 3 -n

まあ、簡単に。