第3回:Backend Evolution(前編) (2/2)

まるごとPerl!
事例編〜Web 2.0サービスの中を見せます

第3回:Backend Evolution(前編)
著者:はてな  伊藤 直也   2006/10/23
前のページ  1  2
Webサーバーのメモリ使用率

   FastCGIやmod_perlでメモリ上にPerlプログラムを常駐させた場合、Webサーバーのプロセス1本あたりが使用するメモリ容量は非常に大きくなります。はてなブックマークの場合、httpdのメモリサイズは40MB以上になります。

   通常Webサーバーは、クライアントからの1リクエストに対して1プロセスあるいは1スレッドでそれに応答します。高トラフィックなサイトではサーバーに対する同時アクセス数が大きくなるため、結果としてサーバー上ではWebサーバーのプロセス/スレッドが何本も立ち上がることになります。

   すると、例えば40MBのプロセスが20本立ったとすると、それだけで800MBのメモリを消費してしまいます(注5)。

注5:実際には親プロセスとの間でメモリを共有することになるので、単純に40MB ×20本という計算にはなりません。

   1GBのメモリを搭載したサーバーで、Webサーバーのプロセスだけで800MBメモリを消費したとすると残りは200MB。OSが基本として必要とするメモリをここから差し引くと残りはわずか。

   この状態では、メモリに余裕があればOSのキャッシュに入るであろうファイル群がキャッシュされなかったり、スワップが発生したりすることによってディスクI/Oが頻発し、極端なパフォーマンス劣化が起きてしまいます。

   そこで、Webサーバーの処理のうちダイナミックなコンテンツはアプリケーションサーバーで、それ以外のスタティックなコンテンツは専用のWebサーバーで行うように役割を分離して対応するのが定番です。この後者の役割を担うのがリバースproxyです。

   リバースproxyは、アプリケーションサーバーの前に配置されるサーバーです。リバースproxyという名前から特殊なソフトウェアを想像してしまいますが、なんのことはない、普通のWebサーバーです。クライアントから受け取ったリクエストのうち、画像などのスタティックなドキュメントは自分で返し、ダイナミックなコンテンツはアプリケーションサーバーに処理を転送するという点が通常のWebサーバーと異なります。

   クライアントから、Perlプログラムが生成する必要のある動的なコンテンツ、すなわちダイナミックコンテンツの要求があった場合、

  1. リバースproxyがアプリケーションサーバーにダイナミックコンテンツの要求リクエストを転送する
  2. アプリケーションサーバーはリバースproxyから転送されてきたリクエストに基づいてドキュメントを生成し、リバースproxyに返す
  3. リバースproxyは、アプリケーションサーバーから受け取ったドキュメントをクライアントに返す

   といった流れで処理が行われます。

   一方、Perlプログラムを必要としないスタティックなドキュメント、つまり画像やスタイルシートなどのファイルは、リバースproxy自身が直接クライアントに返します。クライアントからのリクエストはまずリバースproxyで受け取り、そのリクエストが要求するドキュメントがスタティックであるかダイナミックであるかで転送の判断をする、というわけです。

   このように、アプリケーションサーバーとクライアントの間に挟まって処理を代理で行う(proxyする)のがリバースproxyです。

   リバースproxyはダイナミックコンテンツを処理しなくても良いため、mod_perlを組み込む必要もありませんし、Perlプログラムを実行する必要もありません。したがって、サーバープロセス1本あたりのメモリ使用量はかなり小さくなります。

   そのため、大量の同時アクセスが来た場合にも、リバースproxyならたくさんのプロセスを生成してそれに応答することができます。後ろに控えるアプリケーションサーバーはダイナミックコンテンツを生成する働きだけをすれば良く、手前にいるリバースproxyが多くの処理を行うバッファとして機能する形になるわけです。

   Apacheでリバースproxyを構築する場合は、mod_rewriteとmod_proxyを使います。

前のページ  1  2

株式会社はてな 伊藤 直也
著者プロフィール
株式会社はてな  伊藤 直也
取締役最高技術責任者
ブログサービスやソーシャルブックマークなど、はてなの各種サービスの企画、開発を行う。著書に「BlogHacks」(オライリージャパン刊)。「続・初めてのPerl」(オライリージャパン)、「Perl救命病棟」(翔泳社刊)では監訳を務めた。


INDEX
第3回:Backend Evolution(前編)
 Backend Evolution
Webサーバーのメモリ使用率
事例編〜Web 2.0サービスの中を見せます
第1回Inside Hatena Bookmark
第2回はてなフレームワークとPerlとシステム負荷
第3回Backend Evolution(前編)
第4回Backend Evolution(後編)
第5回サーバの追加とロードバランシング
第6回データベースの負荷分散とまとめ

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30