gijin.netをはじめてから一週間。
最初は遊びで作っていたのですが、なんのかんのでメインBlogになりつつあります。AWSの勉強がてら、という事もあって、あまりWebサーバとかそっちには力を入れないつもりだったんですけどね。
ここ数日、つながりにくくなる事がよくありまして。ブラウザで見ていると、突然うんともすんとも言わなくなってしまいます。特に記事をアップしてすぐとか。あまりWebサーバに詳しくはないのですが、これはきっとApacheかなぁ、とか。構築した時のデフォルトそのまんまにしてますからねぇ。
そんなわけで、Apacheのチューニングを実施してみました。
参考にしたのはOSSコンソーシアムのこちらの記事。
詳細は上記のリンク先をご確認くださいな。
早速、AWSで立ち上げているWebサーバへsshでログイン。記事にあるコマンドで状態を見てみます。
[code]free[/code]
このコマンドは、メモリの使用状況を調査するためのものです。今回はAWSのmicroインスタンスを使っており、起動直後にこのfreeコマンドを打つ事で、メモリの状態をまず確認します。
total used free shared buffers cached
Mem: 1020528 142968 877560 0 9196 78468
-/+ buffers/cache: 55304 965224
Swap: 0 0 0
Apacheに割り当て可能な最大メモリ量は-/+ buffers/cache:行のfree列との事ですので、それを見てみます。上記の表から「965224」が割り当て可能な最大メモリ量となりますね。まぁこの値をギリギリに使っちゃうと、それはそれでキャッシュやバッファに使う分を圧迫しちゃうという事で、まぁ適度に、というところですかね。
ちなみに記事の中や、Googleで同様の記事を読んでると、同じサーバでDBサーバも兼ねている場合もあるようで、まぁその時はそっちの分も考えておく必要があるでしょうね。とりあえず私の場合はDBサーバは別のインスタンスで上げているので、今回は気にしない事にします。
次はApacheが実際に使っているメモリ量を調査します。
先のリンクでは、次のように書かれていました。
今回はPreforkで動作させるので、Apacheはスレッドを使わずに、1つの親プロセスとリクエストを受け付ける複数の子プロセスで動作します。
preforkについてちょっと説明。
親プロセスが、リクエストがある度に子プロセスを起動(forkっていう)し、実際の通信は子プロセスが行うわけです。ただ、リクエストの度にforkしちゃうと、forkが終わるまでに待ち時間ができちゃって、通信が遅くなっちゃいますよ、と。
preforkというのは、最初からいくつか子プロセスをforkしちゃっておくやり方。最初からforkしておくんで、fork完了するまでの待ち時間、っていうのが無いので、高速にリクエストに答えられる、というわけです。
ということで、やろうとする事は単純で、この「子プロセス」を最大でいくつ上げておけるか、というのを調査します。
Apacheが使っているメモリ量を調査するコマンドを、先のリンクからコピってつかってみます。
[code]ps aux | grep [h]ttpd | grep [a]pache | awk ‘BEGIN{x=0}{x+=$6}END{ print x/NR }'[/code]
結果は「5484」との事。
さていよいよ、Apacheの最大子プロセス数を計算します。
計算式は次の通り。
Apacheの最大子プロセス数 : P =
Apacheに割り当て可能なメモリ量 / Apacheの子プロセスあたりの平均メモリ使用量
じゃあこれに当てはめて
965224 / 5484 = 176
これでP = 176という結果になりました。
じゃあ早速チューニング作業です。
httpd.confの中の、preforkの設定を変更しましょう。
[code]sudo vi /etc/httpd/conf/httpd.conf[/code]
preforkで検索します。
「IfModule prefork.c」 というのが見つかるはず。
これも先のリンクにあるものを抜粋して、それぞれの設定の意味を載せておきます。
StartServers :
起動時に作成する子プロセス数
MinSpareServers :
リクエスト待ち状態の子プロセスがこの数値より少ない場合は新しく子プロセスを作成する
MaxSpareServers :
リクエスト待ち状態の子プロセスがこの数値より多い場合は超過した子プロセスを終了する
ServerLimit :
起動可能な子プロセスの最大値、変更には再起動が必要
MaxClients :
起動可能な子プロセスの最大値、リロードで変更可能
MaxRequestsPerChild :
子プロセスがこの回数までリクエストを受け付けたら、子プロセスを終了する
実際の値についても、以下の通り計算してみました。
StartServers P×5/256
MinSpareServers P×5/256
MaxSpareServers P×10/256
ServerLimit P
MaxClients P
MaxRequestsPerChild 1000
Pの値をそれぞれいれれば、それっぽい数字が出てきますよね。それをそのまま設定して、Apacheを再起動してみました。
おお、なんか安定したかも???
まぁこれで様子を見て、ですかね。個人的にはnginxとかmysqlのチューニング(RDSに替える、ってのもやってみたい)とかとかもまぁどこかでやってみるつもりなので・・・まぁそのうちに。
コメント