UNIX/Linux でプロセス個別に割り当てられているメモリ使用量を見るコマンド

プロセス単体のメモリ使用量について、忘れていたので備忘。


単純にプロセスの情報を見るには ps コマンドを使う。
free とか top とかもあるけど、それらは全体のメモリ使用量を見るコマンドなので、今回は割愛。

見るべき項目

今回、プロセス単位のメモリ使用量をみるということで、簡単にチェック項目を列記してみた。
(見る内容が変われば、チェック項目も変わる…のは言うまでもない?)

項目 簡単な説明 ポイント
USER ユーザ そのプロセスを誰が走らせているか。
PID プロセスID PIDから他情報を連結して参照するのに必須。
PPID 親プロセスID そのプロセスを生んだ親(Parent)。
親子合わせてメモリ使用量をみるときに利用する。
VSZ 仮想メモリサイズ そのプロセスが使う仮想メモリサイズの総量。
SZ メモリサイズ そのプロセスが使うメモリサイズの量。
VSZの一部分だが、範囲はOSによって異なるっぽい。
RSS 物理メモリサイズ そのプロセスが使う物理メモリの量。
スワップしているものは除くので要注意。
COMM 実行コマンド 実行されているコマンド。

ということで、基本的には VSZ を見ればプロセス単体のメモリ使用量が把握できる。
単位は KiB (2^10)だったり KB (10^3)だったりするので、OS の man コマンド内容とかで確認すること。

Linux

VSZ を表示させるのは、よく使うオプションでは出てこない。
たとえば……

$ ps -elf

これだと USER,PID,PPID,SZ,COMM 等は把握できるけど、VSZ は把握できない。


オプション -o で指定できるので、例として以下のようにする。

$ ps -eo user,pid,ppid,vsz,comm


Raspberry Pi で試してみたところ、こんな感じだった。

pi@raspberrypi ~ $ ps -eo user,pid,ppid,vsz,comm | grep -e VSZ -e named
USER       PID  PPID    VSZ COMMAND
bind     20706     1  78972 named
pi@raspberrypi ~ $

HP-UX 11i v3

バージョンによって VSZ の出力範囲が変わるようだ。
少なくとも 11i v3 の場合は、見るべき項目で記載した内容で問題ない。
(11i v2 以前のものは、含まれない情報があったりする)


基本的には Linux と同じオプション……が使えない。
無理やり使えるようにするために、UNIX95 というシェル変数を設定してあげる。

UNIX95= ps -eo user,pid,ppid,vsz,comm

Tips

named のメモリ使用量を1秒ごとに出力するシェルスクリプト
…ある程度、汎用性はあるはず。

HP-UXuname コマンド単体で返ってくる内容がうろ覚えだけど…たぶんこんな感じ。
Linux というか、Raspbian (Debian派生) でしか検証していないので注意。

#!/bin/sh
############################################################
##
## script name : chk.sh
##
############################################################
### Parameter ##############################################

WaitTime=1
LoopCount=1000
TargetProc=named
case $(uname) in
	Linux ) PS="ps";;
	HP-UX ) PS="UNIX95= ps";;
	* ) exit 1;;
esac
PSOption="-eo vsz,comm"

### Main ###################################################

i=0
until [ "${i}" = "${LoopCount}" ]; do
	i=$(( ${i} + 1))
	printf "$(date '+%Y/%m/%d %H:%M:%S')"
	${PS} ${PSOption} | grep ${TargetProc}
	sleep ${WaitTime}
done
############################################################

備考

関連しそうな考慮点も、一応。

  • OS が、各プロセスに割り当てるメモリサイズの上限は、カーネルパラメータ等で確認しておく。
  • RRDTool を入れていれば、データを引き渡すシェルスクリプトにすると即座にグラフ化されていい感じになりそう。