Because Reporting Services uses everything from IIS to e-mail and the files system, there a lot of places to monitor and tune for performance.
Just like performance tuning in any major application, it is a matter of divide and conquer. The process I have explained in other chapters still holds: Detail the parts of the application, monitor for bottlenecks, determine the components within that part of the system, and tune for performance.
You can find many resources for monitoring from the client through the IIS layer, so I do not repeat those here. The important elements for performance within Reporting Services have more to do with the databases that it uses as well as the source databases and the Reporting Services connection to them.
For the source databases, you should follow two basic rules: Always use a separate database for reporting source data than the OLTP system, and optimize those databases for reads. That means a high fillfactor and a lot of indexes. The idea behind these concepts is to reduce contention and to allow the fastest access possible to the source data.
Make sure you have maintenance plans set up on both Reporting Services databases as well as the separate source database. Other than standard database tuning, you want to optimize the path between the Reporting Services servers and the source database. If you have split several Reporting Services servers to talk to a central catalog server, ensure the path is optimized between those systems, too.
You have several additional objects and counters available in Windows System Monitor (PerfMon) to watch the Reporting Services server. They are divided into the two mechanisms I mentioned at the beginning of the chapter: the Windows service and the Web service.
For the Web service, you can watch the following counters in the MSRS 2005 Web Service object. Cache objects show memory pressure, actions per second show the load on the server. The more times things are received directly from cache, the better.
Counter | Used to Show |
---|
Active Sessions | Active sessions; includes all browser sessions generated from report subscriptions, whether they are currently active or not. | Cache Hits/Sec | The number of requests for all cached reports. | Cache Misses/Sec | The number times that a report was not in cache. | First Session Requests/Sec | The number of new user sessions started from cache. | Memory Cache Hits/Sec | The number of times that reports are retrieved directly from memory cache. | Memory Cache Misses/Sec | Reports that could not be retrieved from the in-memory cache. | Next Session Requests/Sec | Reports that are opened in an existing session. | Report Requests | Reports that are active and being processed by the report server. | Reports Executed/Sec | Successful report executions. | Requests/Sec | All types of requests sent to the report server. | Total Cache Hits | Requests for reports from the cache since the service started. | Total Cache Misses | Report requests that were not in the cache since the service started. | Total Memory Cache Hits | Reports returned directly from memory cache since the service started. | Total Memory Cache Misses | Cache misses since the service started. | Total Processing Failures | Report processing failures since the service started. | Total Rejected Threads | Processing threads switched from asynchronous processing to synchronous, serial processes. | Total Reports Executed | Total number of reports that ran successfully since the service started. | Total Requests | Total number of all requests made to the report server since the service started. |
This table shows the counters for the Windows service in the MSRS 2005 Windows Service object. The same logic holds true, activities per second show load and the cache objects show memory use. More items found in cache show proper memory sizing.
Counter | Used to Show |
---|
Active Sessions | Active sessions in the report server database. | Cache Flushes/Sec | Number of times the cache flushes. | Cache Hits/Sec | Requests for cached, re-rendered reports. | Cache Misses/Sec | Requests that fail to return the report from cache. | Delivers/Sec | Report deliveries from any extension. | Events/Sec | Events such as SnapshotUpdated and TimedSubscription that are processed. | Memory Cache Hits/Sec | Number of times reports are retrieved from in-memory cache. | Memory Cache Misses/Sec | Number of times that reports cannot be retrieved from in-memory cache. | Next Session Requests/Sec | Requests for reports that are open in a session. | Report Requests | Reports that are active and handled by the report server. | Reports Executed/Sec | Reports successfully generated. | Total App Domain Recycles | Application domain cycles since the service started. | Total Cache Flushes | Report server cache updates since the service started. | Total Cache Hits | Reports processed directly from memory cache since the service started. | Total Cache Misses | Reports not processed directly from memory cache since the service started. | Total Deliveries | Reports delivered for all extensions by the Scheduling and Delivery Processor. | Total Events | Events processed since the service started. | Total Memory Cache Hits | Cached reports returned directly from memory cache since the service started. | Total Memory Misses | Cache Cached reports returned directly from memory cache since the service started. | Total Processing Failures | Processing failures that have occurred since the service started. | Total Rejected Threads | Processing threads switched from asynchronous processing to synchronous, serial processes. | Total Reports Executed | Total number of reports that ran successfully since the service started. | Total Requests | Total number of all requests made to the report server since the service started. |
|