apache負荷対策

昨日またテレビ放映されたお客さんがあり、サーバがパンクしてしまいました。

パンク中もがきながらやったことを書いておきます。

1. サーバ環境

サーバ台数:1台

OS: FreeBSD 6.4

httpd: Apache/2.2.14

DB: mysql 5.1.34

ネットワーク環境: 10Mbps専用

サーバでやってること: DBに保存された内容を表示する。DB更新頻度が少ないので、表示時にキャッシュするためほとんどスタティック環境に近い。

2.対策

(1)必要な環境は~

まず前提としてサーバ1台、10Mbpsでテレビ対応は絶対無理です。帯域100M、サーバ4台以上が妥当な構成かと思います。

(が、、、、数時間のために固定費5~10倍を払う人はいません。そして僕が苦労することになります。。。)

(2)データ圧縮の禁止
apacheの転送データ圧縮モジュール(deflate_module)を使って貧弱な回線をカバーしようとしても所詮無理なので、この圧縮は絶対止めましょう。このモジュールを有効にしてたら、リクエストの増加によってサーバが高負荷になって無応答になってしまいました。

(3)カーネルのチューニング

アクセスが増えてくると/var/log/messagesに以下のようなメッセージが出てきます。

kernel: Limiting closed port RST response from 2116 to 2000 packets/sec

出てきたら、sysctlコマンドで許容値を増やします。(DOSアタック防止のため低く設定されてるようです)

# sysctl -w net.inet.icmp.icmplim=4000

あとネットワーク周りではこの辺をいじりました。

net.inet.tcp.delayed_ack=0
net.inet.tcp.nolocaltimewait=1
net.inet.tcp.msl=5000

(4)httpd.confの設定

以前、KeepAliveがon/offだの書いたのですが、そんな設定では凌げませんでした。でもやはりoffの方が持ちこたえられるようです。最終的にはこんな設定でした。

KeepAlive Off
Timeout 15
StartServers 10
MaxClients 60
KeepAliveTimeout 1

MaxClientsは大きくすればリクエストを食えるのですが、サーバのロードアベレージが尋常じゃない上がり方をするのでこの程度で抑えざるを得ませんでした。サーバ上でやってる処理でも設置値は異なるので、上記パラメータを冷や汗をかきながらグチャグチャいじってください。ただ、どう考えても1台では無理だと思うので、こういうときはサーバを増やしましょう。1台増えればアクセス数は2倍食えるようになります。(帯域が倍になる前提で)サブドメインなどを設定し画像サーバを用意したりすると比較的簡単に負荷分散が出来るでしょう。

僕の言いたいことは~

テレビを見てて検索して、そのwebサイトが表示出来るような会社はかなりのお金持ち(or バカ)と思って間違いない!