Webサイトのアクセス数増加と必要メモリ

Webサイトのアクセス数が増加するのは単純に嬉しいものです。
商用サイトなら売り上げに関わってきますのである程度の認知度とアクセス数は必要不可欠と言えます。
アフェリエイト目的(広告収入目的)のサイトは特にアクセス数増加が収入に比例してくるので何が何でも増やしたいところでしょう。

ところで、Webサイトのアクセス数と、それに耐えうるサーバーのスペックについて、一般の方々はどれくらいの認識を持っているでしょうか?

大抵の人は、とても夢見がちです。

よくあるレンタルサーバー(専用サーバーじゃなく、root権限のないサーバー、他のユーザーと同居の共用サーバー)を使用していて、「あなたのホームページはサーバーに負荷をかけるから」ということで上位プランへ変更のお願いや、やんわりと出て行ってくれるように勧告を受けた人が、次にVPSや専用サーバーに移るとき、10万ページビューとか、ゆくゆくは100万ページビューなんてことを考えている場合があります。
専用サーバーで1ユーザーで独占使用になるのだから、最低クラスよりちょっと上のクラスを借りておけば大丈夫かな、なんて思うようです。

ところが現実は厳しいです。

Webサイトのアクセス数増加に耐えられるサーバーとして考えるべき点は、大きく3つ、メモリとCPUとディスクの速さがあります。
今回はメモリについて書きます。

■ Webサイトのアクセス数と消費メモリ

まず必要なメモリの問題があります。
これは単純でわかりやすい話です。

皆さん、ここからが衝撃の事実ですよ。

衝撃の事実!

例えば、あなたのWebサイト、サーバーのOSがCentOS6 64bit(※今の主流)で、WebサーバーがApache2.2(※今の主流)で、レンタルサーバー屋さんのセットアップのデフォルト状態で使っていて、ホームページが普通にWordPressで、プラグインが5個以内くらいの特に凝った作りじゃない場合、

・Webサイトに1人の人が見に来ると、サーバー上でメモリ20MB~30MBくらい必要とします。

・Webサイトに同時に10人が見に来ると、サーバー上でメモリ200MB~300MBくらい必要とします。

・Webサイトに同時に100人が見に来ると、サーバー上でメモリ2000MB~3000MBくらい必要とします。

あれ?あなたのサーバー、メモリ、足りてますか?

メモリが足りないと、スワップという機構が動き出し、メモリの変わりにディスクを使います。
Windowsのページファイル、仮想メモリを使うのと似た現象で、こうなると極端に動作が遅くなります。
スワップが常に起こる状態で運営を続けると、サーバーは常にディスクを使い続けるので動作は遅いしCPU負荷がぐんぐん上がっていきます。

★同時に100人(同時アクセス100)★これが目安★

このあたりが、最近よくある手頃なサーバー(OSがCentOS6 64bit、WebサーバーがApache2.2、メモリ 2GB、CPU 2コア)で、Webサイト1個の動作環境としての目安です。

嘘、そんなはずはないですって?
昔は違った、ですって?

そう、昔は違いました。
昔は、ホームページの作りはPHPじゃなくてただのHTMLだし、サーバーで動いているOSも軽かったしApacheのバージョンが低くて動作が軽かったし、今とは環境条件が違うからです。
Windows も Microsoft Office も Adobe のソフトもバージョンアップの度に重くなりメモリを必要とするのと同じように、サーバーのOSもそこで動くソフトも時代とともに変わって今は重いのです。

■ Apache (Webサーバー)のアクセス数とメモリ計算

Apache というのは、Webサイトをブラウザで見えるようにしてくれる Webサーバーソフトウェアです。こういうのをミドルウェアと呼んだりサーバーウェアと呼びます。

ここでは、レンタルサーバー屋さんやサイト構築までしてくれるWebデザイン屋さん、サーバー設定屋さんがデフォルトで初期設定した状態、ということで話を進めます。

Apache の仕組み上、1人の人(=1つのブラウザ)がサーバーに接続してくると1つのプロセスが動きます。
2人目がサーバーに接続してくると2つ目のプロセスが動きます。
100人がサーバーに接続してくると100プロセスが同時に動きます。
そういう仕様です。

以下のとおり検証します。

サーバーで、ps コマンドを実行してみます。

# ps aux | head -1 && ps aux | grep httpd | grep -v grep

