0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

topでプロセス監視したいけど負荷はかけたくない

Last updated at Posted at 2023-02-24

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というディレクトリにぶち込む

save_process.sh
#!/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か月以上前のものは削除

ストレージ圧迫させたくないので削除処理もしっかりと。

delete_processLog.sh
#!/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のコマンドの説明

  • headtailを駆使して、ヘッダーを含む上位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列が見切れたり...
パソコンは難しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?