安定稼働編ケーススタディ(2)
Javaの宿命であるFull GCの発生を抑止し、システムの信頼性を向上
社員3000人を抱える食品関連の中堅商社B商事は、昨年からWeb-EDIを導入し、関連子会社や取引先メーカーとの企業間商取引を開始した。当初は順調に稼働し、対象品目も拡大していったのだが、ある日、取引企業から実績を入力した後の画面応答がないとのクレームを受け、管理者がシステムの調査を開始した。
しかし、不具合の原因は特定できず、恐らくはトランザクションの衝突か一時的なネットワークトラフィックの混雑かと思われた。ところがその後、他の取引先からもアクセスできない、レスポンスが悪いといった報告が相次ぎ、社内のネットワークにも影響が出るようになってしまった。
ログを調べたところ、勤務管理や受注情報など、営業からのアクセスが集中する月末にトラブル報告が多発していることが判明。システムリソース不足を疑った担当者は、メモリを増強し、プログラム設計の見直しとパラメータチューニングを施したのだが、結果は全くの不発。改善するどころか、以前にも増してシステムの停止時間やレスポンスが長くなってしまった。
![](/extra/cosminexus01_200912/images/89c0cb399c8d02c45fdbe7a8a9ea76ec_point.gif)
Javaアプリの宿命であるFull GC発生による「Stop the World」とは?
Javaで構築したアプリケーションでは、業務処理で使用されるメモリの確保と使われなくなったメモリ領域の解放をJava VMが自動的に行う、ガーベージコレクション(GC)という仕組みを持つ。業務処理が進むと、メモリ内で使用中の領域と使用済みの領域とが混在して歯抜けのような状態になり、プログラムが使用できるメモリ領域のサイズが限られてくる。そうすると、Java VMはNew領域とよばれる場所を対象に小規模なGC(Copy GC)を繰り返すことで、使用済みのオブジェクトを削除し、長時間使われるオブジェクトをOld領域に集積する。しかし、Old領域が満杯になってしまうと、今度は大掃除のように一括してオブジェクトを解放する。それがFull GCと呼ばれる処理だ。
だが、Full GCではオブジェクトが使われているか否かを細かくチェックするため時間がかかるほか、全てのプログラム(スレッド)を停止して実行されるため、システムが一時的にフリーズした状態になってしまう。 このFull GCによるシステムの一時停止現象は一般に「Stop the World」と呼ばれ、Java VMの仕組み上発生してしまう問題点だ。トランザクションのピーク時によく発生するため、システム運用管理者が最も憂慮する現象のひとつになっている。さらに、高性能なマルチコアCPUの採用や、搭載メモリの容量増大に比例して停止時間は長くなり、最悪の場合は数十秒にも及ぶケースもあるという。
もちろん、Full GCを回避するためGCのアルゴリズムを工夫することで対応策がさまざまに考えられてきた。しかし、そのどれもがGCの発生頻度や処理時間を低減することを目的にしたもので、Full GCの発生自体は避けられなかった。 また、現在は32bitOSが多く、Full GC発生時の影響も限定的だが、今後はWebシステムが大規模化、複雑化し、業務で参照するデータは拡大するにつれて、それに対応するため64bitOSを採用して巨大なメモリを確保していくこととなる。大容量のメモリ上では、GC発生時の影響は増大となり、Full GCの長時間化は避けられなくなっている。
CosminexusアプリケーションサーバでFull GC発生を抑止
原因分析をしたところ、問題発生の原因はメモリリソース不足ではなく、Full GC発生が頻発しているためと結論づけた。
日立製作所ではFull GC自体を発生させない全く新しい技術を開発。それがFull GCレス機能だ。CosminexusアプリケーションサーバではGCのアルゴリズムを変更する手法ではなく、使用期間の長いオブジェクトを削除するタイミングを明示管理ヒープ領域で管理することで、GCの対象外とする。
クライアントのログインからログアウトまで長時間使用されるセッション情報などはFull GCの発生へとつながりやすいが、この明示管理ヒープ領域に配置することでOld領域には配置されることはなくFull GCの発生を抑えている。なお、明示管理ヒープ領域に配置されたセッション情報は、不要になり次第Cosminexusアプリケーションサーバによってブロックごと削除される。
Cosminexusアプリケーションサーバを導入したB商事は、その後「Stop the World」には見舞われることなく、Web-EDIの連携企業が順調に増加。今後、EDI間連携も視野に、消費材にまで取り扱い品目を拡大する計画だ。
万一の場合の安定稼働を支える各種機能
さらに、Cosminexusアプリケーションサーバの安定稼働を実現する機能としては、J2EEサーバに障害が発生した場合にそのセッション情報を他のサーバに引き継いで業務を続行できるセッションフェールオーバー機能や、障害を検知してエラー通知や再接続・再実行、スクリプト実行などを行なう障害監視機能、リソースの枯渇を事前に検知し自律的に再起動することでハングアップを防止する自律回復機能がある。さらには、メソッド単位に業務処理の実行時間を監視し、無限ループなどによるタイムアウトを検知して問題のメソッドのみを局所的にキャンセルする障害回避機能なども備わっている。
今回紹介した安定稼働を支援するためにCosminexusが提供している機能の詳細は、「Cosminexus アプリケーションサーバ活用ガイド」で紹介している。
基幹業務の運用に不安を感じているならば、メインフレームの高信頼性設計基準に基づいた日立製作所のCosminexusアプリケーションサーバを検討してみてはいかがだろうか。
アンケート
![](/extra/cosminexus01_200912/images/e321bc4058493482c4c42f76821ea139_80x60_02.jpg)
ビジネスを支えるWebシステム利用動向アンケート
回答頂いた方から抽選で6名にAmazonギフト券5000円分プレゼント
※回答にはCNET_IDが必要です。
アンケート
![ビジネスを支えるWebシステム 利用動向アンケート](/extra/cosminexus01_200912/images/0b79402f8c60dc0c22a50a2bd3fca0c3_banner.jpg)
アプリケーションサーバ関連資料
![業務アプリケーション安定稼働の秘訣](/extra/cosminexus01_200912/images/000390db856193fb3020afd2d6d2a1ee_wp.jpg)
SOAプラットフォーム Cosminexus アプリケーションサーバ活用ガイド
業務アプリケーション安定稼働の秘訣
システムの不測の事態、ご心配ではないですか?
[PR]企画・制作 朝日インタラクティブ株式会社 営業部