Apacheの記事一覧

さくらのVPS、引き続きApacheチューニング

Apacheハンドブック

昨日はApacheの「Out of memory」エラー対策として apache2.conf の設定を変えました。

しかしMaxClientsを下げすぎたようで、アクセスピーク時にCPUのロードアベレージが下がらない状態になってしまいました。

仕方なくtopコマンドで状態を監視しつつ、MaxClientsを少しずつ変更し、120まで上げたところで一段落。

そんな流れを踏まえ、現在の “/etc/apache2/apache2.conf” には以下の変更を加えています。

MaxKeepAliveRequests 50
KeepAliveTimeout 5

<ifmodule mpm_prefork_module>
    StartServers         8
    MinSpareServers      8
    MaxSpareServers      8
    MaxClients          100
    MaxRequestsPerChild  4000
</ifmodule>

基本ポリシーとしては「遅くても良いから省メモリー」です。以下、変更内容の覚え書きです。

MaxKeepAliveRequests

“MaxKeepAliveRequests”は、KeepAliveを続けるリクエストの最大数だそうです。日本語で言い換えると「1ページを一度で読み込む為に必要なリクエスト数」と言うことらしいです。

初期値は100ですが、テキストメインの当ブログは少な目で良いだろうという判断で50まで下げてみました。

KeepAliveTimeout

“KeepAliveTimeout”は、KeepAliveを続ける秒数です。初期値は15秒ですが、思い切って5秒まで小さくしてみました。

StartServers, MinSpareServers, MaxSpareServers

StartServers, MinSpareServers, MaxSpareServersは待機プロセスの数を決定するそうです。

TOPで観察したところ、これがメモリ残量に大きく係わっているようだと分かりました。

Start, Min, Maxを揃えてオーバーヘッドを無くしつつ、上限を8に絞ることでメモリの空き容量を増やしました。

StartServers, MinSpareServers, MaxSpareServers

MaxClientsは昨晩のピーク時に暫定対策として120まで上げましたが、またちょっと下げて100にしてみました。

これも個々のプロセスのメモリ使用量に係わる値のようなので、省メモリサーバでは低めにした方が良いようです。

MaxRequestsPerChild

MaxRequestsPerChildは「個々の子サーバプロセスが扱うことのできるリクエストの制限数」だそうです。初期値は ‘0’ で制限されません。

TOPで観察したところ、動いてないけどメモリを食ってるプロセスが見えたので、ある程度行ったら再生成されるよう制限を設けてみました。

これで不正なメモリリークの予防と、積極的なメモリ解放が行われることを狙っています。

さくらのVPS、Apacheチューニング

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

興味のないヒトにはくどいでしょうが、本日も「さくらのVPS|VPS(仮想専用サーバ)はさくらインターネット」にUbuntuでLAMP環境を構築し、その上でWordPressを動かすオハナシです。

なかなか安定運用に持って行けてませんが、http無応答時にコンソールを覗くと、Apacheさんが「Out of memory」を吐きまくっていることに気がつきました。

Out of memoryについて

まず「Out of memory」に付いて調べました。

linuxの初期設定では総メモリ容量(実メモリ+Swap)以上の実効メモリ容量を要求された場合、実際には足りないのに大らかな気持ちで要求を受入れてしまうそうです。

結果として必要なメモリが足りない事態が発生した場合、適当なプロセスをkillしてしまうそうで、これを行うのが「Out Of Memory Killer」ことOOM Killerさんのお仕事で、OOM Killerさんが吐くエラーが「Out of memory」として表示されていたようです。

OOM Killer概要:
Out Of Memory Killerのこと。Linuxのデフォルトの動作では、プロセスがメモリを要求した場合、総メモリ使用量が実メモリ+swap以上であっても、ある程度許可するようになっている。これは、各プロセスが要求したメモリをすべて使うわけではないという経験的な法則により、できるだけ多くのプロセスを起動するためにそのように動作になっているようである。そのため、あるプロセスが確保できたはずのメモリを使おうとし、実際にメモリが足りない場合カーネルが適当なプロセスを選択し、そのプロセスをkillしてしまうことをOut Of Memory Killerという。

引用元:http://yochecks.blogspot.com/2007/04/oom-killer.html

Apacheのチューニング

OOMエラーを理解することにより、Apacheの「なにか」がメモリを浪費しているのでは無いか?というアタリを付けました。

なぜApacheさんがメモリを食いまくっているか?と言う根本的な理由は分からないですが、取りあえずの対策としてApacheの設定をチューニング。

/etc/apache2/apache2.confを開き、mpm_prefork_moduleの設定を以下のように変更しました。

<ifmodule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients           34
    MaxRequestsPerChild  4000
</ifmodule>

一番大きく変更したのは「MaxClients」の値です。初期値では150になっていましたが、省メモリ環境での運用であることを踏まえ、34に制限してみました。これで良い変化があると良いんだけどな~。

Apacheのチューニングに付いては、『さくらのVPSのその後@2010-10-25 | それでも地球はまわっている』や、『[Slicehost] OOM Killer(Out Of Memory Killer)の対策 – delab』を参考にしています。貴重な情報ありがとうございます。