cancel
Showing results for 
Search instead for 
Did you mean: 

Load Testing issue

Former Member
0 Kudos
78

I am baffled by the response time from the Crystal Reports Viewer after 30-40 concurrent users. Here is the stats about after running a load test to the pages:

Transaction Name Minimum Average Maximum Std. Deviation 90 Percent Pass Fail Stop

viewreport.aspx_2_Action_127 1.313 57.195 161.788 31.819 101.385 161 47 0

viewreport.aspx_3_Action_182 1.157 56.461 135.439 34.388 109.71 131 30 0

viewreport.aspx_4_Action_237 1.907 49.908 142.735 36.867 110.039 114 17 0

viewreport.aspx_Action_72 1.875 76.426 168.074 38.239 129.755 208 149 0

If you notice the minimum is a very good to start but as the users increase more than a 2 minute response time is reach. I need a real expert on this issues. I will call Business Objects if a proper response is not posted.

I need more information how to tweak, fix and maintain the same performance as the first login.

My current environment is:

Visual Studio 2005

Oracle 9.2

Crystal Viewer 11.5.3700.0

ASP.NET VB

Crystal Reports 11.5.3700.0

Current object for Crystal Viewer is:

<CR:CrystalReportViewer BackColor="White" ID="CRViewer" runat="server" AutoDataBind="true" EnableParameterPrompt="True"

DisplayGroupTree="False" EnableDatabaseLogonPrompt="True" HasCrystalLogo="False" HasViewList="False" HasToggleGroupTreeButton="false"

BorderStyle="Solid" BorderWidth="1" BorderColor="darkgray" ReuseParameterValuesOnRefresh="True" Width="925px" BestFitPage="True"

DisplayBottomToolbar="False" ReportSourceID="CrystalReportSource" />

<CR:CrystalReportSource ID="CrystalReportSource" runat="server">

</CR:CrystalReportSource>

Back end code:

Imports System.Xml

Imports System.data

Imports System.IO

Imports System.Text

Imports System.Configuration

Imports CrystalDecisions.CrystalReports.Engine

Imports CrystalDecisions.Shared

Partial Public Class viewreport

Inherits System.Web.UI.Page

Private _dsContacts As DataSet

Dim strUser, strReport, strPeriod, strRegionType, strRegion, strDate, strUnit, reportPath As String

Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

Try

reportPath = Server.MapPath("Reports/" & Request.QueryString("strReport"))

If Not Page.IsPostBack Then

If Not Page.User.Identity.IsAuthenticated Then

Response.Redirect("default.aspx")

End If

strUser = Request.QueryString("strUser")

strReport = Request.QueryString("strReport")

strPeriod = Request.QueryString("strPeriod")

strRegionType = Request.QueryString("strRegionType")

strRegion = Request.QueryString("strRegion")

strDate = Request.QueryString("strDate")

strUnit = Request.QueryString("strUnit")

If strUser <> "" And strReport <> "" Then

CrystalReportSource.Report.FileName = reportPath

ConfigureCrystalReports()

Else

lblMessage.Text = "<h1>Values for the report where not received properly.</h1><br /><br /><h2>" & strReport & "</h2><br /><br />Please contact your Commissions Reporting Administrator<br /><br />"

End If

End If

If File.Exists(reportPath) Then

CrystalReportSource.Report.FileName = reportPath

End If

Catch ex As Exception

ErrorRoutine(ex, "Page_Load")

End Try

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

GlobalCode.DisplayTitle("MetLife - Commissions Administration - Report Viewer", Page)

If Not Page.IsPostBack Then

GlobalCode.CreateLog(0, Master, Replace(Page.AppRelativeVirtualPath, "~/", ""))

End If

End Sub

Private Sub ConfigureCrystalReports()

Try

Dim i, j As Integer

Dim ParameterValue As String

_dsContacts = Nothing

_dsContacts = New DataSet

_dsContacts.ReadXml(Server.MapPath("XML\ReportFiles.xml"))

For i = 0 To _dsContacts.Tables(0).Rows.Count - 1

If Trim(UCase(_dsContacts.Tables(0).Rows(i)("FileName").ToString)) = Trim(UCase(strReport)) Then

