私のシステムでも同じ現象に気づきました。通常1ミリ秒かかるクエリは、突然1〜2秒かかります。私の場合はすべて、単純な単一テーブルのINSERT / UPDATE/REPLACEステートメントです---SELECTにはありません。負荷、ロック、またはスレッドの蓄積は明らかではありません。
ダーティページのクリア、ディスクへの変更のフラッシュ、または非表示のミューテックスが原因であると考えていましたが、まだ絞り込んでいません。
除外
- サーバーの負荷-高負荷との相関関係はありません
- エンジン-InnoDB/MyISAM/Memoryで発生します
- MySQLクエリキャッシュ-オンかオフかに関係なく発生します
- ログローテーション-イベントに相関関係はありません
この時点で私が持っている他の唯一の観察は、私が複数のマシンで同じデータベースを実行しているという事実から導き出されています。私は重い読み取りアプリケーションを持っているので、レプリケーションのある環境を使用しています-ほとんどの負荷はスレーブにあります。マスターへの負荷は最小限ですが、この現象はそこで発生することに気づきました。ロックの問題は見られませんが、Innodb / MySQLで(スレッド)同時実行性に問題があるのではないでしょうか?スレーブの更新はシングルスレッドになることを思い出してください。
MySQL Verion 5.1.48
更新
私は私の場合の問題のリードを持っていると思います。一部のサーバーでは、他のサーバーよりもこの現象に気づきました。異なるサーバー間で何が違うのかを見て、物事を微調整して、MySQLinnodbシステム変数
innodb_flush_log_at_trx_commit
。
ドキュメントを読むのが少し厄介だと思いましたが、innodb_flush_log_at_trx_commit
1,2,0の値を取ることができます:
- 1の場合、ログバッファはコミットごとにログファイルにフラッシュされ、ログファイルはコミットごとにディスクにフラッシュされます。
- 2の場合、コミットごとにログバッファがログファイルにフラッシュされ、ログファイルは約1〜2秒ごとにディスクにフラッシュされます。
- 0の場合、ログバッファは毎秒ログファイルにフラッシュされ、ログファイルは毎秒ディスクにフラッシュされます。
事実上、(1,2,0)の順序で、報告および文書化されているように、リスクの増加と引き換えにパフォーマンスを向上させることになっています。
そうは言っても、innodb_flush_log_at_trx_commit=0
のサーバーが見つかりました innodb_flush_log_at_trx_commit=2
のサーバーよりもパフォーマンスが低下していました(つまり、「長い更新」が10〜100倍多い)。 。さらに、2に切り替えると、悪いインスタンスの状況はすぐに改善されました(その場で変更できることに注意してください)。
だから、私の質問は、あなたは何に設定されているのですか?私はこのパラメータを非難しているのではなく、そのコンテキストがこの問題に関連していることを強調していることに注意してください。