MySQLで待ちクエリが大量発生してもLoad Averageが上がることはないというようなことを聞いたので、その理由を考えてみました。自分なりに調べてみましたが、間違っていたらご指摘下さい。
そもそもLoad Average(ロードアベレージ)とは
- 実行プロセス数(実行中プロセス数+実行可能プロセス数) ※実行可能プロセス数とは、CPU割り当て待ちのプロセスで、CPUが割り当てられれば実行されるプロセスのこと。I/O待ちのプロセスはカウントされない。
- Load Average は1分あたりの実行プロセス数を表す。 例えば値が 0.5 だった場合、1プロセスが30秒稼働状態だったかもしれないし、2プロセスが15秒稼働状態だったかもしれない。
- Load Average <= CPU数であれば、処理負荷がかかっていないと一般的には言われている。 ※CPU数の数え方については http://tweeeety.hateblo.jp/entry/20130422/1366637798 に詳しく記載されている。
MySQLの処理負荷が上がるとLoad Averageも上がるのか?
- まず、MySQLはシングルプロセス/マルチスレッドのアプリケーションである。
- マルチスレッドとは
1つのアプリケーションソフトがスレッドと呼ばれる処理単位を複数生成し、並行して複数の処理を行うこと。いわばアプリケーションソフト内でのマルチタスク処理。マルチタスクと同じように、CPUの処理時間を非常に短い単位に分割し、複数のスレッドに順番に割り当てることによって、複数の処理を同時に行っているようにみせている。
http://e-words.jp/w/E3839EE383ABE38381E382B9E383ACE38383E38389.html
- つまり、クエリが大量に発行されても、MySQLのプロセスは1つのままであり、MySQLのプロセス内でクエリの実行待ちが増える。CPUの負荷率は高まるが、プロセス数は1のままとなる。
- で、MySQLのCPU使用率が高まるとMySQL以外のプロセスに影響が出る。その結果、Load Averageが上昇することは考えられる。
- ちなみに MySQL の 「show processlist」コマンドで表示されるデータは「プロセス」なのか?公式を見ると下記のこと。スレッドなんですね。
SHOW PROCESSLIST shows you which threads are running.
http://dev.mysql.com/doc/refman/5.5/en/show-processlist.html