まとまりのないブログ

something which something is something

mysql

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

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

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

-mysql

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

Wrong bytesec: 49-48-48 at linkstart: 14313808772

またテーブルのクラッシュ。mysqlのテーブルがクラッシュする頻度が激増してきた。以前はこんなことなかったのだが・・・。今は一日一回発生して絶えず見張っていなければならないという状態になってしまってい …

no image

mysqlのmy.iniの標準値のメモ

mysqlのmy.iniファイルのサンプルの設定ファイルの値がどのように設定されているかチェック。mysqldの設定例を抜き出してみる。設定するときの参考にはなるだろうと思うので。

no image

mariadbのポートを変更する

mariadbのコンフィグファイルであるmy.cnfにポートの設定を追加する。mysqldセクションとportを下記のように追加して再起動する。そしてmysqlにログインして show variabl …

no image

Table 'テーブル' is marked as crashed and should be repaired

データベースへ接続してsqlを実行したときに Table ‘テーブル’ is marked as crashed and should be repaired というエラーが返ってきた。エラーの内容は …

no image

結果の行数をカウントする

mysqlで結果の行数をカウントするsql文は、 seletc count(*) from foo; で取得するのが最も簡単ではあるけれど、レコード数が膨大な場合にはパフォーマンスの面で問題になる場合 …