私は本当に困惑している状況にあり、誰も問題が何であるかを知らないようです.
mysql サーバーに接続する php/Laravel で書かれた Web サイトがあります。API エンドポイントを数回非常に高速で呼び出すと (ウェブサイトのボタンを約 10 ~ 15 倍高速でクリックすることによって)、最後の数回は呼び出しに非常に時間がかかります。通常は約 200 ミリ秒続くと、突然 30 秒の倍数になります。つまり、1 回の呼び出しに 30 秒、別の 1 回 (またはそれ以上) の呼び出しに 60 秒、別の 1 回または複数回の呼び出しに 90 秒かかる、というようになります。
最初は php かもしれないと思ったmax_execution_time
ので、それを 15 に設定しました。残念ながら、変更はありませんでした。呼び出しには 30 秒の倍数がかかります。さらに、それが問題になる場合はエラーが返されますが、この場合は正しい 200 応答が得られます。
いくつかいじった後watch -n 0.3 "mysqladmin processlist"
、mysqlが原因であるかどうかを確認するために走りました。長時間の通話中に、次のように表示されます。
これが何であり、なぜそれが起こるのか正確にはわかりません。mysql がハングしている可能性があると考えたので、php の mysql クエリを syslog で囲み、mysql 呼び出しでコードが実際にハングするかどうかを確認しました。
syslog(LOG_ERR, "BEFORE");
$results = TheTable::where('edg', $edg)->get();
$theResponse = response(json_encode($results), 200)->header('Content-Type', 'application/json');
syslog(LOG_ERR, "AFTER");
return $theResponse
しかし、そうではないようです。「スリープ」時に mysqladmin プロセスリストにクエリが表示されていても、BEFORE
およびsyslog は常に互いの直後に表示されます。AFTER
さらに、ご覧のとおり、これは非常に単純な読み取りクエリであるため、ある種の mysql ロックが問題になることはないと思います (ロックは書き込みでのみ使用されると思うため)。
そして、この時点から、これをデバッグする方法についてちょっと迷っています。これらの結果が何を教えてくれるのか、この問題の解決策をどこで見つけることができるのか、誰か知っていますか? すべてのヒントは大歓迎です!
[追伸: セットアップに関する追加情報] セットアップは上で説明したよりも少し複雑ですが、それは関係ないと思うので、その情報は最後に取っておきます。実際には、前にロードバランサーを備えた 2 つの Ubuntu 16.04 サーバーがあります。2 つのサーバーには両方とも、ある種のマスター/マスター同期モードにある mysql サーバーが含まれています。私は Linux で非常に快適に感じていますが、私はこれを設定しておらず、システム管理者でもないので、そこに何かが欠けている可能性があります。このセットアップを管理している担当者に尋ねたところ、問題はコードにあるに違いないとのことでした。それがどこにあるのかはわかりません。
また; すべてのヒントは大歓迎です!