最近サーバーがよくダウンする感じです。
vmstatで監視すると
不定期で「b」が膨れ上がり
それに伴いloadaverageも膨れ上がり
最終的にサーバーがダウンしてしまいます。
「b」がふくれあがる原因はmysqlであることは確認していて
mysqlまわりを見直せ!というのはわかるのですが
以前借りていたサーバー(VPS)ですと特にダウンすることもなかったので
なぜ新しく借りた専用サーバーだとダウンまでいってしまうのかと
疑問が生じています。
例えばvmstatの「b」の上限を制限するとかで
このダウンを回避する方法があったりすんでしょうか?
そしてその回避方法が紹介されているURLなどご存知でないでしょうか?
その他に「b」の上昇をストップさせる方法などないでしょか?
よろしくお願いいたします。
一般的に b の値が高いのは、I/O待ちをしているプロセスがたくさんあるということを意味します。
bi/bo の値も確認してください。これらも大きいと、ハードディスクの読み書きが頻発している状態にあります。
原因として考えられることは
などです。
こちらですが、mysqlの書き込みor読み書きだと思うんですよね。
mysqlのプロセルをkillすると「b」の値が急激に下がります。
この「b」を一定の値で制御できないんですかねー
ディスクのI/O 待ちを制御するって事は、MySQL が受け付けるコネクションの量を減らして
処理自体を減らすしかないと思うが。
MySQL プロセスのみが原因でメモリに余裕があるなら key_buffer 等を多めにとれば
アクセス頻度を下げることは出来るかもしれない。
いずれにせよパフォーマンスチューニングの領域だとは思う。
ありがとうございます。
今は、ちょっとチューニングして、
たまに「b」が10くらいまで上がることがあるんですが
次第に落ち着いて0に戻ります。
これは並んだ行列を捌けているということですよね。
前までは捌く前にどんどん行列ができて
いっぱいっぱいになる。
コネクションを減らすということは
行列に並ぶもの自体を減らすということですよね。
sqlの見直しがひつようなのかな。
limits.confを書き換えることで、利用できるリソースを制限することはできますが、まずは#2さんの回答通り、MySQL のチューニングを試みるべきでしょう。
そもそも MySQL のみでそれだけのディスクI/Oを要求しているならば、それだけの処理をしているということなので、それを制限してしまうと、正常にトランザクション処理できなくなります。
ただし、以前のサーバと比較して、メモリ容量が極端に小さいようでしたらメモリの増設をお勧めします。
回答回数上限になりましたので、これにて失礼します。
ありがとうございます。
以前のサーバーはVPSでメモリ2G。
今のサーバーは専用で1Gです。
1G少ないんですが
専用で使えるんで大丈夫かなーとおもってたんですが
もしかしてこの考えが甘かったのかな?
と思ってきました。
※VPSの2GはVPS利用者間で2Gを共有しているんですよね?
回答回数上限設定を変更していただいたので、#4のコメントに回答します。
ご利用のOSも分かりませんし、MySQLにどのような処理を行わせているのか分からないので何とも言えませんが、まず、下記サイトを参考に、どのくらいのメモリ量が必要なのか計算してください。
これらのパラメータの変更が可能なら、まず、チューニングを試みてください。
チューニングができないようなら、メモリを増設してください。32bit Linux であれば、MySQL は4Gバイトまで対応します。
VPSの2GはVPS利用者間で2Gを共有しているんですよね?
そうですが、同時にメモリ空間を使い切ってしまうことはないと思うので、各々のユーザーに2Gバイトを割り当てているのではないでしょうか。
ただし、VPSと現在の専用サーバのOSが違うとすると、一概に比較することはできません。同じLinuxでもディストリビューションや走っているデーモンが異なれば、利用可能なメモリ量は変わってきます。
ありがとうございます。
参考になります。
VPSにメモリのことを問い合わせましたら
2G共有で、あまりにも多く使うと500Mに制限されるという話でした。
また現在の専用のOSはCentOS 5 です。
VPSの時のOSは
ゲストがRed Hat Enterprise Linux 3.0です。
ホストがRed Hat Enterprise Linux 4.0です。
vmstat 1
で監視しているんですがいつもは0で
たまに1、2が出てきます。
この時は安定しますね。
でたまに10近くまで上がって
ここからまた0に戻るときもあるんですが
ずーっと上昇し続けるときがあります。
そうなると手がつけられなくなるので
mysqlのプロセスをkillすると「b」が急激に下がり
安定します。
いろいろチューニングしてみます。
ありがとうございます!
厳密な状況を見ていないので本当に MySQL だけが原因かわかりませんが、一応チューニングのポイントを。
原則 id:pahoo さんのおっしゃるとおり
そもそも MySQL のみでそれだけのディスクI/Oを要求しているならば、それだけの処理をしているということなので、それを制限してしまうと、正常にトランザクション処理できなくなります。
という状況が予測されるので、自分の回答の以下の部分は最後の手段といった感じです。
コネクションを減らすということは
行列に並ぶもの自体を減らすということですよね。
行列自体の長さを制限するわけですから、それ以上の人が集まればエラーになりますので。
MySQL でチューニングできるパラメーターは多くありますが、それだけで何倍にも性能アップするケースは
まれなので原則 SQL の見直しやアプリケーション側の処理方法変更のほうが効率的です。
DSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング!
どこがネックになっているかを調べるには slow-query ログを設定するのがたいていの場合即効性がある。
【MySQLウォッチ】第8回 MySQLチューニングのテクニック:ITpro
ここに出てくるクエリだけでも書き換えるとスループットは改善する可能性が高い。
負荷が高い状況に直面できれば mytop/innotop といったツールで直接的に状況を見ることも出来ます。
参考になります。
ありがとうございます!
やっぱりSQLの見直しなんでしょうか。。
ただやっぱり気になるのは以前のサーバーで同じコードでダウンしていなかったということなんですよね。
チューニングしてみます!
ありがとうございます。
そして説明不足でした。
http://php.y-110.net/wiki/index.php?%A5%B5%A1%BC%A5%D0%BF%C7%C3%...
↑ここと同じ症状です。
「# 他のデーモンなどが頻繁にディスクアクセスしている」
こちらですが、mysqlの書き込みor読み書きだと思うんですよね。
mysqlのプロセルをkillすると「b」の値が急激に下がります。
この「b」を一定の値で制御できないんですかねー
メモリを増やすべきか・・。