Dim conn As ConnectionInfo = New ConnectionInfo()

If Not File.Exists(reportPath) Then

lblMessage.Text = "<h1>Report is not available.</h1><br /><br /><h2>" & reportPath & "</h2><br /><br />Please contact your Commissions Reporting Administrator<br /><br />"

Exit Sub

End If

ParameterValue = ""

CRViewer.ReportSource = reportPath

CrystalReportSource.Report.FileName = reportPath

CRViewer.HasToggleGroupTreeButton = False

conn.DatabaseName = _dsContacts.Tables(0).Rows(i)("Database").ToString

conn.UserID = _dsContacts.Tables(0).Rows(i)("UserID").ToString

conn.Password = _dsContacts.Tables(0).Rows(i)("Password").ToString

For Each cnInfo As TableLogOnInfo In CRViewer.LogOnInfo

cnInfo.ConnectionInfo = conn

Next

CRViewer.ParameterFieldInfo.Clear()

Dim ParamFields As ParameterFields = CRViewer.ParameterFieldInfo

Dim reportSeparation As New ReportDocument()

reportSeparation.Load(reportPath)

For j = 0 To reportSeparation.ParameterFields.Count - 1

Dim param As New ParameterField

param.Name = reportSeparation.ParameterFields.Item(j).Name

Select Case param.Name

Case "VRPTTYPE"

ParameterValue = strRegionType

Case "VPARAM"

ParameterValue = strRegion

Case "VUSER"

ParameterValue = strUser

Case "VDATE"

ParameterValue = strDate

Case "VUNIT"

ParameterValue = strUnit

Case "VPERIOD"

ParameterValue = strPeriod

Case Else

lblMessage.Text = "<h1>Report has parameters not expected.</h1><br /><br /><h2>" & reportPath & "</h2><br /><br />Please contact your Commissions Reporting Administrator<br /><br />"

Exit Sub

End Select

Dim param_Value As New ParameterDiscreteValue

param_Value.Value = ParameterValue

param.CurrentValues.Add(param_Value)

ParamFields.Add(param)

Next '

CRViewer.RefreshReport()

CRViewer.Dispose()

CRViewer = Nothing

reportSeparation.Close()

reportSeparation.Dispose()

reportSeparation = Nothing

_dsContacts.Dispose()

_dsContacts = Nothing

Exit Sub

End If

Next

Catch ex As Exception

ErrorRoutine(ex, "ConfigureCrystalReports")

End Try

End Sub

Public Sub ErrorRoutine(ByVal ex As Exception, ByVal Routine As String)

GlobalCode.ErrorRoutine(ex, Routine, Master)

End Sub

Private Sub CRViewer_Error(ByVal source As Object, ByVal e As CrystalDecisions.Web.ErrorEventArgs) Handles CRViewer.Error

'Do nothing

If Not File.Exists(reportpath) Then

lblMessage.Text = "<h1>Report is not available.</h1><br /><br /><h2>" & reportPath & "</h2><br /><br />Please contact your Commissions Reporting Administrator<br /><br />"

Else

lblMessage.Text = "<h1>An error has occurred!</h1><h2>Please try again at a later time!</h2><br />" & e.ErrorMessage

End If

CRViewer.Visible = False

e.Handled = True

End Sub

End Class

Accepted Solutions (1)

Accepted Solutions (1)

former_member184995
Active Contributor
0 Kudos

Crystal Reports comes with 3 concurrent processing licenses. That means that it can support 3 things happening concurrently (ie running, exporting, paging). Any other requests are queued and wait for 2 seconds to check for a free license. It stands to reason that the more users you throw at it, more of them will end up queued and waiting for their report to render, export, etc.

You can increase your load potential by going with a web farm or garden, but realistically if you are wanting to support a large number of concurrent users then the Crystal Reports SDK is not the way to go as it is not designed to do so.

Edit: I didnt not see your post prior to mine being updated. You state you have 1000 licenses which is not possible with the Crystal Reports SDK code you have posted. Where are these 1000 licenses coming from? (Enterprise, 1000 developer licenses for CR, etc)

