Linux でメモリ使用量の多いプロセス上位10件を表示するコマンド


$ ps alx  | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10

ps コマンドの alx オプションでプロセスの一覧を表示して、 RSS 項目 (Resident Set Size: 物理メモリの使用量) の値を大きい順にソートして表示している。

ps コマンドの alx オプションは、システム上のすべてのプロセスを表示する。


$ ps alx | head -3
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0  10648   828 ?      Ss   ?          0:01 init [2]  
1     0     2     0  20   0      0     0 ?      S    ?          0:00 [kthreadd]

RSS は Resident Set Size (物理メモリの使用量) の略。ps のマニュアル (man ps) によると「常駐セットの大きさ。 タスクが使用しているスワップされていない物理メモリ (kB 単位)。 (別名 rssize, rsz)」となっている。

メモリ消費量の激しいプロセスを調べる実行例。


$ ps alx  | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10
421844	/usr/lib/jvm/default-java/bin/java
303764	/usr/sbin/mysqld
9952	munin-node
7816	/usr/sbin/libvirtd
6640	/usr/bin/ruby
4568	-bash
3912	/usr/sbin/console-kit-daemon
3516	/usr/local/apache2/bin/httpd
3508	/usr/local/apache2/bin/httpd
3452	/usr/local/apache2/bin/httpd

この例だと、プロセス /usr/lib/jvm/default-java/bin/java は物理メモリを 421844kB 使用していることになる。メガバイトに直すと 400MB ぐらい。

Linux で仮想メモリ使用量の多いプロセス上位10件を表示するコマンド

物理メモリの使用量 (RSS) ではなく、仮想メモリの使用量 (VSZ) が多い順に表示したい場合は、次のコマンドで。


$ ps alx  | awk '{printf ("%d\t%s\n", $7,$13)}' | sort -nr | head -10

VSZ は Virtual Set Size (仮想メモリの使用量) 。 ps の マニュアル (man ps) によると「プロセスの仮想メモリサイズ (KiB, 1024 バイト単位)。 デバイスマッピングは現在のところ除外されているが、これは変更される。 (別名 vsize)」となっている。

実行例。


$ ps alx  | awk '{printf ("%d\t%s\n", $7,$13)}' | sort -nr | head -10
1187760	/usr/lib/jvm/default-java/bin/java
728920	/usr/sbin/mysqld
279676	/usr/sbin/libvirtd
154748	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd
150540	/usr/local/apache2/bin/httpd

参考資料。

VSZ(Virtual Set Size)はプロセスが確保した仮想メモリ領域のサイズ
RSS(Resident Set SIze)はプロセスが確保した物理メモリ領域のサイズ

どうして2つのメモリの指標があるのでしょうか?
仮想メモリとは、プログラムがメモリを使用するにあたって、物理的なメモリを扱うのではなく、物理メモリを抽象化したソフトウェア的なメモリを扱わせる機構です。ハードウェアが提供する「ページング(Paging)」と呼ばれる仮想メモリ機構を使って実現し、OSがその仮想メモリ領域の管理を行います。

ふと思ったこと: psコマンド使い方
VSS(psコマンドではVSZと表現される)はプロセスがアクセスできるアドレスの総和である。このサイズはプロセスがまだ使用していない領域もふくむ。例えばmallocされて割り当てられたものの、まだ書き込まれていないようなメモリだ。したがって、VSSはプロセスの実メモリの使用量としては、あまり使われることはない。

RSSはプロセスが実際に使用しているRAMの総メモリ量である。RSSは誤解を招くことがある。RSSはプロセスが使用しているものと、共有ライブラリが使用しているものを合計し算出するからだ。共有ライブラリは、それを使用するプロセス数とは関係なく、一度しか読み込まれないのにもかかわらず、だ。RSSはある単一のプロセスのメモリ使用量としては正しい表現とはいえないだろう。

VSS RSS PSS USS の説明 - Meblog

tags: linux

Posted by NI-Lab. (@nilab)