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

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

ただいまの
回答率

88.60%

LAMP環境によるWebシステムのアクセス集中時について

受付中

回答 5

投稿

  • 評価
  • クリップ 3
  • VIEW 1,545

shige1977

score 11

こんにちは

会員制WebシステムをLAMP環境で開発しております。
現在運用中で、ユーザー数は約3700件ほどで、法人向けのものとなっております。
当システムは、アクセス数が大雨や大雪、災害等による緊急時になると
平常時に時と比べ格段に上がります。
その対策として、例えば事前に大雪が降るということが分かれば、
クラウド型のサーバーを利用するため、
サーバーをスペックアップするということを行っています。

運用前に負荷テストを、スペックアップ後のサーバーより行っています。
Jmeterでログイン画面やログイン後の画面等、いくつかの画面を利用し
1分間に12000件(ユーザー数の倍以上)アクセスを行った時に、画面がすぐ(2~3秒後)に表示できることを確認しています。

ですが、実際にはサーバーをスペックアップしても、アクセス状況により、画面表示に1分ほど待つ場合があります。
その際、Webサーバーのロードアベレージが1~2になっていることを確認しました。(平常時は1以下)
DBサーバーのロードアベレージは平常時どおり1以下でした。
この原因は、サーバー側(ミドルウェアも含む)によるものなのか、あるいはプログラム側によるものなのか、
それ以外によるものなのか、アドバイスを頂けますでしょうか?

以下にサーバーに関する詳細を記載します。

○構成・スペック

【構成】
Webサーバー2台
→・apache
・負荷分散のため、ロードバランサでラウンドロビン方式を利用
・会員制Webシステムに画像をアップする機能も付いているため、
rsyncとlsyncdを使ったディレクトリの双方向同期を行っています。

DBサーバー1台
→mysql

【スペック】
Webサーバー、DBサーバー共に
・平常時
4CPU X 2.2GHz
32GB RAM

・緊急時
16CPU X 2.595GHz

32GB RAM

○ミドルウェアの設定

【apache・httpd.conf】
KeepAlive On
KeepAliveTimeout 1

<IfModule prefork.c>
StartServers          8
MinSpareServers       5
MaxSpareServers      20
ServerLimit       2048
MaxClients        2048
MaxRequestsPerChild   4000

【mysql・my.cnf】

max_connections = 2048

不足している情報がございましたら仰って下さい。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+3

スペックアップ後のサーバーより行っています。

所謂C10K問題に引っかかっているように思えます。
Apacheも設定やバージョン次第で頑張れますが、恐らくApache+PHPと普通に書いてあるのを見る限り、Apache2.2+mod_phpの構成なのでは?

もしそうならサーバーのスペックアップは完全に無駄
…とまでは言いませんが、Apache2.2が足を引っ張るので性能が頭打ちになるでしょう。

参考記事を張っておきますので、
Apache2.4のevent_mpmルート、Nginxルートの2ルートのいずれかを選んで乗り換える事をオススメします。
mod_phpが使えるのはApache2.2だけなので、どの道FastCGI行きです。

参考記事:


・会員制Webシステムに画像をアップする機能も付いているため、
rsyncとlsyncdを使ったディレクトリの双方向同期を行っています。

これはセキュリティ的な都合もあるかとは思いますが、高速化する為のアイデアだけ共有します。
オブジェクトストレージ、CDNといった画像配信用のサービスがありますので、
上手く活用すれば既存のサーバーは負荷を一切気にする必要はなくなります。

また自前の画像サーバも静的ファイルに限った運用ならば、
Nginxを使えば楽に高速動作させられるサーバが用意出来ます。
こういった手法を駆使して分離する手段がありますので参考にどうぞ。

参考サイト: Amazon CloudFront

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/25 11:29

    回答ありがとうございます。
    C10K問題は、恥ずかしながら初めて知りました。。
    質問に書き忘れたのですが、phpではなくperlを使用しています。
    なので、構成はApache2.2+mod_perlです。
    いずれにせよ、参考記事を参考にさせて頂き、apacheを見直したいと思います。
    また画像に関しても、この機会に画像配信用のサービスを利用するよう、検討したいと思います。

    キャンセル

  • 2018/01/25 11:37

    > C10K問題は、恥ずかしながら初めて知りました。。
    このための回答でしたのでうまく刺さって良かったです。

    > phpではなくperlを使用しています。
    LAMPからPHPと勝手に解釈していたようです、申し訳ない。
    Perlでのサーバー単騎で捌けるアクセス数を増やす案は門外漢です、ごめんなさい。

    現実的にはma7ma7pipiさんのやり方が主軸になるかもしれませんね。
    画像を専用のサーバで管理出来れば解決できそうですし。

    キャンセル

  • 2018/01/25 11:44

    > LAMPからPHPと勝手に解釈していたようです、申し訳ない。
    > Perlでのサーバー単騎で捌けるアクセス数を増やす案は門外漢です、ごめんなさい。
    いえいえ。こちらもperlと書かずに申し訳ございませんでした。
    やはりPHPとperlとでは違うのですね。。

    キャンセル

  • 2018/01/25 11:48

    FastCGIという名前の通り、Perlでも使えるようです。
    http://yuumi3.hatenablog.com/entry/20071004/1191509531

    Apache2.2から逃げる手法は存在するようです。
    いやまてよ、Apache2.4がmod_phpが使えないのは知ってますが、
    同じようにmod_perlも使えなくなるんですかね?

    そんな感じで調査は必要そうですが、取れる手段は結構ありそうですね。
    色々調べてみてください。

    キャンセル

