2

私は本当に困惑している状況にあり、誰も問題が何であるかを知らないようです.

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 で非常に快適に感じていますが、私はこれを設定しておらず、システム管理者でもないので、そこに何かが欠けている可能性があります。このセットアップを管理している担当者に尋ねたところ、問題はコードにあるに違いないとのことでした。それがどこにあるのかはわかりません。

また; すべてのヒントは大歓迎です!

4

1 に答える 1