Edited by: Jason Everly on Jan 29, 2009 11:30 AM

Former Member
0 Kudos

1000 Developer licenses. I do understand that this is something that is a known issue(Having 3 CPU licenses when running SDK). We have 1000 users for the reports. We cannot say that they will be concurrent. But, we have to test for that. Let me know if I answered your questions.

Again, what can I do to fix the problem.

former_member184995
Active Contributor
0 Kudos

It's not a known issue, it is an expected behavior and the product was designed that way (if I am understanding what you are seeing correctly, Dan has asked you for clarification on this).

A developer license is just that, it gives you the Crystal developer product with the right to develop applications using it. Honestly if you have 1000 users that need to use this application then you should be using Enterprise for this and not Crystal Reports runtimes.

Former Member
0 Kudos

You are both correct on your assumptions. I may not be answering your questions as you asked them, but you are following what I'm trying to say. Now, my issue, how do I resolve it.

How can I allow 1000 users concurrently view up to 12 reports at one time? So we are talking that they will be (running, exporting, paging) all at once. Meaning 12,000 report requests per second.

How will Enterprise handle it?

Can you confirm that Enterprise will handle it?

I'm ignorant about Enterprise, so, you will need to tell me how, when, where and what samples on how to work with Enterprise.

Thank you guys for the help.

former_member200290
Contributor
0 Kudos

Hi Raymond,

I am a Senior Engineer here at SAP and I will try to answer your question. First we have tons of sample applications and our developer help files online for you to download, however until you know exactly how or what you are doing it is hard to direct you to something simple. Most of our samples are not geared towards a fully functional application but geared towards showing how a single property or function of our SDK works.

When it comes to Enterprise handling 12,000 requests per second? This is like asking will IIS running on a Windows 2008 server handle 12,000 requests that require it to query databases, sort, render and export? Probably not. If you require IIS to handle this you would need to be building a web farm, and probably have to plan your architecture pretty carefully and engage consultants who are experts with IIS.

Circling back to your question of Enterprise handling it? Theoretically you could create an Enterprise System that does this. But if I was you, even with my knowledge of Enterprise and our SDK, I would engage some consultants who are experts with our Enterprise system. Reasons behind this are as complex of what you are doing. Are the users only viewing reports and getting fresh data, with out having to go far into our SDK? Then you need to have a larger amount of Page Servers. If needing to go deeper into the reports SDK then it would be RAS. Viewing scheduled reports? Then Job, Page and Cache servers come into play.

Business Objects Enterprise is a very scalable and robust system. Building a reporting system with the complexity you are talking about is more complicated then just pulling a product off the shelf and running it.

I hope this helps clarify things.

Trevor....

Answers (1)

Answers (1)

Former Member
0 Kudos

Hello Raymond,

I moved your post to the ".NET Development - Crystal Reports" forum because you're question is related to an issue you're seeing when running Crystal Reports in your ASP.NET application.

I'm not sure I fully understand your issue since the "results" you posted lost their formatting. Is the issue that after 30 or 40 users start using the application that you're seeing delays in getting the report to preview, etc.?

If this is what you're experiencing it's probably expected behavior. Crystal Reports .NET comes with 3 Concurrent Processing Licenses (CPLs). This CPL limit is fixed - it's 3 CPLs per CPU in a web application and can not be changed. I suspect that if you check your event viewer you'll see a number of messages saying that a free license could not be obtained, and that the request is queuing.

Please check this and let me know what you discover. If you are seeing the event viewer messages I can add additional detail. If you're not seeing event viewer message please clarify the issue you're experiencing.

Sincerely,

Dan Kelleher

Former Member
0 Kudos

Thank you very much for your answer. No, that is not the issue. We have 1000 licenses. So license is not the issue.

No events were found.

Former Member
0 Kudos

Hello again Raymond,

The code you posted is using the Crystal Reports .NET SDK and the ReportDocument object model. This means the licensing model I discussed - 3 CPLs per CPU is being used. If you have 1000 Business Objects Enterprise licenses they're not being used by this application because this code isn't interacting with your Enterprise system.

Can you post a clarification of the issue as I requested?

Sincerely,

Dan Kelleher