SQL Server 2008 の Reporting Services でタイムアウト

1レポートあたり 100~200MBの巨大なPDFを作成するレポートを連続作成させると、いつも大体8ファイル目あたりでエラーが発生する。

対処として以下のことを実行する ASP.NET アプリケーションを作成して、アクセスごとに強制クリーンするようにした。

  • ReportService を停止
  • ReportServerTempDB 内の各テーブルの内容を削除 (TRUNCATE TABLE を利用)
  • ReportService を開始

原因調査の間、エラーログ(下に引用)を見ると DataSetに対するエラーのように見えるので、レポートに設定したSQL文を当初調査していた。

一方SSMSでプロセスの状態を確認していると、実際には ReportingServiceが使う一時テーブル ReportServerTempDB の Segment テーブルに対するUPDATEアクセスがタイムアウトしていた。待機の種類は PAGEIOLATCH_SH。

ReportingServices の設定項目 CleanupCycleMinutes ごとに掃除されるはず、なのだが連続でアクセスし続けると、間に合わないようでテーブルのサイズは 9GB にもなっていた。1レポートあたり8分程度で、CleanupCycleMinutes (標準では10分)を実行するタイミングはあったはず。この数値を減らしても効果がないと判断した。

ということで今回は1アクセスごとに強制クリーンする方向で回避した。あと、このエラーが発生する以前も ReportingService のプロセスを見ているとメモリを食いまくりで 5GB 占有するような状況が見て取れた。このためサービス再起動するのが適切と判断。

library!ReportServer_0-2!1264!02/04/2011-15:50:17:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。, ;
chunks!ReportServer_0-2!1264!02/04/2011-15:50:17:: e ERROR: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
processing!ReportServer_0-2!1264!02/04/2011-15:50:48:: e ERROR: An exception has occurred in data source 'DataSet1'. Details: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
processing!ReportServer_0-2!1264!02/04/2011-15:50:48:: i INFO: DataPrefetch abort handler called for Report with ID=. Aborting data sources ...
processing!ReportServer_0-2!1264!02/04/2011-15:50:48:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。, ;
 Info: Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
   --- 内部例外スタック トレースの終わり ---
processing!ReportServer_0-2!1264!02/04/2011-15:50:48:: w WARN: Data source 'DataSource1': Report processing has been aborted.
processing!ReportServer_0-2!1264!02/04/2011-15:50:48:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。, ;
 Info: Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
   --- 内部例外スタック トレースの終わり ---
chunks!ReportServer_0-2!1264!02/04/2011-15:50:48:: w WARN: Rolling back shared chunk transaction for snapshot 'd1208e5d-64c0-4495-9319-7ff75955636a', Permanent=False.
library!ReportServer_0-2!1264!02/04/2011-15:50:48:: w WARN: Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
webserver!ReportServer_0-2!1264!02/04/2011-15:50:48:: e ERROR: Reporting Services error Microsoft.ReportingServices.Diagnostics.Utilities.RSException: レポートの処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: レポートの処理中にエラーが発生しました。 ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
library!ReportServer_0-2!1264!02/04/2011-15:50:48:: i INFO: RenderForNewSession('/SampleReport/ReportSample1')
library!WindowsService_0!8dc!02/04/2011-15:51:39:: i INFO: Call to CleanBatch()
library!WindowsService_0!8dc!02/04/2011-15:51:39:: i INFO: Cleaned 0 batch records, 0 policies, 0 sessions, 0 cache entries, 0 snapshots, 0 chunks, 0 running jobs, 0 persisted streams, 0 segments, 0 segment mappings.
library!WindowsService_0!8dc!02/04/2011-15:51:39:: i INFO: Call to CleanBatch() ends
runningjobs!ReportServer_0-2!de0!02/04/2011-15:51:47:: i INFO: Adding: 1 running jobs to the database
runningjobs!ReportServer_0-2!de0!02/04/2011-15:52:47:: i INFO: RunningJobContext.IsClientConnected; found orphaned request
library!ReportServer_0-2!de0!02/04/2011-15:52:47:: i INFO: CancelableSqlCommand.Cancel not called, connection is not valid
library!ReportServer_0-2!1264!02/04/2011-15:52:55:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。, ;
runningjobs!ReportServer_0-2!de0!02/04/2011-15:53:47:: i INFO: RunningJobContext.IsClientConnected; found orphaned request
runningjobs!ReportServer_0-2!de0!02/04/2011-15:54:47:: i INFO: RunningJobContext.IsClientConnected; found orphaned request
library!ReportServer_0-2!1264!02/04/2011-15:54:55:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。, ;
chunks!ReportServer_0-2!1264!02/04/2011-15:54:55:: e ERROR: Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerStorageException: レポート サーバー データベース内でエラーが発生しました。このエラーの原因として、接続エラー、タイムアウト、またはデータベース内のディスク領域の不足が考えられます。 ---> System.Data.SqlClient.SqlException: タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
rpcserver!DefaultDomain!1148!02/04/2011-15:55:22:: i INFO: Process monitoring stopped.
rpcserver!DefaultDomain!de0!02/04/2011-15:55:22:: i INFO: RPC Server stopped.

ReportViewer Control を使って自前でレンダリングするアプリケーションを作った方がよかった。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。