load averageが高騰したけど原因がわからずお蔵入りになってしまったので、今後再発した際に原因追求できるようにプロセスを監視することになった。
top
でも-b -n 1
すれば負荷がかからないようにできるので、「topで監視は負荷が@!~#$」とか言われても実装しましょう。負荷については最後の方でまとめています。
「ps
でよくね?」と思われた方、ps
使わなかった理由は最後に書きます。
やることは以下の通り。
1. top
の結果(上位5件)をログに残す & 日付.log
としてyyyy-mm
というディレクトリにぶち込む
2. cron
で定期実行
3. 毎月1日に3か月以上前のものは削除
では、説明は最低限で実装だけしていきます。
top
の結果(上位5件)をログに残す & 日付.log
としてyyyy-mm
というディレクトリにぶち込む
#!/bin/sh
LOGDIR=/log/process/`date +%Y-%m`/ #ログ保存先ディレクトリ yyyy-mm
TOPLOG=${LOGDIR}`date +%d`_top.log #ログファイル dd_top.log
[ ! -e ${LOGDIR} ] && mkdir -m 777 -p ${LOGDIR} #ログ保存先ディレクトリがなければ作成。 -m 777は必要に応じて変更して。
date +%H:%M:%S >> ${TOPLOG} #top取得の時間をhh:mm:ssで記載
COLUMNS=150 top -b -c -n 1 |head -n 12 |tail -n 6 >> ${TOPLOG} #topの結果(ヘッダーと上位5件)を記載
echo >> ${TOPLOG} #見やすいように1行改行してるだけ。不要なら消しておk。
cronで定期実行
save_process.sh
を作成したら適当なところに置いて、cron
で定期実行します。
僕は毎分監視するので、cronの記載は以下の通り。
*/1 * * * * sh /tmp/save_process.sh
cron
の記載方法は詳しくまとめてくださっている方が↓
https://www.server-memo.net/tips/crontab.html
毎月1日に3か月以上前のものは削除
ストレージ圧迫させたくないので削除処理もしっかりと。
#!/bin/sh
TODAY=`date +%Y-%m-01` # 当月の1日を文字列として取得
MON1AGO=`date -d "${TODAY} 1 day ago" +'%Y-%m-01'` #1 day agoで前月を取得して、前月の1日を文字列として取得
MON2AGO=`date -d "${MON1AGO} 1 day ago" +'%Y-%m-01'` #1 day agoで前々月を取得して、前々月の1日を文字列として取得
MON3AGO=`date -d "${MON2AGO} 1 day ago" +'%Y-%m'` #1 day agoで前々々月を取得して、前々々月を文字列として取得
rm -r /var/log/process/"${MON3AGO}" #前々々月のディレクトリを削除
これもcron
で毎月1日00:01に実装します。
1 0 1 * * sh /tmp/delete_processLog.sh
諸々の説明
top
のコマンドの説明
head
とtail
を駆使して、ヘッダーを含む上位5件を表示させる-c
でCOMMAND列をフルパスに-b
(バッチモード)でcron
で回しても正常に結果が返ってくるようにする-n 1
で負荷下げるCOLUMNS=150
で1行あたりの文字数を増やす(デフォは80のためCOMMAND列の結果によっては見切れてしまう) ※-w
が使えるなら-w 150
とかで良いぽい
COLUMNS=150 top -b -c -n 1 |head -n 12 |tail -n 6
負荷
このコマンドでかかる負荷を確認してもゴミカス程度なので問題はなさそう。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14950 root 20 0 15028 1160 816 R 0.0 0.0 0:00.00 top -bc -n 1
ps
を使わない理由
TOPの方は短いスパンでのCPU使用率を表示できるものであり、負荷調査の役に立つ数字です。
PSの方はプロセスが起動してからどの程度CPUを使っているかの割合であり、定常的にサーバーのリソースを多く使っているものを判定するものになるため、負荷調査で使ってはいけない数字になります。
なので、サーバーの監視用途にPSのCPUは使ってはいけないようです。
とのことです。
https://hacknote.jp/archives/10596/
結論:top
は意外と複雑だった
コマンドラインから打ったら結果返ってくるのに、cron
で回したら結果が空になったり、
COMMAND列が見切れたり...
パソコンは難しいです。