質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

特定のプログラムで504エラーが発生すると、サイト全体が504エラーとなる

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,049

shimizu

score 30

 発生している問題

Nginx(1.10) + PHP-FPM(7.0) + MariaDB(10.0) + CodeIgniter(3.1.9) でサイトを構築しています。

以下のプログラムを実行すると、504 Gateway Time-out が発生します。

while(true){
        sleep(30);
}

NginxやPHP-FPMにタイムアウトを設定しているため、このエラー自体は通常の動きだと思うのですが、1箇所で504エラーが発生すると、同サイトへのすべてのアクセスが504エラーとなるため、対応方法を知りたいと考えています。
ヒントになりそうな情報などでもよいので、ご存知の方がいらっしゃれば教えていただきたいです。よろしくお願いいたします。

 わかっていること

 PHP-FPM・MariaDB を再起動すると回復する

すべてのアクセスが504エラーとなったときに PHP-FPM もしくは MariaDB を再起動すると回復します。(Nginxは再起動しても回復しませんでした。)

 DBプロセスをkillすると回復する

問題のプログラムを実行時にDBプロセスを確認すると、以下プロセスの11299 が開始され、プロセスが残り続けます。それ以降のアクセスは 11303 のようにロック状態となります。11299 をkillすると、回復します。

MariaDB [(none)]> show processlist;
+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+
| Id    | User     | Host      | db             | Command | Time | State     | Info                                                | Progress |
+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+
| 11282 | root     | localhost | NULL           | Query   |    0 | init      | show processlist                                    |    0.000 |
| 11299 | UserName | localhost | DatabaseName   | Sleep   |   81 |           | NULL                                                |    0.000 |
| 11303 | UserName | localhost | DatabaseName   | Query   |   71 | User lock | SELECT GET_LOCK('27fac...', 300) AS ci_session_lock |    0.000 |
+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+
MariaDB [(none)]> kill 11299;

 CodeIgniter特有の問題の可能性が高い

通常のPHPプログラムとしてsleepを実行すれば、想定通りの動作(1箇所のみ504エラーで同サイトへのすべてのアクセスは問題なく処理できる)となります。

 エラーメッセージは特になし

nginx・php-fpm・mariadbについてエラーログを確認しましたが、気になる点はありませんでした。

 試したこと

 pconnectの設定値がFALSEであることを確認しました

http://ryokwkm2.hatenadiary.jp/entry/2015/09/28/161925

 CodeIgniterを最新にしてみました

https://teratail.com/questions/58318

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

+2

一旦自己解決しました。
ログの見落としがありました。。

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it


というログが出力されており、pm.max_childrenの上限を変更することで動作するようになりました。

またその後の調査で MariaDB・CodeIgniter を利用していない場合にも、発生することがわかりました。
以下PHPファイルを用意し、5つ(pm.max_children数)のブラウザタブからアクセスすると、再現しました。

<?php sleep(60); ?>

おそらく以下のような状況が発生していたのではと考えています。

既存の PHP リクエストがタイムリーに処理されない場合、新しい PHP リクエストは待機モードのままになります。Nginx の fastcgi_read_timeoutの値を超えると、504 Gateway Time-outエラーが発生します。
https://jp.alibabacloud.com/help/faq-detail/55207.htm

もし私の認識に間違いがあったり、pm.max_children変更以外の解決方法などあれば、回答いただければと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る