- PR -

プロセス毎のメモリ使用量ログ

1
投稿者投稿内容
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2004-07-24 17:35
Linux Squareの方には初めて投稿させていただきます。
よろしくお願いいたします。

現在運用しているLinuxサーバ上で
何かのプロセスがメモリリークを起こしてしまっており、
どのプロセスがメモリを消費しているのか特定しようと考えています。
SNMP/MRTGの組み合わせで特定のプロセスが起動されている数を監視して、
そのログを取ってグラフで表示というところは成功したのですが、
それではそのプロセスがどのくらいメモリを消費しているのかがわかりません。
topコマンドを使ってMでソートかけた際に表示される
どのプロセスがどのくらいメモリを使用しているのかといった情報を、
どうにか自動的にログに出力するなりした上で監視する方法はないでしょうか。
できればゾンビの存在状況も把握したいのです。

SNMP/MRTGで実現できれば一番いいのですが、
その方法・ツールにはこだわりません。
要はメモリリークを起こしているプロセスが何かを特定するのが目的です。

どなたかよい方法がありましたらご教授お願いいたします。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-07-24 18:18
ps aux
で、メモリ使用量とプロセスのステータスが表示されますので。
そいつを(awk にでも渡して整形しつつ)ファイルに書き出すように
しておいて、あとはシェルスクリプトでスリープを入れながらループ
させるか、あるいは cron から定期的に起動するようにしかけて
おくのがてっとりばやいところかと思います。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-07-24 20:01
ps aux と同等ですが、他の案として、
top -b -n1 の実行結果をとか、
procファイルシステムの /proc/数値/status (数値はプロセスID)を
定期的に記録調べてみるとか。
まいこ
常連さん
会議室デビュー日: 2003/08/20
投稿数: 30
投稿日時: 2004-07-24 22:06
失礼しました。すいません。。

[ メッセージ編集済み 編集者: まいこ 編集日時 2004-07-25 19:38 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-07-25 01:10
まいこハンも、とことんやってまんな(笑)
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2004-07-26 10:53
ご返答ありがとうございます。

どうやらプロセスごとのメモリ使用量のログを取って
統計・表示まで自動でやってくれる便利なものもないようですので、
ぽんす様の仰る通りps -auxの結果をcronで定期的にファイルに出力しておいて、
後はそのファイルをプログラムに渡してどうにかする方向でやってみようと思います。

どうもありがとうございました。
t-wata
大ベテラン
会議室デビュー日: 2002/07/12
投稿数: 209
お住まい・勤務地: 東京
投稿日時: 2004-07-26 13:35
こんな感じのスクリプトで、指定したPIDのプロセスを監視し、
CSV形式でメモリ使用量などの遷移を出力できます。

#!/bin/sh
PID=$1
INTERVAL_SEC=$2
FIELDS=$3
FILE=$4

usage(){
echo 'procstat.sh PID [INTERVAL (sec)] [FIELDS] [FILE]'
echo "INTERVAL is a polling interval to collect data (default 60sec)"
echo 'FIELDS is comma separated list of any column names (default %mem,vsize,rssize,%cpu,cputime)'
echo 'FILE is output file (default PID.csv)'
}

getstat(){
echo `date +"%Y/%m/%d %H:%M:%S"`,`echo $POUT|tr -s ' '|tr ' ' ','`
}

header(){
echo "Command name: ${PCMD}"
echo "Start date: `date`"
echo "check interval: ${INTERVAL_SEC} sec"
echo "check fields: \"${FIELDS}\""
}

if [ -z "${PID}" ];then
usage;
exit 1;
fi

if [ -z "${INTERVAL_SEC}" ];then
INTERVAL_SEC=60;
fi

if [ -z "${FIELDS}" ];then
FIELDS=%mem,vsize,rssize,%cpu,cputime
fi

if [ -z "$FILE" ];then
FILE=${PID}.csv
fi

if [ ! -f "$FILE" ];then
touch ${FILE}
fi

PCMD=`ps -p ${PID} -o cmd -h`
if [ -z "${PCMD}" ];then
echo "Process PID:${PID} is not exist"
exit 1
fi
header >> ${FILE}
while true;
do
POUT=`ps -p ${PID} -o ${FIELDS} --noheader`
if [ -z "${POUT}" ];then
echo "process PID:${PID} CMD:${PCMD} is no longer exist"
exit 0;
fi
getstat $POUT >> ${FILE}
sleep $INTERVAL_SEC
done

例えば、
for pid in `ps -eo %mem,pid --noheader|sort -rn|head -10|awk '{print $2}' `;do
if [ ! -f "${pid}.csv" ];then
./procstat.sh ${pid}
fi
done
のようなスクリプトを定期的にまわすことで、怪しいプロセスを監視できます。
(この場合は、メモリ使用量Top 10のプロセスのうち、すでに監視されていないものが対象。但し、プロセスIDが再利用された場合の対処が不十分)
1

スキルアップ/キャリアアップ(JOB@IT)