大規模化・安定稼働・開発効率化…Webシステム開発・運用を乗り切るテクニック

第1回 チューニング① 多重度・流量制御の最適化

この記事を読むのに必要な時間:およそ 3 分

はじめに

現在のWebシステム開発・運用では,特に大規模化するシステムの安定稼働,パフォーマンスの向上,システムのスケールアップやスケールアウトの実現が求められます。また開発フェーズではこれまで以上の効率化に加えて,新しい技術的な取り組みを踏まえたシステム開発も必要となります。

本連載では,これらシステム開発者を取り巻く要求事項をどのように解決していけばよいのか,解決のためのソリューションとしてはどのようなものがあるのかについて,日立のAP(アプリケーション)サーバであるCosminexusを題材として取り上げながら解説していきます。連載第1回の今回は,多重度・流量制御を中心に,DB(データベース,I/O)のチューニング(最適化)などにも触れて解説します。

チューニングとは

システム構築においては,CPUやメモリ容量など限りあるリソースを最大限に有効活用するとともに,機能要件を満たすレスポンスやスループットを得られるようにアプリケーションの構造や設定を調整する必要があります。そのために不可欠な作業が性能チューニングです。

性能チューニングでは性能測定とボトルネック要因の分析および対処を繰り返し実施し,個々のボトルネック要因を排除していきます。性能向上を突き詰めていくと際限なくチューニングを繰り返すことになりかねませんので,目的の性能を得られた時点でチューニングを終了することも重要です。

Webシステムの性能および安定性を確保するためには,①Webサーバの最大同時接続数,②Java EEサーバ接続用コネクションキャッシュサイズ,③実行待ちキューサイズ,④Java EE(Java Platform, EnterpriseEdition)サーバの同時実行スレッド数,⑤SessionBeanインスタンスプールサイズ,⑥DB(データベース)サーバ接続用コネクションプールサイズなどのパラメータを適切に設定していきます。そして,システムの要件を満たすための適切なパラメータを設定するためには,長年の経験によるノウハウやテスト環境での検証を通じて探っていくことになります図1)。

図1 処理の流れと流量制御パラメータの一覧

図1 処理の流れと流量制御パラメータの一覧

※1:キューを共有&クライアント多重度4」に対する相対比

Cosminexusでは,これまでのシステム構築を通じて蓄積してきた知見を体系化したドキュメントノウハウを「uCosminexus SI Navigation System」というツールにシステム化しました。このツールでは,条件に応じた適切な流量制御およびDB(I/O)周りを中心とした各種のパラメータ設定が可能です。なお,「uCosminexus SI Navigation System」については本連載の次回以降で詳解します。

安定性確保のための流量制御

要件どおりのリクエストを処理できるようシステムを設計したとしても,リクエストがシステムの処理能力を超えてしまうと安定したサービスの動作が困難になります。実際の運用時には想定外のリクエストが発生する場合が多々あり,システムの安定性を確保するために運用時の負荷状態を考慮する必要があります。

こういった場合に備えて,流量制御で負荷を軽減する必要があります。流量制御とは,システムで受け付けるリクエスト数の上限を区切ることに加えて,重い処理と軽い処理がある場合にバランスよくキューを配分し,重い処理と軽い処理を並行して実行できるようにするものです。このためには,重い処理に割り当てられるスレッド数を固定するとよいでしょう。通常のシステムでは処理の軽重による流量制御はサーバを分けて対応するために,サーバを複数台導入するようなケースが多く見られますが,Cosminexusの場合は,メインフレームなどによる基幹情報システムの開発経験で培ってきた安定稼働のノウハウを活かし,業務ロジックレベル(URLグループ単位)でキューを分けて流量制御するため,APサーバを分ける必要がありません。

これによってシステム全体の安定稼働が可能になり,運用面でも煩雑さがなくなるというメリットがあります。

システムの安定性を確保するためには,リクエスト処理の負荷をうまく分散する流量制御が欠かせないものです。それでは次に,Webアプリケーション,EJB(Enterprise JavaBeans)アプリケーションの安定性能確保について見ていくことにします。

Webアプリケーションの安定性確保

たとえば朝の始業時のように,処理に時間を要するログイン処理が集中するケースを想定してみましょう。

重い処理と軽い処理でキューを共有し流量制御をしない場合,リクエストは先着順に実行されます。重いログイン処理中はすべてのスレッドで実行するので,ほかの軽い業務へのリクエストは実行待ちになります。このため,クライアント多重度が一定の値を超えると全体的なスループットは低下してしまいます。

Cosminexusでは,重い処理と軽い処理とでキューを分けて流量制御する場合は,前述のように重い処理と軽い処理をバランスよく扱うため,並行して効率よく実行できます。異なる業務をバランスよく実行できるため,クライアント多重度が上昇しても全体的なスループットの低下は抑制できます図2)。

図2 Webアプリケーションの安定性能確保

図2 Webアプリケーションの安定性能確保

EJBアプリケーションの安定性確保

EJBアプリケーションを安定稼働させつつシステムリソースを有効活用するには,流量制御に加えて,リクエスト単位での優先制御やEJB単位のサービス閉塞,動的な負荷分散が求められます。Cosminexusではこれらを標準で装備するとともに,さまざまな運用オプションに対応しています。

動的負荷分散では,負荷状況に応じたスケジューラ間のリクエスト転送ができます。流量制御では前述のURLによるキューの適切な割り当てに加え,業務の最大同時実行数の制限やキューの滞留監視,同時実行数の動的変更を備えています。これはリクエストキューの滞留状態を監視し,スローダウンが閾値(いきち)を超えると系を閉塞するとともに,スローダウンが解消された場合は自律的に回復動作を実行します。すなわち,自律的かつ動的な処理により,EJBアプリケーションの安定性を確保しシステムリソースの有効活用を実現しているのです図3)。

図3 EJBアプリケーションの安定性能確保

図3 EJBアプリケーションの安定性能確保

コメント

コメントの記入