+2

考えるより、サーバー増やしたほうが良いんじゃないですか?
自分の経験上

・ロードバランサー
・nginx x 3 4gb
・db x 1 8gb

で秒間 5000アクセス耐えれましたよ。
画像はオブジェクトストレージにしたほうがよいと考えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/22 18:54

    回答ありがとうございました。
    ご参考にさせて頂きます。

    キャンセル

+1

C10K等はみなさんが書かれているので、あくまで補足の投稿となりますが、
IoTの通信などと違って、ITの通信は画像のアップロードなどが絡むと、時間帯によってはおっしゃられるような事態になることがあると思います。あと、微々たるものかもしれませんが、CSSやJSが画面表示を遅くしている原因になってる場合もあります。minifyなどができているかの再確認が必要かと思います。

あと、apacheのkeepaliveの設定がOnになっていないかとかその辺の設定が肝な気がします。keepaliveがonだと設定した時間が経過してタイムアウトになるまで他の処理に移れないという仕様がapache2.2だとあったかと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/22 15:39

    補足のご投稿ありがとうございます。
    またコメントが大変遅くなってしまい、申し訳ございませんでした。。

    CSSやJS、また画像については、取り急ぎ、ユーザーがよく使われる画面のみ
    オブジェクトストレージを使用するようにいたしました。
    ゆくゆくは全てのファイルをオブジェクトストレージにて対応する予定でおります。

    またapacheのkeepaliveにつきましてはOnになっておりました。
    仮に全ファイルをオブジェクトストレージで対応するようにした場合
    画面表示時に、画像等のコンテンツのダウンロードはapacheからではなく
    オブジェクトストレージになるため、keepaliveはOffにしてもよいのでしょうか?

    キャンセル

0

使っている人の数が少ないときもあれば多いときもあるみたいな状態を想定しているのならそのApacheの設定で良いと思いますが、めちゃくちゃ忙しい時用の設定ならあまり子プロセスをforkをしないようにした方がいいのではないかと思います。
forkは重めの処理であると聞いています。

8つ(StartServers)の子プロセスから開始して、忙しかったら最大2048つ(MaxClients)の子プロセスまでforkするっていう処理と、20以上(MaxSpareServers)の子プロセスなら要らない子プロセスのをkillしていって、その分新しいリクエストに従ってまたMaxClientsまでforkするっていう無駄な処理が発生しているのではないかと思います。

なので、
StartServers          2048
MinSpareServers       2048
MaxSpareServers      2048
ServerLimit       2048
MaxClients        2048

みたいな設定が良いのではないでしょうか?
もちろん、2048は一例です。

限界値 = (32GBのメモリ - OSや他アプリケーションの使用量) / 1つのHTTPプロセスで使用する平均使用量

設定値 = 限界値 * 0.8(余裕のため)

っていう感じで計算して出すのが良いと思いますがどうでしょう?

※サーバーのカスタマイズをメインの業務としていないので、もしかしたら勘違いがあるかもしれません。もし間違っていたら指摘してくれるとこちらもありがたいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/25 11:16

    回答ありがとうございました。
    この機会にpreforkの設定値を改めて見直したいと思います。

    キャンセル

0

1ヶ月前のスレッドで今更かもしれませんが・・・

"その"スペックでかつ "その"登録者数で、C10K問題が発生するような状況において

・OSのロードアベレージが1~2までしか上がっていない
・DBのロードアベレージは1以下である

そんな状況ってありますかね・・・?

preforkならば、現象発生時のhttpdプロセス数を確認すれば
WEBアクセスによる高負荷が発生しているかどうかの判断ができそうですが
こちらは確認されていましたでしょうか?

ちなみにですが、私が過去に経験した事例として下記のようなものがありました。

・サーバのリソース状況には大きな変動が見られない
・トラフィック過多や回線障害も発生していない
・ページの表示に1分以上要する

諸々の事情であまり詳しく説明することはできないのですが、結論として

「サイト表示における流れの中に外部ドメインのサービスを読み込む処理が組み込まれており
そちらの応答に遅延が発生していたために、サイト全体の表示に時間を要していた」

といった事象でした。

これは現象発生時に、FireFoxが保有する開発ツールで
"ネットワーク"の情報を取得した際に判明しています。

もしも現象が再発された場合には

"どの処理まで読み込めていてどの処理で止まっているのか"

こちらを確認すると何かわかるかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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