SQL 报告服务:第一次调用非常慢



我已经安装了一个SQL报告服务器(2008 R2),有一些报告。但我有一些性能问题。

一天中对服务器的第一个调用(例如在报告界面上)非常慢(最多大约 30-45 秒)。

然后,报告生成是"快速"的(1-2秒)。

对服务器的下一次调用总是禁食,直到第二天。我的印象是它在内存中加载了很多东西。但是什么可能需要 30-45 秒才能加载到内存中???以及如何只加载一次?

服务器已经足够好了(四核,8GB 内存,目前从未接近其容量)。

问题出在哪里?我该如何解决这个问题?

这些报告在一周内只会发布 4-5 次,所以如果我无法改变这一点,它们总是很慢。而且由于它可供客户使用,我只是无法让他们理解这一点(并且报告是通过网站调用的,所以我冒着超时的风险)。

谢谢

这似乎是一个 SSRS 问题。您的报告没有错。

SSRS 在长时间不活动后首次访问时需要更多时间来加载它是"正常的"。此问题是由 SSRS 的工作方式引起的,并且 SSRS 在特定时间段后定期重新启动应用程序域。重新启动应用程序域后,在首次向 SSRS 请求时,它需要加载所有设置,并且需要相当长的时间。

此博客显示是针对这种情况的解决方法

这是我为解决问题而编写的powershell脚本。它被设置为每凌晨 1:00 运行一次的任务:

Stop-Service "SQL Server Reporting Services (MSSQLSERVER)"
Start-Service "SQL Server Reporting Services (MSSQLSERVER)"
$wc = New-Object system.net.webClient
$cred = [System.Net.CredentialCache]::DefaultNetworkCredentials
$wc.Credentials = $cred
$src = $wc.DownloadString("http://localhost/Reports/Pages/Report.aspx?ItemPath=***NAME OF HOME PAGE***")

我能想到的最佳解决方案是在Windows服务中使用Windows batch命令向报告的http页面发出"curl"命令。这在用户进来之前每天早上都会在页面上运行。

不再有权访问代码(工作是不久前),但这个问题显示了如何使用 curl:

http://blogs.plexibus.com/2009/01/15/rest-esting-with-curl/

正如迭戈所说,SSRS有一些问题。第一次调用它很慢,关于您的服务器配置。我建议您在rsreportserver.config中添加以下配置(如果您不知道C:\Program Files\Microsoft SQL Server\MSRS10。MSSQLSERVER\Reporting Services\ReportServer\ )

如果要增加 SSRS 使用的最大内存:(即 7 GB)

<WorkingSetMaximum>7000000</WorkingSetMaximum>

如果要改进第一次调用,可以设置(以分钟为单位)

<RecycleTime>4320</RecycleTime>

实际上,SSRS 有一个重置(回收)时间来清理其缓冲区。默认情况下,它设置为 720 分钟(12 小时),这就是为什么如果您每天早上打开报告,它实际上加载速度非常慢。根据需要,您可以将回收时间设置得更高(2-3天)。我不建议使用更长的时间,因为缓冲区会填满,并且您只会得到空白页,因此您必须手动重新启动报告服务。

它可能与SQL Server完全无关。尝试查看是否不是代码符号吊销列表检查问题,请参阅修复由于代码符号验证而导致应用程序启动缓慢

的问题

我将页面上的主查询和下拉控件转换为从存储过程加载,它在加载过程中产生了 5 秒的差异。避免使用任何内联查询。

博客(http://www.pawlowski.cz/2011/07/solving-issue-long-starting-report-ssrs-2008/)运行良好。就我而言,我使用的是SQL Server 2017 Reporting Services。我只是在调用"下载字符串"时遇到问题,无法连接到远程服务器。我使用"开始-睡眠"cmdlet 添加了睡眠时间。所做的另一个更改是,我需要预加载的地址是报告 Web 服务,而不是门户。完整的解决方案如下:

    Stop-Service "SQL Server Reporting Services"
    Start-Service "SQL Server Reporting Services"
    $wc = New-Object system.net.webClient
    $cred = [System.Net.CredentialCache]::DefaultNetworkCredentials
    $wc.Credentials = $cred
    Start-Sleep -Seconds 30
    $src = $wc.DownloadString("http://localhost/ReportServer?/MyReport&Param=Title&rs:Format=IMAGE")

然后我从命令行创建了计划任务:

schtasks /create /tn "SSRS Recycle" /ru Administrator /rl highest /np /sc daily /sd 11/07/2023 /st 02:00 /tr "powershell.exe -noprofile -executionpolicy RemoteSigned -file "C:scriptsSSRSRecycle.ps1"

Pavel Pawlowski在他的博客上提出的最后一个建议是将"RecycleTime"的值设置为24小时。"C:\Program Files\Microsoft SQL Server Reporting Services\SSRS\ReportServer\rsreportserver.config"(您需要管理权限才能对其进行编辑): <RecycleTime>1440/RecycleTime>

最新更新