mysqlクエリとCPU状況をシェルスクリプトで監視
カテゴリー:Linux
使用してるサーバに負荷がかかっていてmysqlが原因として疑われたのでCPUの状況とMysqlの実行中クエリを表示するシェルスクリプトを組んでみました。
まず、mysqlの実行中クエリを取得する方法について調べてみると以下のSQLで得られることがわかりました。
show full processlist;
次にこのSQLをmysqlにログインせずにコマンドとして送って結果の出力を得られないか調べてみました。
以下のようなコマンドで、結果を得られるようです。-pの後に、スペースをはさまずにパスワードを入れてるところがポイント。
mysql -uuser -ppassword -e 'show full processlist'
ということで、これをつかって以下のようなシェルスクリプトを書いてみました。
if test -f $1;
then
num=0
else
num=`expr $1 + 1`
fi
while [ $count -ne $num ];
do
date
echo ' '
top -c -b -n 1 | head
echo ' '
mysql -uuser -ppassword -e 'show full processlist'
count=`expr $count + 1`
echo ' '
echo '********************************************************************'
echo ' '
sleep 3
done
使い方は、上のコードをfilename.shという名前で保存後、"filename.sh 実行回数"と実行すると指定した回数だけ3秒間隔でtopコマンドでとってきたCPUの状態とmysqlで実行中のクエリが表示されます。
ちなみに、回数の指定がないときはCtrl+Cが入力されるまで実行される。
↓実行例
filename.sh 3
FirefoxでPHPが二重実行
カテゴリー:Linux
ブラウザ上に出力するテキストが大量にあるPHPを実行していると、想定していたよりかなり時間が、かかるという問題を調べていた。
なお調べている途中で、PHPファイル内部に以下のような記述をしてPHPファイルが実行されたときの時間をログに出力するようにしていた。
<?php exec("echo 'date:".date("H:i:s")."' >> log"); ?>
そこでブラウザからファイルに1度アクセスしてログを確認してみると、実行ログが2回分はいっていた。
つまり、1度のアクセスにつきPHPが2回実行されているようだ。
この問題について調べてみた。
環境
- クライアント
- Firefox/2.0.0.11
- Windows Vista
- サーバ
- PHP Version 4.3.9
ここで、他のブラウザ、環境で試すと再現しないことから、クライアント側のhtmlファイルの解釈によって問題がおきるかどうかが変わっていることがわかった。
そこでサーバ側のPHPファイルを見直してみるとデバッグ用の出力をhtml開始タグの記述前の箇所で行っていたためデバッグ用の出力をhtmlのbody内部に出力するようにさせたところ二重実行はされなくなった。