「『大量のアクセスを受け付けるWebシステムをTomcatで構築するのは無理』とよく言われる。だがそんなことはない。工夫を凝らせば、高負荷に耐えられる」。オープン・ソースのWebサーバー・ソフトTomcatを使ったシステムを構築したGMOメディアアンドソリューションズ システム本部の堀内敏明本部長はこう言い切る。GMOメディアアンドソリューションズは、インターネットの個人ユーザーを対象にしたメールを使った広告事業を手がけている。
GMOメディアアンドソリューションズは今年3月末、広告付きメールを配信するサービス「ふくびき.com」用のWebシステムをJavaで刷新。サーバーOSはRed Hat Linux、サーバー・ソフトはTomcat、データベースは信頼性を考えてOracle9i RACを採用した。「3月末に稼働して以来、システムのトラブルは起きていない。Tomcatでも高負荷をかけられる安定なシステムを開発できることを示せた」と、システム開発に携わった同社システム本部研究開発部の佐藤真人部長は語る。
GMOメディアアンドソリューションズが開発したふくびき.comのシステムは、120万人が利用でき1秒間に最大600件を受け付ける処理能力を備える。佐藤部長をはじめとする開発担当者はメモリーの有効活用がカギを握ると考えた。そのため「メモリーをいかに使いこなすかにこだわって、とことん改善を加えていった」(佐藤部長)。
メモリーを有効に活用するために、GMOメディアアンドソリューションズが講じた策の一つが「一つのサーバーにTomcatを二つ起動させる」こと。通常は一つのサーバーにTomcatを一つ起動させる。
同社があえてTomcatを二つ起動させた理由は二つある。一つは、片方のTomcatが動かなくなってもパフォーマンスに影響を及ぼさないようにすること。もう一つがJavaアプリケーションの実行環境である「Java VM」のメモリー管理機能によって生じる問題を避けるためだ。
その問題とは、メモリーを定期的に開放するJava VMの機能「ガーベジ・コレクション」が、勝手に働いてしまうことだ。GMOメディアアンドソリューションズが今回そろえたサーバーでは、1.6GBのメモリー領域がガーベジ・コレクションの対象になる。もし、1.6GBのメモリー領域全部を対象にガーベジ・コレクションが働いてしまうと、メモリーの開放作業を終えるのに、最大10秒程度かかるおそれがあった。もしそうなれば、この間、Tomcatは外部からの処理を受け付けなくなってしまう。
この問題は、一つのサーバーにTomcatを二つ起動することで軽減する。一つのサーバーでTomcatを二つ起動して、二つのTomcatが1.6GBのメモリーを800MBずつに分け合って処理する設定にする。メモリー領域も最大800MBと半減するので、一気に1.6GBを処理する場合に比べてガーベジ・コレクションにかかる時間を短縮できる。
「当社で採用したJava VMは日本BEAシステムズのJRockit。当社で試した結果、JRockitを使った場合、この方法が安定性とパフォーマンスを確保するのに有効だった」(佐藤部長)。メモリーの設定はTomcatの起動オプションで設定した。
このほか、サーバーOSのRed Hat Linuxの設定も変更した。なるべく処理を多く受け付けられるように、プログラムを最大いくつ並行して処理できるかを決めるスレッド数を、標準設定の4倍にあたる4096にした。さらに多くのスレッドを生成できるように、スタック・サイズを小さくした。標準設定の4分の1である256KBにした。
佐藤部長は、「今回のプロジェクトでノウハウを蓄積すれば、他のシステムにも適用できる。そう考えて、気合を入れてプロジェクトに臨んだ。課題を解決していくのはエンジニアとしてとても楽しかった」と振り返る。同社は、20サイトほどのシステムを稼働させている。「今回、ふくびき.com用のシステム開発で、Tomcatなどを使いこなすためのノウハウを蓄積できた。今後は他のサービスのシステムにも生かしていきたい」と、堀内本部長は語る。