結果はこうです。(軽いホームページ、アクセス数の少ない状態)

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     17114  0.0  0.3 470980 13232 ?        Ss   Apr26   1:36 /usr/sbin/httpd
apache   21111  0.0  0.7 474796 27956 ?        S    May12   0:38 /usr/sbin/httpd
apache   21115  0.0  0.8 479880 32376 ?        S    May12   0:38 /usr/sbin/httpd
apache   21116  0.0  0.7 475104 28968 ?        S    May12   0:38 /usr/sbin/httpd
apache   21871  0.0  1.0 486060 39480 ?        S    May12   0:39 /usr/sbin/httpd
apache   21872  0.0  0.6 474152 26568 ?        S    May12   0:38 /usr/sbin/httpd
apache   21873  0.0  0.8 479540 31920 ?        S    May12   0:38 /usr/sbin/httpd
apache   21874  0.0  0.7 476468 29380 ?        S    May12   0:38 /usr/sbin/httpd
apache   21875  0.0  0.7 475956 28348 ?        S    May12   0:38 /usr/sbin/httpd
apache   21876  0.0  0.7 475900 29120 ?        S    May12   0:36 /usr/sbin/httpd
apache   21877  0.0  0.7 477232 29192 ?        S    May12   0:38 /usr/sbin/httpd
apache   21878  0.0  0.8 479540 32736 ?        S    May12   0:37 /usr/sbin/httpd

1行が1プロセスで、これが1アクセスを処理するものです。
RSS の列がこのプロセスが使用する実メモリです。(単位はKB)
USER が root になっているのは最初の1つ目のプロセス(親プロセス)でそれ以外がブラウザでWebにアクセスがある度にそれを処理するプロセスです。
このとき、全部で11の子プロセスが起動しています。11のWebアクセスを処理しているかまたは待機しています。
もしこれよりアクセスが増えると、必要なだけプロセスが起動して増加します。

ここで、RSS(使用する実メモリ)に注目します。

平均すると1プロセスは 28.42 MB のメモリを使うことがわかります。
合計すると、現在 341.09 MB のメモリを使っています。

このサーバーは、メモリ 4GB あるのでまだ余裕です。
free コマンドで現在のメモリの空き状況をMB単位で見てみます。

# free -m
             total       used       free     shared    buffers     cached
Mem:          3830       3645        185          0        199       2133
-/+ buffers/cache:       1312       2518
Swap:         2047          3       2043

free の列を見ます。

185 + 2518 = 2703 MB空きがあるので、

あと 2703 ÷ 28.42 = 95 プロセス起動できます。

つまり同時アクセス があと 95 人来ても大丈夫です。

あれ?こんな程度?

こんな程度が実際のところです。

ユーザーさんに何回説明してもなかなか信じようとしてくれない困った事実です。
これを前提にすると、1日100万ページビューとか目指すには相当メモリが必要だということを認めないといけないから信じたくなくて意識の外に追いやるのかもしれません。
でもまずは現実を直視しないと。
そこからです。

■ 目標ページビューから同時アクセス数耐久予測

ちなみに、1日100万ページビューに持ちこたえるには、秒間どのくらいのアクセス数をさばけるサーバーが必要かを単純計算すると以下のようになります。

1日24時間ずっと同じようにアクセスがあると考えるのはまあ不自然ですよね。そこで仮に20時間アクセスがあると仮定して100万を20で割ると時間平均ページビューが出ます。
1,000,000 ÷ 20 = 50,000 (ページビュー数/時間)

Apacheの設定が KeepAlive On の場合は、数秒間接続が維持されますが、仮にこれを 2秒とすると、1時間=3600秒で割った秒間ページビューが2秒間は重複して維持するので
50,000 ÷ 3,600 × 2 = 27.77 (ページビュー数/2秒)

ここでな~んだ、同時に30アクセスもないじゃん、と思ったら大間違い。これはあくまで平均なので恐らく1日のうちのピーク時はこの3~4倍くらいが妥当なのではないでしょうか。すると同時アクセス100を超えるかどうかというところになってきます。
やはりこの 同時アクセス100 これに耐えられることがキーポイントになってきます。

ところで、Apacheの設定が KeepAlive Off の場合、1ページビューは1接続ではありませんので要注意です。
ページを構成する画像 jpg,gif,png や css, js のリンクの数だけ、もしアフェリエイト広告や外部リンクの埋め込みがあればその総数だけApacheへリクエスト数(=接続数=プロセス数)が発生します。
1ページのデザイン画像や埋め込みリンクが仮に20あれば、上記計算を20倍した接続数をさばけなければなりません。すると秒間300~400接続さばくサーバースペックが必要になってきます。すると、これはもう専用サーバーの高性能なものが必要になってきます。

関連参考情報:
Webサーバーの同時接続数と Google Analytics セッション数(訪問数)の違い
キャッシュによる WordPress の高速化に関する誤解・勘違い
キャッシュサーバーで大規模サイト構築
高速化やキャッシュサーバーの構築・サーバー管理のご利用条件
高速化やキャッシュサーバーの構築のお申し込みからの作業の流れ

コメントを残す