Цель тестирования - реально ли заменить используемый в настоящее время генератор отчетов на SSRS сервере на движок от Стимулсофт.
Методика - с помощью visual studio load test мы эмулируем посещение нашего сайта 250 пользователями одновременно. Не все из них строят отчеты одновременно, нагрузка эмулирует поведение реального пользователя.
Тем не менее, за 4 минуты строятся 750 отчетов (пользователь строит 3 отчета в своем сеансе работы).
Пока получается, что для одного пользователя время ожидания сервера достигает 11 секунд на 3 отчета, а среднее время ожидания - 4.5 сек на 3 отчета.
Аналогичные отчеты строятся на SSRS сервере быстрее - среднее время ожидания 2 сек на 3 отчета, максимальное - 3.3 секунды.
4.5 сек на 3 отчета для нас приемлемо, однако не нравится экстремум в 11 секунд - проявляется, только когда есть приличная нагрузка.
ОС: Windows Server 2008 R2, со штатным IIS, 128 Гб ОЗУ, 4 16-ядерных процессора.
Может быть, я неправильно понимаю назначение Ваших продуктов, и для корректного сравнения с SSRS нам надо развертывать Stimulsoft Report Server?
Кроме того, при кол-ве одновременно работающих пользователей более 100 логах появляется такая ошибка:
Код: Выделить всё
An exception of type 'System.ArgumentException' occurred and was caught.
------------------------------------------------------------------------
Type : System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Value does not fall within the expected range.
Source : mscorlib
Help link :
ParamName :
Data : System.Collections.ListDictionaryInternal
TargetSite : Void ThrowExceptionForHRInternal(Int32, IntPtr)
Stack Trace : at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(String name)
at System.Web.Hosting.IIS7WorkerRequest.GetServerVariable(String name)
at System.Web.Hosting.IIS7WorkerRequest.IsSecure()
at System.Web.HttpRequestWrapper.get_IsSecureConnection()
at Stimulsoft.Report.Mvc.StiResourcesHelper.GetRequestUrl(HtmlHelper htmlHelper, Boolean relativeUrls, String controller)
at Stimulsoft.Report.Mvc.StiMvcViewer.CreateChildControls()
at Stimulsoft.Report.Mvc.StiMvcViewer.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at Stimulsoft.Report.Mvc.StiMvcHelper.StiMvcViewer(String ID, StiMvcViewerOptions options)
at ASP._Page_Views_Shared_Reporting_StiMvcViewer_cshtml.Execute() in c:\XXXXX\Views\Shared\Reporting\StiMvcViewer.cshtml:line 13
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
at System.Web.Mvc.Controller.ExecuteCore()
at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Доп. информация:
User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1);
RequestType:GET
Url:/App/StiView/ShowReport/Report?Param1=qqq&Param2=bbb
Код: Выделить всё
@using Stimulsoft.Report.Mvc;
@{
Layout = null;
}
<!doctype html>
<html>
<head>
<title>Отчет</title>
</head>
<body>
@Html.Stimulsoft().StiMvcViewer(
"MvcViewer",
new StiMvcViewerOptions
{
Actions =
{
GetReportSnapshot = "GetReportSnapshot",
ViewerEvent = "ViewerEvent",
}
, Localization = "~/Views/Shared/Reporting/Localization/ru.xml"
, Toolbar =
{
ShowDesignButton = false,
ShowParametersButton = false
}
, Server =
{
RequestTimeout = 30
}
})
</body>
</html>