mysqlの運用時のトラブルと試行錯誤のメモ

条件

  • 1分間にクエリの実行が30回〜60回程度発生する。
  • 結果のテーブルは7フィールドの数千〜10万件レコード程度のテーブル
  • mysqlのスペックはCPUがcore2duo,メモリが8GB,他のサービスとしては主にapacheやphp,tomcatなどを同時稼働

結果

  • クエリの結果が表示されない。(メモリが足らない?または、クエリのキャッシュが不具合?)
  • mysqlのサービスは落ちていない。

考察

クエリの実行回数が少ない時は発生しなかったが、高負荷時にはクエリの実行結果が正しく表示されないという現象が頻発するようになった。サービスが落ちてはいないことからキャッシュ関係の設定(table_cache, query_cache_size, max_connections, thread_cache)を見直しながら試行錯誤してみたものの改善せずまた原因もわからず。

メモリを増やせば解決する問題のような、そうでもないような・・・。今で限界の8GB積んでいるから、増やすとなると次は・・・16GB?ECC機能付きのメモリは今の相場だと厳しい値段がついているような予感。それも4GB×4枚だとちょっと。

今のところは応急処置として、定期的にキャッシュクリアをすればなんとか正常にクエリ結果を返すことはわかった。しばらくはそれでもたせて、何か他に見落とした設定があるかもしれないので引き続き調査を続行。

追記

  • キャッシュクリアでは効果があまりない模様。仕方が無いので定期的にmysqlのデーモンをリスタートさせることでさらに応急処置。
  • mysqlの起動スクリプトで簡単にリスタートできることを今更ながら発見。スクリプトの場所は標準なら code>/usr/local/mysql/share/mysql/mysql.server にある。起動スクリプトの使い方は,半角スペースを空けてrestartと入力するばいい。(例:/usr/local/mysql/share/mysql/mysql.server restart)
  • このときオプションもついでに使うことができる模様。オプションを指定して起動スクリプトを実行すると設定ファイルより優先される。(例:/usr/local/mysql/share/mysql/mysql.server restart --skip-slave-start)

追記2

事態が好転しないのでmysqlの設定をもう一度見直し。

  • table_cacheの値を100→1024に大幅に増加して設定してみる。
  • key_bufferの値は控えめに1024MB→256MBに設定してみる。
  • max_connectionsも100→50に減らしてみる。
  • query_cache_sizeの値も16MB→8MBに減らす。

このあたりの設定変更をして様子をみてみる。というか,根本的に何か間違っている予感・・・。

追記3

さらに設定見直し。今度はプログラムの方にも修正を入れることにした。雑に書いていたコード部分を整備して,変数宣言など余計なものをチェックして修正することで少しでもメモリの浪費を抑える。

で,今のところはかろうじて安定してきた。

コメントを残す

メールアドレスが公開されることはありません。