アーキテクチャと設計のガイドライン

.NET アプリケーションのパフォー
マンスとスケーラビリティの向上
Part1
マイクロソフト株式会社
エンタープライズ・プラットフォーム本部
エバンジェリスト
関田文雄
何が原因なのか?
テスト
チューニング要素
アーキテクト
設計
見積もり
パフォーマンス
コーディング
プロマネ
要件定義
コミュニケーション
開発者
ユーザー
スケーラビリティ
調達管理
テスター
Agenda
パフォーマンス考慮のアプローチ
パフォーマンス目標
アーキテクチャと設計のガイドライン
実装手法の適用
パフォーマンス考慮のアプローチ
「非常にラッキーなら、パフォーマンス上の問題は発生後で
も解決できます。しかし、許容できるパフォーマンスを得られ
るよう、後からコードの配置替えを行なうと、莫大な作業が必
要となる場合もあります。この落とし穴にはまると、本当に大
変です。最悪の場合、記憶に残る、そして職場を去るきっか
けともなりかねない、きついコメントを受けることになるでしょ
う。『もうどうにもならない。一からやり直しだ』」
— Rico Mariani (アーキテクト), Microsoft
何が起こっているか?
要件の分析
設計
開発
テスト
展開
現場での格闘
ボトルネックの洗い出し
チューニング
その場限りの対応
それでも顧客の要件が
満たせなければ
ハードウェアの変更
やり直し
要件の調整
パフォーマンス考慮の構成要素
要件の分析
パフォーマンス目標(応答時間、スループット…)
設計
アーキテクチャと設計のレビュー(原則、プラクティス…)
開発
コード レビュー
計測
応答時間,スループット…
テスト
テスト
負荷テスト,ストレス テス
ト…
チューニング
展開
ネットワーク,アプリケー
ション…
開発プロセスの中にパフォーマンス最適化の
プロセスをどのように組み込むことができる
かが鍵
ライフサイクルの各段階における
パフォーマンス
要件の収集
パフォーマンス
モデリング
プロトタイプ
アーキテクチャと
設計のレビュー
コードレビュー
計測
負荷テスト
ストレステスト
キャパシティ
テスト
チューニング
設計
開発
テスト
展開
保守
RACI チャート
タスク
アーキテクト
管理者
開発者
テスター
パフォーマンス目標
A
R
C
I
パフォーマンス モデリング
A
I
I
I
パフォーマンス設計原則
A
I
I
パフォーマンス アーキテクチャ
A
C
I
アーキテクチャ レビューと
設計レビュー
R
I
I
コード開発
A
テクノロジに特有な
パフォーマンス関連問題
A
コード レビュー
R
I
I
A
パフォーマンス テスト
C
C
チューニング
C
R
トラブルシューティング
C
A
I
展開レビュー
C
R
I
R: Responsible (実行責任)
A: Accountable(責任)
I
C: Consulted (アドバイス)
I: Keep Informed (情報所有)
Microsoft Patterns & Practices
開発プロジェクトのためのベストプラクティス
「.NET アプリケーションのパフォーマンスと
スケーラビリティの向上」
原題:「Improving .NET Application Performance and Scalability」
原文: 1150 ページ
パート I 「パフォーマンスを考慮したエンジニアリング入門」
パート II 「パフォーマンスを考慮した設計」
パート III 「アプリケーションのパフォーマンスとスケーラビリティ」
パート IV 「データベース サーバーのパフォーマンスとスケーラビリティ」
パート V 「計測、テスト、チューニング」
MSDN サイトで公開中
http://www.microsoft.com/japan/msdn/
パフォーマンス目標
パフォーマンス モデリング
ステップ
1 主要シナリオの特定
作業内容
クリティカル シナリオ、重要シナリオの特定
総ユーザー数、同時アクティブ ユーザ数、データ
2 ワークロードの特定
量、トランザクション量の特定
応答時間(例:製品カタログは3秒以内に表示)
3 パフォーマンス目標値 スループット(例:毎秒 100 トランザクション)
の特定
リソース利用(例:CPU、メモリ、I/O)
4 バジェットの特定
実行時間、利用するリソースの特定
5 処理ステップの特定
特定したシナリオを処理ステップに分割
6 バジェットの割り当て 処理ステップに実行時間、リソースを割り当てる
7 評価
机上での妥当性評価
8 検証
各工程で適切な計測を行う
アーキテクチャと設計のガイドライン
アーキテクチャと設計の概要
原則
原則、ガイドライン、プラク
ティスに沿って設計されて
いるかをレビュー
機能・非機能要件
アーキテクチャ
パフォーマンス
目標値
設計
ガイドライン
ベスト プラクティス
パターン
パフォーマンス目標を達成
したアーキテクチャ、設計
をプラクティスとして登録
原則
設計プロセス原則
客観的な目標を設定する
アーキテクチャと設計を早期段階で検証する
余剰を取り除く
トータル パフォーマンスをチューニングする
ライフ サイクルを通して計測を行う
設計原則
租粒度サービスを設計する
バッチ化作業でラウンド トリップ数を最小化する
遅く確保して早く手放す
処理リソースとのアフィニティを評価する
処理を必要なリソースへ近づける
共有リソースをプールする
不必要な作業を避ける
競合を減らす
一歩進んだ処理を行う
独立したタスクを同時に処理する
ガイドライン
ADO.NET
デスクトップ
アプリケーション
ブラウザ
クライアント
ASP.NET
ビジネス層
ビジネス ロジック
プレゼンテーション
Web 層
データ
アクセス
データ アクセス層
アプリケーション
クライアント
リモート処理
Web サービスWeb サーバー
サーバー
Enterprise
Services
マネージ コード / 相互運用 / XML
データベース
サーバー
ガイドライン(展開)
展開アーキテクチャを検討する
制約と仮定を早い段階で特定する
サーバー アフィニティを評価する
レイヤ型設計を利用する
同じプロセスにとどまる
不可避な場合を除き、アプリケーション ロジックをリ
モート化しない
プレゼンテーション
プレゼンテーション
ビジネス ロジック
ビジネス ロジック
データ アクセス
データ アクセス
Web/アプリケーション
サーバー
データベース
サーバー
非分散型アーキテクチャ
Web サーバー
アプリケーション
サーバー
データベース
サーバー
分散型アーキテクチャ
ガイドライン(スケーリング)
スケール アップ
既存の構造に与える影響が少
ない(まず最初に検討)
ハードウェアの限界がある
コストは高い
プロセス依存リソースの考慮
状態ストアの考慮
8-32 Way SMP
64GB メモリ
4-8 Way SMP
32GB メモリ
1-4 Way SMP
4GB メモリ
スケール アウト
処理能力が比較的、リニアに
アップ
処理能力と共に耐障害性も
アップ
サーバーが増えるため、運用
コストもリニアにアップ
アプリケーションがスケール
アウトに対応する必要がある
システムの成長予測に見合っ
たスケーリング プランを作る
ステートレス設計
+
+
+…
分散型アーキテクチャで予想される問題
状態アフィニティ
の利用
オペレーションの
ブロック
誤った
データ型
バッチ処理せず
細切れの処理
ビジネス ロジック
プレゼンテーション
データ アクセス
クライアント
大きな View
State
Web サーバー
キャッシュせずにリク
エスト毎の呼び出し
不十分な
リソース管理
アプリケーション
サーバー
データベース
サーバー
プールなしで
接続
データ構造とアルゴ
リズムの選択ミス
競合、分離レ
ベル、ロック
パフォーマンス / スケーラビリティ フレーム
カテゴリ
結合度と凝集度
主な考慮事項
疎結合と高凝集
転送メカニズム、リモート インタ
通信
フェース設計、シリアル化、帯域
トランザクション、ロック、スレッド化、
平行処理
キューイング
割り当て、作成/破棄、プーリング
リソース管理
ユーザー単位、アプリケーション全
キャッシング
体、データの揮発性
ユーザー単位、アプリケーション全
状態管理
体、永続性
アルゴリズムの選択
データ構造 / アルゴリズム
配列 vs. コレクション
設計ガイドライン
カテゴリ
結合度と凝集度
通信
平行処理
リソース管理
ガイドライン
疎結合設計を行う
高凝集設計を行う
アプリケーション機能を論理レイヤへ分割する
Web サービス、リモーティング、Enterprise
Services を適切に選択する
DataSet、型付き DataSet、コレクション、XML、
独自オブジェクト等を適切に選択する
ロック時間を最小化して競合を軽減する
適切な分離レベルを選択する
共有リソースや希少リソースをプールする
遅く確保して早く手放す
効率的なオブジェクトの作成と破棄を検討する
設計ガイドライン
カテゴリ
キャッシング
状態管理
データ構造 / ア
ルゴリズム
ガイドライン
データのキャッシュ先を決める
キャッシュすべきデータを決める
期限切れポリシーと破棄メカニズムを決める
選択可能な状態情報の格納方法を考慮する
セッション リソースを速やかに開放する
ビジネス ロジックからセッション変数の使用を避
ける
適切なデータ構造を選択する
値型と参照型を適切に使用する
実装手法の適用
実装手法の概要
ASP.NET
Enterprise Services
ビジネス ロジック
Web サービス プレゼンテーション
リモート処理
データ アクセス
クライアント
Web サーバー
ADO.NET
アプリケーション
サーバー
マネージ コード / 相互運用 / XML
データベース
サーバー
Web サービスのパフォーマンス考慮
接続
maxconnection 属性を設定する
スレッド処理
スレッド プールの設定
アタッチメント
適切な手法を選択する
シリアライズ
シリアル化アセンブリの自動生成(.NET Framework
2.0 から)
Web サービスのパフォーマンス考慮
接続
maxconnection 属性を設定する
デフォルトは接続数=2
Web サービス
Wait!
クライアント
Web サーバー
Wait!
Web サービス
<connectionManagement>
<add address="*" maxconnection="12"/>
</connectionManagement>
Web サービスのパフォーマンス考慮
スレッド処理
キューで待機中の要求が想定以上の場合にチューニング
ASP.NET Applications/Requests in Application Queue パ
フォーマンス カウンタ
項目
maxconnection
maxIoThreads
maxWorkerThreads
minFreeThreads
minLocalRequestFree
Threads
デフォルト
2
20
20
8
4
推奨値
12 * #CPUs
100
100
88 * #CPUs
76 * #CPUs
※ 推奨値は絶対的な数値ではないため、適切なテストを実施し
た上で、環境にあった最適設定を行って下さい
Web サービスのパフォーマンス考慮
アタッチメント
WS-Attachment
アタッチメントは SOAP エンベロープ外
WSE 1.0 / 2.0 でサポート
Base 64 エンコーディング
大量なデータには不向き
相互接続性は高い
MTOM(SOAP Message Transmission
Optimization Mechanism)
W3C で勧告として公開(2005/1/26)
WSE 3.0 でサポート
Web サービスのパフォーマンス考慮
シリアライズ
シリアル化アセンブリの自動生成(.NET
Framework 2.0 から)
デフォルトでは、プロキシが最初にインスタンス化された
時に、XmlSerializer が動的にシリアル化コードを生成し、
csc.exe でコンパイル
C:\>sgen.exe MyProject.dll
生成された MyProject.XmlSerializers.dll を
MyProject.dll と同じフォルダに配置
リモート処理のパフォーマンス考慮
アクティベーション、チャネルの選択
SAO(シングル コール) + HTTP チャネル + IIS を利用
する
ローカル マシン内通信には、IpcChannel を利用する
(.NET Framework 2.0 から)
シリアライズ
DataSet のバイナリ転送では RemotingFormat を設定
する(.NET Framework 2.0 から)
リモート処理のパフォーマンス考慮
アクティベーション、チャネルの選択
SAO(シングルコール) + HTTP チャネル + IIS を
利用する
パフォーマンス
HTTP チャネル < TCP チャネル
スケーラビリティ
TCP チャネル < HTTP チャネル
CAO < SAO(シングルトン) < SAO(シングル コール)
セキュリティ
Windows サービス、カスタム アプリケーション < IIS ホスト
※.NET Framework 2.0 から TCP チャネルでも負荷分散自体は可能
<channel ref="tcp" socketCachePolicy="AbsoluteTimeout"
socketCacheTimeout="0" />
リモート処理のパフォーマンス考慮
チャネルの選択
ローカル マシン内通信には、IpcChannel を利用する
(.NET Framework 2.0 から)
ローカル マシン内のプロセス間(AppDomain 間)通信に利用
IpcChannel を使うことにより 名前付きパイプにより通信が行われ
る
ipc://myPortName/myObject.rem
アクセス制御に名前付きパイプの ACL が利用可能
<channel ref=“ipc” portName=“testPipe”
authorizedGroup=“Administrators” />
リモート処理のパフォーマンス考慮
シリアライズ
DataSet のバイナリ転送では RemotingFormat
を設定する(.NET Framework 2.0 から)
デフォルトではバイナリ転送でもネットワークを流れる
データは XML
ds.RemotingFormat = SerializationFormat.Binary
その他のパフォーマンス考慮
相互運用
できる限り Blittable 型を使用する
できる限り Unicode から ANSI への変換を避ける
…
マネージ コード
Filanalize と Dispose の考慮
頻繁なボックス化/ボックス化解除を避ける
…
ADO.NET
…
ASP.NET
…
Enterprise Services
…
XML
…
チェックリスト(Web サービス)
設計上の考慮事項
非同期呼び出し
チャンキーなインターフェイスを設計してラウンド トリップを減らす
追加的な並行作業があれば Web サービスの非同期呼び出しを検討する
RPC スタイルよりもメッセージ ベースのプログラミングを採用する
関連のない複数の Web サービスに対しては非同期呼び出しを使う
引数のフォーマットにはリテラル メッセージ エンコーディングを使う
UI 応答性が重要なら Web サービスを非同期で呼び出す
Web サービス引数にはプリミティブ型を使うようにする
サーバー状態情報を呼び出し間で保持しない
タイムアウト
コストの大きい Web メソッドについて入力検証を検討する
プロキシ タイムアウトを適切に設定する
キャッシュ アプローチを考慮する
ASP.NET タイムアウトを Web サービス タイムアウトよりも長くセットする
バルク データ転送 / アタッチメント アプローチを考慮する
ASP.NET ページへの接続を Web サービス呼び出し完了前にタイムアウトさ
せる
responseDeadlockInterval 属性を考慮する
接続
maxconnection 属性を設定する
WebMethods
異なる Web サービスをまたいで接続に優先順位を付けて割り当てる
できる限りプリミティブ型引数を使う
外部への呼び出しには単一の ID を使う
バッファを考慮する
統合 Windows 認証で UnsafeAuthenticatedConnectionSharing の設定
を考慮する
Basic 認証では PreAuthenticate を使う
スレッド
応答のキャッシュを検討する
セッション状態は、必要とする Web メソッドについてのみ有効にする
シリアライズ
XmlIgnore でシリアル化を減らす
競合低減の公式を使ってスレッド プールをチューニングする
ラウンド トリップを減らす
断続的に発生するバースト負荷に対して minIoThreads と
minWorkerThreads の使用を検討する
XML 圧縮を検討する
一方向通信
応答が必要でないなら、OneWay 属性の使用を検討してください
非同期 Web メソッド
I/O オペレーションに非同期 Web メソッドを使う
ワーカー スレッドに依存している場合は非同期 Web メソッドを使わない
キャッシュ
揮発性の低いデータの出力キャッシュを検討する
キャッシュ関連情報のクライアントへの提供を検討する
周辺キャッシュを検討する
状態管理
セッション状態は必要な場合にのみ使う
サーバー アフィニティを避ける
まとめ
パフォーマンスを考慮した設計
パフォーマンス目標
(応答時間、スループット、リソース利用度、ワークロード)
パフォーマンス / スケーラビリティ フレーム
結合度と凝集度
通信
並行処理
リソース管理
キャッシング、状態管理
データ構造 / アルゴリズム
計測、テスト、チューニング
計測
応答時間
スループット
リソース利用度
ワークロード
テスト
負荷テスト
ストレス テスト
キャパシティ テスト
チューニング
ネットワーク
システム
プラットフォーム
アプリケーション
ロール
(原則、プラクティス、パターン)
ライフサイクル
アーキテクチャと設計のガイドライン
(要件、設計、開発、テスト、展開、保守)
(シナリオ、目標値、ワークロード、要件、バジェット、メトリクス)
(アーキテクト、開発者、テスター、管理者)
パフォーマンス モデリング
技術情報リソース
MSDN ホームページ:
http://www.microsoft.com/japan/msdn/
.NET アーキテクチャ センター:
http://www.microsoft.com/japan/msdn/architecture/
Patterns & Plactices:
http://www.microsoft.com/japan/resources/practices/
© 2005 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.