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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

5回答

364閲覧

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

shige1977

総合スコア11

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

3クリップ

投稿2018/01/22 09:28

こんにちは

会員制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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

所謂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/22 23:38

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shige1977

2018/01/25 02:29

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

2018/01/25 02:37

> C10K問題は、恥ずかしながら初めて知りました。。 このための回答でしたのでうまく刺さって良かったです。 > phpではなくperlを使用しています。 LAMPからPHPと勝手に解釈していたようです、申し訳ない。 Perlでのサーバー単騎で捌けるアクセス数を増やす案は門外漢です、ごめんなさい。 現実的にはma7ma7pipiさんのやり方が主軸になるかもしれませんね。 画像を専用のサーバで管理出来れば解決できそうですし。
shige1977

2018/01/25 02:44

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

2018/01/25 02:48

FastCGIという名前の通り、Perlでも使えるようです。 http://yuumi3.hatenablog.com/entry/20071004/1191509531 Apache2.2から逃げる手法は存在するようです。 いやまてよ、Apache2.4がmod_phpが使えないのは知ってますが、 同じようにmod_perlも使えなくなるんですかね? そんな感じで調査は必要そうですが、取れる手段は結構ありそうですね。 色々調べてみてください。
guest

0

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

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

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

投稿2018/01/22 09:43

ma7ma7pipipi

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shige1977

2018/01/22 09:54

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

0

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

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

投稿2018/01/26 15:12

編集2018/01/26 15:23
imamoto_browser

総合スコア1161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shige1977

2018/02/22 06:39

補足のご投稿ありがとうございます。 またコメントが大変遅くなってしまい、申し訳ございませんでした。。 CSSやJS、また画像については、取り急ぎ、ユーザーがよく使われる画面のみ オブジェクトストレージを使用するようにいたしました。 ゆくゆくは全てのファイルをオブジェクトストレージにて対応する予定でおります。 またapacheのkeepaliveにつきましてはOnになっておりました。 仮に全ファイルをオブジェクトストレージで対応するようにした場合 画面表示時に、画像等のコンテンツのダウンロードはapacheからではなく オブジェクトストレージになるため、keepaliveはOffにしてもよいのでしょうか?
guest

0

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

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

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

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

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

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

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

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

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

といった事象でした。

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

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

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

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

投稿2018/02/22 07:42

k-nishiyama

総合スコア240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/22 10:31

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shige1977

2018/01/25 02:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問