.NET アプリケーションのパフォーマンスとスケーラビリティの向上
目的
概要
この章の使いかた
チューニングのカテゴリ
パフォーマンス チューニングのプロセス
ボトルネックの特定
システムのチューニング
CPU
メモリ
ディスク I/O
ネットワーク I/O
.NET Framework のチューニング
CLR のチューニング
ASP.NET のチューニング
Enterprise Services のチューニング
Web サービスのチューニング
リモート処理のチューニング
ADO.NET のチューニング
SQL Server のチューニング
インターネット インフォメーション サービス (IIS) のチューニング
まとめ
補足資料
最適化を考慮することは、大容量のレポート(100ページを優に超える)を出力する場合に、パフォーマンスの面において重要です。ここでは、そのようなレポートで最適な結果を得るためのいくつかの情報を紹介します。特に、Webアプリケーションにおいて、サーバーのメモリが逼迫しないようにするために、以下の点に留意してください。
レポート生成時やPDFエクスポート時、現在処理していないレポートのページを、メモリのかわりにハードディスクディスクに格納するかどうかを取得または設定します。
[Visual Basic]
Public Property CacheToDisk As Boolean
戻り値
ブール型。デフォルト値はFalseです。
解説
このプロパティをTrueに設定すると一時ファイルが作成されます。レポートの実行中に未処理の例外がある場合、これらの一時ファイルは削除されずにハードディスク上に残ります。これらのファイルの場所は以下のとおりです。
WinForms: C:\Documents and Settings\<user name>\Local Settings\Application Data\IsolatedStorage
WebForms: C:\Documents and Settings\<machine name>\ASPNET\ Local Settings\Application Data\IsolatedStorage
CacheToDiskプロパティは分離ストレージ(IsolatedStorage)を使用し、生成されるレポートデータをハードディスクに格納します。このためCacheToDiskプロパティを Trueに設定する場合は、このアプリケーション自身が、分離ストレージにアクセスできる権限(適切な IsolatedStorageFilePermission)を有している必要があります。なお、通常の.NET Frameworkのアプリケーションは既にこの権限を有しています。分離ストレージの詳細につきましては、MSDNライブラリの「分離ストレージ」をご確認ください。
■ 注記 ■
このプロパティは、大容量のメモリを消費するレポートの場合のみTrueに設定してください。このプロパティを使用すると、ディスクを使用する上で必要なIO関連等のメモリの使用量が増えます。このため、画像があるレポートや、ページ数が少ない場合は、メモリ使用量の逆転現象が起こります。また、メモリの代わりにハードディスクを使用するため、レポートの生成速度は遅くなります。
・このプロパティは、使用することによってメモリ使用量が減ることを保証するものではなく、メモリ不足による例外エラーの発生を極力少なくさせるための補完的な機能として提供しています。有効性が見受けられるレポートの場合のみに使用してください。
・レポートの生成処理だけでなく、PDFエクスポート処理においてもこの設定は有効です。他の形式のエクスポートではこの機能は働きませんので、大量のレポートをエクスポートする場合に、メモリのリソース不足を引き起こす可能性があります。
・Windows Server 2003などのIIS6.0上で実行する場合、匿名ユーザーは「NETWORK SERVICE」というアカウントで実行されます。このユーザーアカウントは、通常分離ストレージにアクセスできる権限を有していないため、エラーが発生します。MSDNライブラリなどを参照し必要な権限を持ったアカウントで実行するか、IIS5.0のプロセス分離モードで実行してください。
使用例
[Visual Basic]
Private Sub arv_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles arv.Load
Dim rpt As New rptDocument
rpt.Document.CacheToDisk = True
rpt.Run()
arv.Document = rpt.Document
End Sub
http://msdn2.microsoft.com/ja-jp/library/ezabwsbk(VS.80).aspx
分離ストレージ ツールは、現在のユーザーに関するすべての既存ストアの一覧表示または削除を行います。
\ProgramFiles\Microsoft.Net\FrameworkSDK\Bin にあるとのことがサイトで説明されていたが、自分のPC(WinXP Pro)では、下記に有った。
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin
作成されたTemporary File は、下記のフォルダに作成された。
C:\Documents and Settings\KWORKS07C\ASPNET\Local Settings\Application Data\IsolatedStorage\ntb2wc5v.oq5\qimr4acp.4j0\StrongName.p0nrvaqskx22w2ryn0ookbwdf2bxbmio\AssemFiles
ActiveReports Document2.tmp
ActiveReports Document3.tmp
~省略~
ActiveReports Document12.tmp
以下、複数作成されたが、何らかのタイミングで削除された。
約25MBのファイルからは、約2~3MBのエクセルファイルが生成された。
分離ストレージ作業の実行 …なんだか設定が難しそう
http://msdn2.microsoft.com/ja-jp/library/8dzkff1s(VS.80).aspx
同時に実行される ASP.NET アプリケーションを分離して保護するために、Internet Information Services (IIS) 6.0 には 2 種類のアプリケーション分離モードが用意されています。既定では、ワーカープロセス分離モードが使用されます。ただし、下位互換性のために IIS 5.0 の分離モードも用意されています。以降のセクションでは、2 つのアプリケーション分離モードと、モードの設定方法について説明します
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconiis60applicationisolationmodesoverview.asp
分離ストレージの記述
http://hmoriya.spaces.live.com/Blog/cns!1p-An5TkTt7qCW_wTC0WEsUg!142.entry
その他 .NET Frameworkのツール達http://studiodragoonnet.main.jp/tech/modules/sections/index.php?op=viewarticle&artid=60
OutOfMemory Exception に関する問題について-海外のサイトよりhttp://www.datadynamics.com/forums/80735/ShowPost.aspx
@IT で説明されている。
[ASP.NET]セッション情報を外部プロセスで管理するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/183aspsesout/aspsesout.html
[ASP.NET]セッション情報をSQL Server上で管理するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/186aspsessql/aspsessql.html
↑下記からリンクして見つけた
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18387&forum=7
@IT会議室での話題
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18387&forum=7
ASP.NET(VB.net)でWebサイトを立ち上げています。
(.net framework 1.1)
本番初日out of memory exceptionでIISダウンが頻発しています。
どうもセッションを張るときに、
DBの内容を大量にメモリーに格納しているようです。
そしてセッションタイムアウトを120分にしているため、
かなりの数のセッションが張りっぱなしになっているようです。
B2Bですが利用者の顔が見えないので暗中模索です。
目先の対応として、セッションタイムアウトを
ひとつのサブシステムは10分、もうひとつは30分にして再起動させ、
様子を見ています。
同時ユーザー数を20と設定してテストしていたのですが、
画面を上げっぱなしの場合を考慮していなかったようです。
---------------------------------------------------------------------------------------
上記の対応を行った結果、午後からはサーバーが落ちることなく運用できました。
今更ながらバージョンアップをした方が良いかもしれない。早急に検証しよう。
Yamakiさんのブログによると…
http://d.hatena.ne.jp/Yamaki/20060817/1155777218#c
記のSomasegarさんのblogによると、SP1の修正は全部で400以上もあるとのこと。
Somasegar’s WebLog : VS .NET 2003 SP1 is available!
This amounts to more than 400 issues overall that we have fixed in SP1.
構成にもよるかと思いますが、インストール時の注意点は下記の3つです。
インストール実行後の最初のダイアログの表示時間がかなり長い
下記の「ディベロッパー製品開発統括部Blog」でも書かれていますね。
Visual Studio .NET 2003 SP1 最終版 まもなくリリース
途中で、「Visual Studio .NET 2003 Disc 1」のCDを求められる
最後に再起動を求められる
# aspx 『「インスール実行後の最初のダイアログの表示時間がかなり長い
」が5分くらいかかりました。危うくタスクをKILLするところでした。』
グレープシティ テクニカルエバンジェリスト
ヤマキ様のブログ(Yuya Yamaki's blog)
http://d.hatena.ne.jp/Yamaki/searchdiary?word=*%5BASP.NET%5D
VS2003からVS2005へアップした際のグレープシティ製品の対応についても書かれている。
グレープシティの技術の方が書いているので、生々しい情報が得られるかもしれない。
こんな簡単にASP.net でJavaScriptの確認画面(YES/NO)が実現出来るとは…参考になった。
http://www.atmarkit.co.jp/fdotnet/dotnettips/015confirm/confirm.html
Attributesプロパティによる属性の設定
Buttonコントロールでメッセージ・ボックスを表示するには、ASP.NETのページがレンダリングされて、最終的にサーバから送信されるHTML内のinputタグのonclick属性に、JavaScriptのスクリプトが挿入されるような仕組みが必要となる。これには、Buttonコントロールの実体であるButtonクラス(System.Web.UI.WebControls名前空間)のAttributesプロパティを使用する(正確にはAttributesプロパティはButtonクラスの親クラスであるWebControlクラスから継承している)。
Attributesプロパティは、サーバ・コントロールの属性のコレクションであり、C#では次のようにして、値を追加設定することができる。
Button1.Attributes["onclick"] = "return confirm('本当に移動しますか?');";
http://q.hatena.ne.jp/1103714030
メモリは足りているのに OutOfMemory
http://www.atmarkit.co.jp/fjava/rensai2/webopt09/webopt09.html
ページ・ファイルによるディスクのフラグメントを防止する方法http://www.atmarkit.co.jp/fwin2k/win2ktips/077setpgflmin_max_eq/077setpgflmin_max_eq.html
One of my Web Apps is dealing with employee training and the database has a data size of 250MB
http://www.crystaltech.com/forum/post.asp?method=TopicQuote&TOPIC_ID=12243&FORUM_ID=17
<質問内容>
メモリが2GBのサーバにddlを配置し、アセンブリ後
動作させたところ、今度はOut Of Memory となってしまい、
IIS本体が起動しなくなっていという現象が発生しました。
メモリーは実行前500MB、起動後数分すると1.5GB位に
増加してしまうのですが、普通の現象でしょうか。
以上、宜しくお願い致します。
<GrapeCity 回答内容>
たびたびお手数をお掛けしまして申し訳ございません。
レポート作成時やエクスポート時に使用されるメモリ量は、レポートの
データ量(ページ数や文字数、画像の有無やサイズなど)に依存します。
これらの条件によっては、IISのワーカープロセスのメモリ使用量が、
ご指摘のような値になる可能性もございます。
<質問内容>
ASP.netの指示画面に表示された日本語のエラー及び、
イベントビューアに作成されたエラーを添付致します。
--------------------------------------------------
「aspnet_wp.exe (PID: 3964) was recycled because
memory consumption exceeded the 608 MB
(60 percent of available RAM).」
--------------------------------------------------
aspnet_wp.exeが扱える物理メモリー容量問題でしょうか。
それとも、ダウンロード可能なサイズが問題なのでしょうか。
テストで使用しているPCのOSは、WinXP Proで、RAMは
現在1GBです。
machine.config、Web.configの値も変更し、
<httpRuntime maxRequestLength="20480"/>というように
してありますが、これだけでは回避が出来ていません。
ご教授のほどよろしくお願い致します。
---------- 追加情報 ----------
追加検証した情報をお送りいたします。
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config
にある、machine.configの processModel memoryLimit を
60から90へ変更してみましたところ、前回まで約4200行でエラーと
なりましたが、約8000行は出力されるようになりました。
メモリーとの関係があることは推測がつきましたが、適切な設定が
分かりません。
ActiveReports ProをASP.netを使用して、PDF、Excelのファイルを
ダウンロードする場合には、大よそどの程度のメモリーと設定が必要
になるのでしょうか。
<processModel
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="0:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
★ memoryLimit="90"
webGarden="false"
cpuMask="0xffffffff"
userName="machine"
password="AutoGenerate"
logLevel="Errors"
clientConnectedCheck="0:00:05"
comAuthenticationLevel="Connect"
comImpersonationLevel="Impersonate"
responseDeadlockInterval="00:03:00"
maxWorkerThreads="20"
maxIoThreads="20"
/>
以上、ご回答のほど宜しくお願い申し上げます。
<GrapeCity 回答内容>
ご指摘のエラーは、ASP.NET Webアプリケーションの実行時に、メモリが
不足している場合に発生する、一般的なエラーです。
デフォルトの状態では、ASP.NETのワーカープロセスが使用できるメモリ
サイズは、システムメモリの60%に設定されています。ご質問内容にも
ございますように、Machine.configのmemoryLimit属性で、この割合を
設定することが可能です。
[processModel 要素 (ASP.NET 設定スキーマ)]
http://msdn2.microsoft.com/ja-jp/library/7w2sway1.aspx
誠に恐れ入りますが、Machine.configの設定方法につきましては、MSDN
ライブラリ等をご参照ください。
以前の回答でも申し上げましたように、実際に作成可能なレポートの
ページ数の上限は、実行環境のリソースや、アプリケーションが使用
するメモリ等に依存します。ご質問内容にある処理の場合、アプリケー
ションは608MB以上のメモリを必要としていることになります。
実行環境のメモリを増やす方法や、同時接続(実行)するクライアント
数に制限を設けるなど、運用面での対処につきましてもご検討ください。
<ご質問内容>
先の問題は、まだ未解決なのですが、もう一点別の質問が
ございます。ご回答いただけますか。
サンプル出力をご確認下さい。
①先にお送りしている問題で出力したサンプルですが、
この中で数値がセットされているデータのセル属性が自動的に
判断され、数値型、ユーザ定義、ロシア語など、様々
に設定されています。
どのような規則でセル属性が設定されるのでしょうか。
②右寄せになっていますが、左寄せにすることは出来ませんか
金額、数量はは良いのですが、コード等、右寄せ表示をしたい
場合があります。
デザイン画面で、左寄せ、中央寄せにしても、自動的に
右寄せになってしまうようです。
以上、宜しくお願い致します。
<回答内容>
XlsExportクラスによるエクスポートでは、セルの書式はデータの内容に
よって自動的に決定されます。
レポート上の出力 セルの書式設定
---------------------------------------------------
","(カンマ)を含んだ数値の場合 通貨型
","(カンマ)を含まない数値の場合 ユーザー定義型
"%"を含んだ数値の場合 パーセンテージ型
上記以外 標準
詳細につきましては、製品ヘルプの下記の内容をご参照ください。
Class Library
- DataDynamics.ActiveReports.Export.Xls 名前空間
- クラス
- XlsExport
- メソッド
- Export メソッド
恐れ入りますが、XlsExportによるExportの場合、セルの書式を任意に
設定・変更する機能は、用意されておりません。
また、セルの「横位置」については、コントロールのAlignmentプロパ
ティの設定が適用される訳ではありません。Excel上でデータを入力した
場合と同様に、数値として判断されるデータは右寄せで表示されます。
精度の高いExcel出力が前提である場合には、Excelエクスポートのもう
一つの方法である、SpreadBuilder機能を使用する方法をご検討ください
ますようお願い申し上げます。
SpreadBuilder機能を使用する場合、CellクラスのWrapTextプロパティや
Alignmentプロパティを設定することで、Excel上のセルの書式「折り返
して全体を表示する」や、「配置」の「横位置」などを任意に指定する
ことが可能です。
SpreadBuilderの使用法につきましては、製品ヘルプの以下の項を
ご参照ください。
ActiveReports for .NETユーザーガイド
- サンプルと基本操作
- 基本操作
- Standard Editionの基本操作
- SpreadBuilderの使用
弊社Webサイトの「よくある質問(FAQ)」にて公開されている、下記の
内容につきましても、併せてご確認ください。
[ActiveReports for .NET 2.0J Professional のテクニカルFAQ]
http://www.grapecity.com/japan/support/database/P7_330_TechFaq.htm
ID: 7747
レポートのイベントを利用してSpreadBuilderによりExcelファイルを
作成する方法【※サンプル有り】
<質問内容>
EXCELの出力を試しているのですが、あるレイアウトで
「Too many MergeAreas」というエラーが表示されます。
PDFで出力してみたところ問題有りませんでした。
明細行の縦の項目のマージには対応していなのでしょうか。
添付したエクセルをご確認いただけますか。
以上、ご回答のほど宜しくお願い申し上げます。
<GrapeCity 回答内容>
恐れ入りますが、ご指摘のエラーは、Excelエクスポート機能の制限に
よるものです。
ActiveReportsのExcelエクスポート機能は、1シートあたり32767回を
超える回数のマージには対応しておりません。
UseCellMergingプロパティをTrueに設定した場合、レポートのレイアウ
トによってはセルのマージが行なわれますが、上記の制限を越えてマー
ジ処理が行われた場合に、「Too many MergeAreas.」というエラーが
発生します。
本制限は、SpreadBuilder機能のMergeメソッドを実行してセルをマージ
する場合も同様であり、32768回目を実行したときに本例外が発生します。
恐れ入りますが、32768回以上のマージを行う場合には、セルのレイアウ
トを変更してマージの回数を小さくするか、別のシートを使用するなど
の方法をご検討くださいますようお願い申し上げます。
製品のドキュメントに情報が不足しておりましたことを、お詫び申し
上げます。
<質問内容>
ご回答いただいた件「CacheToDiskプロパティをTrue」ですが、
この設定は、ビューア又はPDF形式で出力した場合のみ有効と
書かれていました。
今回のプロジェクトでは、PDF出力もございますが、現状の問題は
EXCEL出力時です。設定「CacheToDiskプロパティ」はでの効果は
有りますか。
以上、ご回答のほど宜しくお願い申し上げます。
<GrapeCity 回答内容>
ActiveReportsのExcelエクスポート機能(XlsExportクラス)を使用して、
レポートをExcel形式で出力する場合、(1)レポートの作成→(2)作成した
レポートをExcel形式に出力(変換)という処理の流れになります。
CacheToDiskプロパティは、(1)の処理においては機能しますが、(2)の
処理に対しては特に効果がありません。
<質問内容>
以前、Standard版を使用してたこともあり、WEBの開発で
Professional版の購入を決定するため試用しています。
質問①
ブラウザのプログラムで、XlsExportを使用してExcel出力を
行う際、明細行を用紙サイズに関係なく連続で出力される
ようにしたいのですが
「このレポートは、ActiveReports for.NET トライアル版で…」
の一行が表示されるため各ページイメージの最終行で必ず一行
空いてしまいます。正式版であれば表示されず、連続で空行無く
出力されますか。
質問②
Excelに出力する際、最大ワークシートサイズ 65,536行、256列
というExcelの制限に従うと思いますが、列数が256列未満の
簡単なサンプルで試したところ、エラーとなりました。
今回の開発では、エクセル、PDF出力がメインの処理と
なるため、実際に使用出来る制限があるかないか、またサーバー
のメモリーに依存するのか等を知りたいのですが。
以上、宜しくお願い申し上げます。
<GrapeCity 回答内容>
この度は弊社製品をご検討いただきまして、ありがとうございます。
(1)トライアル版を使用し、レポートをExcel形式でエクスポートした
場合、各ページの下部にトライアル版のバナーが出力されるため、
Excelのシート上にもご指摘のような行が作成されます。
製品版を使用した場合、このようなバナー行は出力されません。
Excelエクスポート時の注意事項につきましては、製品ヘルプの以下の
内容も併せてご参照ください。
ActiveReports for .NETユーザーガイド
- よくある質問
- エクスポート
- Excelエクスポートの出力結果がずれる
(2)申し訳ございませんが、お送りいただいた情報からは、内容を十分に
把握することができませんでした。
発生しているエラーとは、以下のような内容でしょうか。
----------------------------------------
The specified iColumn argument is either less than zero or
greater than the maximum number of columns that the Excel
file format supports.
----------------------------------------
Excelエクスポート時、出力されるExcelデータ(ファイル)の行数が
65536行を超える場合には、Exportメソッドの処理で上記のような例外が
発生します。
65536行を超える行数のExcel出力には対応しておりませんので、あらか
じめご了承ください。
また、ActiveReportsの仕様として、レポートのページ数やコントロール
数に、特に上限は設けられておりませんが、実際の上限は、実行環境の
リソースや、アプリケーションが使用するメモリ等に依存します。
弊社Webサイトの「よくある質問」にて公開されている、下記の内容に
つきましても、参考までにご確認ください。
[ActiveReports for .NET 2.0J Professional のテクニカルFAQ]
http://www.grapecity.com/japan/support/database/P7_330_TechFaq.htm
ID: 7650
作成できるレポートのページ数の上限は?
ID: 9363
パフォーマンスに関する資料はありますか?
<質問内容、ご指摘の現象>
◆.NETFrameworkのバージョン: 2.0
◆Visual Studio .NETのバージョン: 2003
◆オペレーティングシステム: WindowsXP Professional
◆OSサービスパック使用状況: Service Pack 2
◆開発言語: Visual Basic .NET
◆製品の修正版適用状況: 4.2.1.1238
◆アプリケーションの形態: Webフォーム
<GrapeCity回答内容>
> ActiveReportsのExcelエクスポート機能(XlsExportクラス)を使用
して、レポートをExcel形式で出力する場合、(1)レポートの作成→(2)
作成したレポートをExcel形式に出力(変換)という処理の流れになり
ます。
CacheToDiskプロパティは、(1)の処理においては機能しますが、(2)の
処理に対しては特に効果がありません。
【ご回答内容について、再度質問がございます】
今回は指示画面(ASP.netで作成)にツールのコンポーネントから選択した
「XlsExport」をコンポーネントトレイに貼り付けエクセル形式で直接
ダウンロードする実装形式となっています。
コード内では、下記のような定義が自動的に行われています。
Protected WithEvents XlsExport2 As DataDynamics.ActiveReports
.Export.Xls.XlsExport
この場合でも、「(1)レポートの作成」という動作が内部で行われ
CacheToDiskを設定する効果が有ると考えて宜しいでしょうか。
以上、宜しくお願い致します。
<回答内容>
たびたびお手数をお掛けしまして申し訳ございません。
レポートをExcel形式で出力する場合、以下のような処理を実装します。
レポートの作成処理が自動的に行われるわけではありません(レポート
を作成せずに、レポートをExcel形式で出力することはできません)。
◆サンプルコード
----------------------------------------
Dim rpt as new ActiveReport1
Dim m_stream As New System.IO.MemoryStream()
' (1)レポートの作成
rpt.Run(False)
' (2)作成したレポートをExcel形式でメモリストリームに出力(変換)
XlsExport2.Export(rpt.Document, Am_stream)
----------------------------------------
上記の場合、(1)の処理において、CacheToDiskプロパティの設定が有効
となります。