Railsに限らずCloud 9でWebアプリを開発していたらHTTP 504エラーが発生してしまう場合
考えられる原因は
1.Cloud 9自体が重い
2.Cloud 9上で作ったプログラムが重い
のいずれかと思います。
HTTP 504はGateway Timeoutというエラーなので
ブラウザがウェブサーバーにリクエストを投げてから一定時間以内にレスポンスが返ってこないためにエラーが発生しています。
1.Cloud 9自体が重い場合
Cloud9のEC2の停止→起動をしてインスタンスが別の場所に作られることを願いましょう。
再起動だと同じ場所にインスタンスが作成されるようなので治る可能性は低いと思われます。
2.Cloud 9上で作ったプログラムが重い
プログラムが重い原因を突き止めましょう。
原因
SQLが多重に呼ばれていて処理が時間内に終わらない場合
対応策
SQLの量を減らしましょう。
JOIN句を使って一度で複数のテーブルのデータを取得するようにしましょう。
GEMのBulletを使うとn+1問題の解決の糸口を教えてくれます。
取得したいデータ量が同じ場合、一回のSQLと複数回にわたるSQLの発行では一回のSQLで終わらせた方が早いです。
SQLの量を減らしましょう。
JOIN句を使って一度で複数のテーブルのデータを取得するようにしましょう。
GEMのBulletを使うとn+1問題の解決の糸口を教えてくれます。
取得したいデータ量が同じ場合、一回のSQLと複数回にわたるSQLの発行では一回のSQLで終わらせた方が早いです。
原因
データ量が多すぎる場合
対応策
ページネーションを使用して一度に取得するデータ量を減らしましょう。
表示されるデータ量が多ければ通信データを作成する時間もメモリ量も多くなり処理が遅くなります。
ページネーションを使用して一度に取得するデータ量を減らしましょう。
表示されるデータ量が多ければ通信データを作成する時間もメモリ量も多くなり処理が遅くなります。
原因
ループ処理が抜けられない。
対応策
どのような処理でもループの終了条件を作りましょう。意図しないモデルのメソッドの呼び出しによって永久ループになる場合もあります。AメソッドがBメソッドを呼びBメソッドがAメソッドを呼ぶを繰り返す状態になると永久ループになります。
また多重ループも処理が重くなる原因となります。
どのような処理でもループの終了条件を作りましょう。意図しないモデルのメソッドの呼び出しによって永久ループになる場合もあります。AメソッドがBメソッドを呼びBメソッドがAメソッドを呼ぶを繰り返す状態になると永久ループになります。
また多重ループも処理が重くなる原因となります。
コメント