Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> サーバー関連 -> Apacheチューニング考察。サーバ全体は生きていてWebサーバーのみ落ちる場合の対策

Apacheチューニング考察。サーバ全体は生きていてWebサーバーのみ落ちる場合の対策

なぜか、サーバーダウンはしないのに、httpdが固まってしまって、Webサーバーを再起動するまでサイトにアクセスできない!という事例が、業務で何度か発生しているので、Apacheのチューニングをすることになりました。

というわけで、httpd.conf内の気になる箇所をチューニングしていきます。

基本設定系


Timeout 600 → 300

タイムアウトまでの時間を秒数で指定。
上記の例だと10分待つ事になるので、
場合によってはまずいかも。
でも、管理画面で写真をアップロードするシステムとかだと、
1分じゃまずいんだよなぁ。。
5分(300)くらいに設定し直すかな?

KeepAlive Off → On

HTTP通信の持続的な設定をするかしないか。
Onにしていると、1つのリクエストを使いまわして効率化が出来るみたいです。

MaxKeepAliveRequests 100 → そのまま

持続的な接続上で許可されるリクエストの数。0だと無制限。
とりあえず様子見でそのままに。


KeepAliveTimeout 15 → そのまま

持続的な接続で、次のリクエストが来るまでサーバーが待ってくれる時間。
まあ、15秒で、妥当だとは思います。

preforkの設定


まず、下記コマンドで、現在の設定がpreforkなのかworkerなのかを調べます。

/usr/sbin/apachectl -V

「Server MPM: Prefork」みたいな行があれば、preforkで稼働している、という事になります。

現在の設定:
<IfModule prefork.c>
StartServers 8
MinSpareServers 1
MaxSpareServers 10
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
MaxMemFree 10240
</IfModule>


StartServers 8
起動時に生成される子プロセスの数らしい。

MinSpareServers 1
アイドル状態の最小の子プロセスの数。

MaxSpareServers 10
アイドル状態の最大の子プロセスの数。

ServerLimit 256
サーバープロセスの上限値。
(Max Clientsより大きな値にする必要あり)

MaxClients 256
応答可能な同時リクエスト数。

MaxRequestsPerChild 4000
個々の子プロセスが扱えるリクエストの制限数。

MaxMemFree 10240
この値を超えたメモリはOSに帰るらしい。
要するに、許容量を超えたらメモリ解放されるって事っぽいですね。

うーん、この設定だと、細かい説明は省くとして、
最大256リクエストまでしか受け付けられないんじゃないかな。

んで、タイムアウトまで10分待機なので、
256リクエストが同時に来て全部タイムアウト待ちになると、
257人目はずっと待たされる・・・と(笑)

じゃあ、こんな設定はどうかな?

StartServers 100
MinSpareServers 1
MaxSpareServers 1000
ServerLimit 1000
MaxClients 1000
MaxRequestsPerChild 1000
MaxMemFree 10240


これで1000リクエスト同時対応の、タイムアウト5分なので、少しは安定するはず。
うーん、どうだろう。障害が起きてみない事にはなんともいえないな。

ちなみに、前回の、256だと、1プロセスあたり4MBくらいメモリを食うとすれば、最大でメモリ1GB消費されるはず。
1000だときっと4GBくらいでしょうな(適当)

厳密に言うと、php.iniのデフォルト設定では、memory_limitが128Mなので、1プロセス最大で128M消費されます。なので、1000をかけると、最大で128GBが消費される事になりますが、その場合、そもそも全てのプロセスで最大メモリまで消費されている、という事は、システム的な欠陥があるはずなので、システムを直す方が先決です。

あと、物理メモリが足りなければ、仮想メモリとしてHDDを食うので、HDDに128GBの余力があれば、そうは簡単に落ちない・・・はず。

なので、システム的な欠陥が無い前提で、クローラーが回りまくって同時に1000リクエストくらい行っても恐らく耐えられ、稀にシステムの欠陥を突かれて最大メモリまで消費しても、スワップである程度耐えられるような設定になるのでは?と予想。

workerの設定


<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

現状の設定は上記のようになっていますが、
worker.cは使っていないので無視します。

Apacheのアクティブ接続数を見るには


netstat -an |grep -e :80 -e :443 |wc -l

で、ポート80(http)とポート443(https)にアクセスしている接続数を調べる事が出来ます。

まとめ


Apacheのチューニングは、「この数値だと正解!」と断言して言うのが少し難しかったりします。サーバーによってスペックが違うし、取り扱っているWebサイトの規模やアクセスのされ方も違って来ますからね。一つ一つの設定項目の意味を把握したら、後は、勘を働かせて推論を立て、大まかな計算をした上で、topコマンドや、前述のアクティブ接続数を調べる方法などで推移を見ながら調節していく事になると思います。

ある程度時間が経ったら、今回の施策が正しかったかどうかをレポートしますね(^o^)/

後日談 (2年後に追記)


>ある程度時間が経ったら、今回の施策が正しかったかどうかをレポートしますね(^o^)/
・・・なんて、無責任な事を言いつつ、レポートしていなかったので、今します(爆)
結果はなんと!!!

!!!


!!!


落ちていないので分かりませんwwww



たぶんチューニング成功だと思われます(テキトー)
だって、あれ以来(約2年)サーバーが落ちていないから、
比較のしようがないんですよ。

チューニング成功した、という事にしておきましょう。
めでたしめでたし♪


この記事の最終更新日:2019/07/25
最初に記事を書いた日:2017/11/10

この記事をシェアする

このエントリーをはてなブックマークに追加

関連記事

Meteoric Streamについて

管理人

Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> サーバー関連 -> Apacheチューニング考察。サーバ全体は生きていてWebサーバーのみ落ちる場合の対策