[Linux] メモリ使用量が大きいプロセスの上位10件を見つける方法

どのプロセスが物理メモリを多く使用しているかを見つけるにはどのようにしたらよいでしょか?
OSのメモリが枯渇してきたときに、どのプロセスが原因になっているかを調べる必要があるかもしれません。ここでは、物理メモリの使用量が大きいプロセスの上位10件を見つける方法を紹介します。
※以降の実行例は、Ubuntu17.10で確認しています。

1. 実行コマンド

psコマンドのRSS(物理メモリ使用量)の値でソートして表示します。

BSDオプションを利用する場合

$ ps aux | sort -n -k 6 -r | head -n 10  #BSDオプション

スタンダードオプションを利用する場合

$ ps -eF | sort -n -k 6 -r | head -n 10  #スタンダードオプション

上記のコマンドの実行結果の6行目がRSSの値です。

RSS: resident set size, the non-swapped physical memory that a task has used (in kiloBytes).

利用したコマンド

  1. psコマンド: プロセスごとのメモリ使用量を求めます
  2. sortコマンド: 入力データの並び替えを行います
  3. headコマンド: 入力データの先頭部分を表示します

sortコマンドを利用しない方法

sortコマンドを使わないで、psコマンドでソートすることもできます。

$ ps aux k -rss | head -n 10
$ ps -eF --sort -rss | head -n 10

2. コマンドの実行例(1)

$ ps aux | sort -n -k 6 -r | head -n 10
root      1102  0.1  6.3 716944 63580 ?        Ssl  10:36   0:01 /usr/bin/dockerd -H fd://
netdata   1004  0.4  3.8 184084 38900 ?        Ssl  10:36   0:07 /usr/sbin/netdata -P /run/netdata/netdata.pid -D
root      1696  0.0  2.1 628772 22044 ?        Ssl  10:36   0:01 docker-containerd --config /var/run/docker/containerd/containerd.toml
root      1081  0.0  1.7 472112 17668 ?        Ssl  10:36   0:00 /usr/lib/snapd/snapd
root       388  0.0  1.4  89844 14656 ?        Ss   10:36   0:00 /lib/systemd/systemd-journald
Debian-+  1092  0.0  1.0  61332 10640 ?        Ss   10:36   0:00 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
root      1481  0.0  0.8  25388  8440 ?        S<Ls 10:36   0:00 /usr/bin/atop -a -R -w /var/log/atop/atop_20180418 600
root         1  0.0  0.8  72676  8348 ?        Ss   10:36   0:01 /sbin/init
maint     1777  0.0  0.7  80108  7308 ?        Ss   10:37   0:00 /lib/systemd/systemd --user
root      1718  0.0  0.7 101472  7080 ?        Ss   10:36   0:00 sshd: maint [priv]

3. コマンドの実行例(2)

$ ps -eF | sort -n -k 6 -r | head -n 10
root      1102     1  0 179236 63580  0 10:36 ?        00:00:01 /usr/bin/dockerd -H fd://
netdata   1004     1  0 46021 38900   0 10:36 ?        00:00:07 /usr/sbin/netdata -P /run/netdata/netdata.pid -D
root      1696  1102  0 157193 22044  1 10:36 ?        00:00:01 docker-containerd --config /var/run/docker/containerd/containerd.toml
root      1081     1  0 118028 17668  0 10:36 ?        00:00:00 /usr/lib/snapd/snapd
root       388     1  0 22461 14656   1 10:36 ?        00:00:00 /lib/systemd/systemd-journald
Debian-+  1092     1  0 15333 10640   0 10:36 ?        00:00:00 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
root      1481     1  0  6347  8440   0 10:36 ?        00:00:00 /usr/bin/atop -a -R -w /var/log/atop/atop_20180418 600
root         1     0  0 18169  8348   0 10:36 ?        00:00:01 /sbin/init
maint     1777     1  0 20027  7308   0 10:37 ?        00:00:00 /lib/systemd/systemd --user
root      1718  1486  0 25368  7080   0 10:36 ?        00:00:00 sshd: maint [priv]

4. コマンドの実行例(3)

$ ps aux k -rss | head -n 10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1102  0.1  6.3 864408 63872 ?        Ssl  10:36   0:05 /usr/bin/dockerd -H fd://
netdata   1004  0.4  3.8 184444 39276 ?        Ssl  10:36   0:25 /usr/sbin/netdata -P /run/netdata/netdata.pid -D
root      1696  0.0  2.1 628772 22044 ?        Ssl  10:36   0:04 docker-containerd --config /var/run/docker/containerd/containerd.toml
root      1081  0.0  1.7 472112 17564 ?        Ssl  10:36   0:00 /usr/lib/snapd/snapd
root       388  0.0  1.4  89844 14716 ?        Ss   10:36   0:00 /lib/systemd/systemd-journald
Debian-+  1092  0.0  1.0  61332 10640 ?        Ss   10:36   0:01 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
root      1481  0.0  0.8  25556  8440 ?        S<Ls 10:36   0:00 /usr/bin/atop -a -R -w /var/log/atop/atop_20180418 600
root         1  0.0  0.8  72676  8348 ?        Ss   10:36   0:01 /sbin/init
maint     1777  0.0  0.7  80108  7308 ?        Ss   10:37   0:00 /lib/systemd/systemd --user

5. コマンドの実行例(4)

$ ps -eF --sort -rss | head -n 10
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root      1102     1  0 216102 63872  0 10:36 ?        00:00:05 /usr/bin/dockerd -H fd://
netdata   1004     1  0 46111 39276   0 10:36 ?        00:00:24 /usr/sbin/netdata -P /run/netdata/netdata.pid -D
root      1696  1102  0 157193 22044  1 10:36 ?        00:00:04 docker-containerd --config /var/run/docker/containerd/containerd.toml
root      1081     1  0 118028 17564  0 10:36 ?        00:00:00 /usr/lib/snapd/snapd
root       388     1  0 22461 14716   1 10:36 ?        00:00:00 /lib/systemd/systemd-journald
Debian-+  1092     1  0 15333 10640   0 10:36 ?        00:00:01 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f
root      1481     1  0  6389  8440   0 10:36 ?        00:00:00 /usr/bin/atop -a -R -w /var/log/atop/atop_20180418 600
root         1     0  0 18169  8348   0 10:36 ?        00:00:01 /sbin/init
maint     1777     1  0 20027  7308   0 10:37 ?        00:00:00 /lib/systemd/systemd --user

 
以上、メモリ使用量が大きいプロセスの上位10件を見つける方法の紹介でした。