- - PR -
プロセス毎のメモリ使用量ログ
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-07-24 17:35
Linux Squareの方には初めて投稿させていただきます。
よろしくお願いいたします。 現在運用しているLinuxサーバ上で 何かのプロセスがメモリリークを起こしてしまっており、 どのプロセスがメモリを消費しているのか特定しようと考えています。 SNMP/MRTGの組み合わせで特定のプロセスが起動されている数を監視して、 そのログを取ってグラフで表示というところは成功したのですが、 それではそのプロセスがどのくらいメモリを消費しているのかがわかりません。 topコマンドを使ってMでソートかけた際に表示される どのプロセスがどのくらいメモリを使用しているのかといった情報を、 どうにか自動的にログに出力するなりした上で監視する方法はないでしょうか。 できればゾンビの存在状況も把握したいのです。 SNMP/MRTGで実現できれば一番いいのですが、 その方法・ツールにはこだわりません。 要はメモリリークを起こしているプロセスが何かを特定するのが目的です。 どなたかよい方法がありましたらご教授お願いいたします。 |
|
投稿日時: 2004-07-24 18:18
ps aux
で、メモリ使用量とプロセスのステータスが表示されますので。 そいつを(awk にでも渡して整形しつつ)ファイルに書き出すように しておいて、あとはシェルスクリプトでスリープを入れながらループ させるか、あるいは cron から定期的に起動するようにしかけて おくのがてっとりばやいところかと思います。 |
|
投稿日時: 2004-07-24 20:01
ps aux と同等ですが、他の案として、
top -b -n1 の実行結果をとか、 procファイルシステムの /proc/数値/status (数値はプロセスID)を 定期的に記録調べてみるとか。 |
|
投稿日時: 2004-07-24 22:06
失礼しました。すいません。。[ メッセージ編集済み 編集者: まいこ 編集日時 2004-07-25 19:38 ] |
|
投稿日時: 2004-07-25 01:10
まいこハンも、とことんやってまんな(笑)
|
|
投稿日時: 2004-07-26 10:53
ご返答ありがとうございます。
どうやらプロセスごとのメモリ使用量のログを取って 統計・表示まで自動でやってくれる便利なものもないようですので、 ぽんす様の仰る通りps -auxの結果をcronで定期的にファイルに出力しておいて、 後はそのファイルをプログラムに渡してどうにかする方向でやってみようと思います。 どうもありがとうございました。 |
|
投稿日時: 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