沢山のシェルスクリプトが動くLinuxサーバで、
動作が遅くなったから調査してくれ、と言われることがちょこちょこある。
その時、sar
コマンドなどでメモリ、CPU使用率は後で測れるけど、
どのスクリプトのどんなコマンドがボトルネックになっているのかがよくわからなかったので、
top, ps, pstreeを定期的に吐くようにスクリプトを組んでみる。
スクリプト
toppslog.sh
# !/bin/sh
# Logファイル作成
LOG_TIME=`date '+%Y%m%d_%H%M%S'`
LOG_DATE=`date '+%Y%m%d'`
mkdir -p /topps/${LOG_DATE}
LOG_FILE="/topps/${LOG_DATE}/tp${LOGTIME}_${LOG_TIME}.log"
# top
echo -e "top cmd: ${LOG_TIME} \n****************" >> $LOG_FILE
top -n 1 -bc >> $LOG_FILE
# ps
echo -e "ps cmd: ${LOG_TIME} \n*****************" >> $LOG_FILE
# CPU使用率順に並べる
ps auwx | LANG=C sort -k3,3 >> $LOG_FILE
# pstree
echo -e "pstree cmd: ${LOG_TIME} \n*****************" >> $LOG_FILE
pstree -all -p >> $LOG_FILE
cron登録
$ crontab -l | grep top
*/10 * * * * /toppslog.sh
とりあえず10分毎にログ取得。
結果
tp_20191120_122001.log
top cmd: 20191120_122001
****************
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1254 user 20 0 110m 968 876 R 99.9 0.0 0:02.61 awk $3=="002" && $4
1282 user 20 0 110m 976 888 R 99.9 0.0 0:02.23 awk $3=="002" && $4
~中略~
pstree cmd: 20191120_122001
*****************
init,1
|- HOGEHOGE.sh
| `-awk,1254 $3=="002" && $4=="51"
topで、どんなコマンドがCPU率、メモリ使用しているかチェック。
そのPIDを元に検索して、pstreeの結果から、どのスクリプトに書かれているコマンドかをチェックができる。