Webエンジニアがアフィリエイトで稼ぐ

プログラミングやSEOなどWebエンジニアのノウハウを活かしてWebサービスを運営しています。

月間1000千万PVをさばくチューニング

PV増加の施策の効果もあって、PVが順調に回復していますが、ここ最近PVが増えたことで不安定になることが多かったので、この機会にサーバーの設定をいろいろ見直しました。
サーバを1日止めると約1万5千円の損失が出るし、ブログパーツを設置しているサイトすべてに影響があるのでかなり困る。

サーバー構成

APサーバ×1台、画像&バッチ処理サーバ×1台、DBサーバ×1台
サーバーはすべてGMO CloudのVPSです。
今回は度々不安定になることが多かったAPサーバのチューニングを実施

システム構成

OS:CentOS
Webサーバ:apache
言語:PHP
DB:MySQL
キャッシュ:MemCached

LAMP環境のシンプルな構成です。

ip_conntrack

syslogを見ると、ip_conntrackが枯渇し、サーバーに長時間アクセス出来ない状態が発生していたので、設定を見直しました。
ip_conntrackはiptablesがコネクションを管理するために使用するテーブルのようなもので、これが枯渇するとネットワーク接続が著しく不安定になります。

現在のip_conntrackの値を確認
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
65279

ip_conntrackの最大値を確認
# cat /proc/sys/net/ipv4/ip_conntrack_max
65536

設定値を変更
# vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 300000

この値はメモリの制約を受けるので設定値はメモリ状況と要相談

apache

sarコマンドで確認するとsystemのCPU使用率が常時高い状況が続いていたので、httpdのプロセス数を調整しました。

# vi /etc/httpd/conf/httpd.conf
<IfModule prefork.c>
StartServers 512
MinSpareServers 512
MaxSpareServers 512
ServerLimit 1024
MaxClients 1024
MaxRequestsPerChild 5000
</IfModule>

平均200前後、ピーク時で600前後のプロセスがbusyになるので、ServerLimitは少し余裕を持たせた値にしています。 SpareServersを1024にすると、CPU負荷が高くなるので、512で固定。
Nginxも試してみたいけど、サーバを長時間止めたくないので、なかなか踏み切れない。

さいごに

今回のチューニングでサーバーは大分安定しています。チューニング以外にもMemCachedでキャッシュする範囲を増やしたり、httpのリクエストを減らしたり、アプリ面の改修も実施しました。
PV増加の施策の効果もあって、先月は平均30万PV/日だったのが、最近は45万PV/日を超える日が多くなった。
これくらいのPVになると、10万PVくらいの上下では一喜一憂しなくなってきたので、100万PVの大台を目指したい。