なぜInnoDBデータベースへの接続は、しばしば整数秒単位で遅れますか?MySQLデータベースへの接続に時間がかかりません。
いくつかの背景
私はテーブルの 'ユーザ'(150の記録)及び(150の* 150の記録に成長している)テーブル '接続' からなる、非常に小さなMySQLデータベースを持っています。テーブルとインデックスの合計は5 MB未満です。
ユーザがアクティブな場合、「接続」の5-50レコードが変更されます(重みが変更されます)。または追加されます(まだ存在しない場合)。アプリ全体がスムーズに実行され、読み込み時間は〜100ミリ秒以下です。
そうでない場合を除きます。でも非常に小さい負荷の下で
詳細
、ページのロード時間を1000ミリ秒から10,000ミリ秒の間のどこかに60ミリからスパイク。
symfonyでプロファイラを使用すると、「getRepository」ステートメントで95%の遅延をピンダウンすることができましたが、クエリは1クエリあたり〜1ミリ秒しかかかりませんでした。これは、データベースへの接続が遅いアクションであったと私に信じさせました。私は定期的にこの理論をテストするためにデータベースに接続するヘルパースクリプトを書いた。データベースへの接続
<?php // call this script commandline using watch
$a = microtime(true);
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','mypass');
file_put_contents('performance.txt', (microtime(true)-$a).PHP_EOL, FILE_APPEND);
謎
一貫等1-3 MS、又は1,001-1,003 MS、又は2,001-2,003 MS、又は3,001-3,003 MS、整数の量を取りました秒、通常の時間を加えたものです。 400 msまたは800 msのようなものではありません。書き込みが行われていない場合、接続はほぼ即座に行われました。アプリを介していくつかの書き込みが実行されるとすぐに、より高い数値に達しました。
この現象の原因は何ですか? InnoDBのpage_cleanerは1,000ミリ秒ごとに作業を行っているようですが、それは説明の一部でしょうか?
もっと重要なことは、これをどのように修正できますか?私はMEMORYテーブルに切り替えることを考えていましたが、よりエレガントなオプションが利用できるはずです。リクエストに
EDIT
、the variables and global status。
追加情報:私は127.0.0.1(上記のコードスニペットを参照)に直接接続し、スキップ名解決フラグを無効にしてテストしました。それはDebianサーバです。
EDIT 2
私は遅延が1、3、7または15のいずれか秒であったが見つかりました。 1秒、+ 2秒、+ 4秒、+ 8秒のパターンに注目してください。これは本当にいくつかのタイムアウト問題のように見えます...
で読むことが多くあります。私が疑うもの:十分なスレッド/(db)接続が利用できない、接続プーリングの設定(ちょうど私たちがその問題を1度持っていたから):)またはそのようなもの。接続はクエリではなく遅いです。遅れが進んでいる間、「innotop」画面を見ているかもしれませんか?長いクエリが実行されていて負荷が高いと表示されない場合、接続の作成に問題があります。 – Nanne
「innotop」について知りませんでした。負荷:0.00、QPS:10-20、遅い:0、QCacheHit:50%、KCacheHit:100.00%。質問は本当に問題ではないようです。 – TacoV
私はテストとしてMEMORYに切り替えました。奇妙な接続遅延の問題が続く... – TacoV