Recebi a tarefa de melhorar o desempenho da primeira conexão de relatório a cada dia. Semelhante a esta postagem .
Temos um relatório SSRS simples que funciona como uma página de destino. Possui hiperlinks para relatórios subsequentes.
Eu tentei:
- implementando o script de reinicialização do powershell às 6h30.
- configurar o cache de relatório para atualizar em uma programação a cada 10 minutos após a reinicialização
- Adicionando uma assinatura.
- agendar um script powershell para exportar o relatório .
Parece que o problema é que o SSRS de alguma forma trata essas conexões de maneira diferente do que se um usuário real abrir o relatório por meio de um navegador da web. Mesmo que o relatório seja executado, ele não parece ser tratado da mesma maneira como se um usuário o estivesse acessando por meio do portal. E assim... o primeiro usuário experimenta um grande atraso.
Usando os recursos de depuração F12 no internet explorer, consegui reproduzir e capturar o que o navegador está vendo. O SSRS levou apenas 4 segundos para produzir e retornar o relatório, porém no navegador demorou 122 segundos para tentar abrir a URL para a tela sendo renderizada. 2 minutos!!! Não é à toa que os usuários estão reclamando.
Examinando meus arquivos de log do SSRS (Localizado em: C:\Arquivos de Programas\Microsoft SQL Server\MSRS13.MSSQLSERVER\Reporting Services\LogFiles), parece que o domínio do aplicativo SSRS está sendo reiniciado ou recarregado.
O trecho de log abaixo mostra
- A atualização de cache agendada às 08:00:19 e 08:10:19
- Seguido pelo meu pedido de relatório por volta das 8:15:01
- Eu não recebo o relatório até cerca de 8:17:06
Arquivo de log:
library!WindowsService_0!1bdf8!08/24/2017-08:10:19:: i INFO: Call to CleanBatch()
library!WindowsService_0!1bdf8!08/24/2017-08:10:20:: i INFO: Cleaned 0 batch records, 0 policies, 0 sessions, 0 cache entries, 0 snapshots, 0 chunks, 0 running jobs, etc etc
library!WindowsService_0!1bdf8!08/24/2017-08:10:20:: i INFO: Call to CleanBatch() ends
appdomainmanager!DefaultDomain!adb0!08/24/2017-08:15:01:: i INFO: Registering AppDomain: type='ReportServer'; id='3'; Name='ReportServer_MSSQLSERVER_0-1-131479929006508632'
appdomainmanager!DefaultDomain!adb0!08/24/2017-08:15:01:: i INFO: Creating a new AppDomainLifeCycleManagementEntry for AppDomain id '3'
appdomainmanager!DefaultDomain!adb0!08/24/2017-08:15:01:: i INFO: Appdomain STARTED: id='3'; name='ReportServer_MSSQLSERVER_0-1-131479929006508632'
appdomainmanager!ReportServer_0-1!adb0!08/24/2017-08:15:08:: i INFO: RS authentication mode is 4; effective ASP.NET authentication mode is Windows. vdir=/ReportServer.
appdomainmanager!DefaultDomain!adb0!08/24/2017-08:15:08:: i INFO: Appdomain:3 ReportServer_MSSQLSERVER_0-1-131479929006508632 initialized (#1).
appdomainmanager!DefaultDomain!adb0!08/24/2017-08:15:08:: i INFO: SetInitialized AppDomain id '3': initialized = 1
webserver!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Reporting Web Server started
library!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: SQLDump flags: ReferencedMemory, AllThreads, SendToWatson
library!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: MiniDump flags: DataSegs, UnloadedModules, ProcessThreadData
library!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Dump on: Microsoft.ReportingServices.Diagnostics.Utilities.InternalCatalogExceptionMicrosoft.ReportingServices.
library!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Do not dump on: System.Threading.ThreadAbortExceptionSystem.Web.UI.ViewStateExceptionSystem.OutOfMemoryExceptionSystem.
library!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Minidump location: C:\Program Files\Microsoft SQL Server\MSRS13.MSSQLSERVER\Reporting Services\Logfiles
runningjobs!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Running Requests Scavenger timer enabled: Next Event: 60 seconds. Cycle: 60 seconds
runningjobs!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Running Requests DB timer enabled: Next Event: 60 seconds. Cycle: 60 seconds
resourceutilities!ReportServer_0-1!adb0!08/24/2017-08:16:51:: i INFO: Reporting Services starting SKU: Developer
ui!ReportServer_0-1!adb0!08/24/2017-08:16:52:: i INFO: Installed SKU: Developer edition
ui!ReportServer_0-1!adb0!08/24/2017-08:16:52:: i INFO: Registering with Software Usage Metrics Product:SQL Server 2016, Role:Microsoft SQL Server Reporting Services, etc etc
library!ReportServer_0-1!adb0!08/24/2017-08:16:52:: i INFO: Call to GetItemTypeAction(/CIA). User: MYDOMAIN\prm.
library!ReportServer_0-1!adb0!08/24/2017-08:16:53:: i INFO: Catalog SQL Server Edition = Developer
crypto!ReportServer_0-1!adb0!08/24/2017-08:16:54:: i INFO: Initializing crypto as user: NT Service\ReportServer
crypto!ReportServer_0-1!adb0!08/24/2017-08:16:54:: i INFO: Exporting public key
crypto!ReportServer_0-1!adb0!08/24/2017-08:16:54:: i INFO: Importing existing encryption key
library!ReportServer_0-1!adb0!08/24/2017-08:17:02:: i INFO: Entering StreamRequestHandler.ExecuteCommand - Command = StyleSheet
library!ReportServer_0-1!adb0!08/24/2017-08:17:02:: i INFO: Exiting StreamRequestHandler.ExecuteCommand - Command = StyleSheet (success)
library!ReportServer_0-1!adb0!08/24/2017-08:17:06:: i INFO: Call to GetItemTypeAction(/CIA). User: MYDOMAIN\prm.
library!ReportServer_0-1!adb0!08/24/2017-08:17:06:: i INFO: RenderForNewSession('/CIA')
library!ReportServer_0-1!adb0!08/24/2017-08:17:07:: i INFO: Using folder C:\Program Files\Microsoft SQL Server\MSRS13.MSSQLSERVER\Reporting Services\blahblahblah
Como cada uma das várias soluções alternativas que tentei até agora não parece funcionar...
Como posso forçar o SSRS a fazer isso antes que um usuário real tente executar o relatório?
Acho que consegui corrigir o que acho que é basicamente o mesmo problema.
Logo pela manhã, se eu for ao nosso URL do Servidor de Relatórios, ele carregará rápido o suficiente e eu posso navegar no menu imediatamente sem problemas. Mas assim que clico em um relatório real, há uma espera de 2 minutos antes que o relatório seja executado...
[Teste rápido... foram apenas 75 segundos para mim desta vez, mas pareceu mais longo!]
A execução de um relatório a partir de uma linha de comando usando o comando "RS" parece iniciar (acorde!) sempre que parte da arquitetura não estiver sendo iniciada e o primeiro relatório levar um tempo normal para ser executado. Vou programar isso como uma tarefa e esquecê-la.
RS é um pouco complicado de usar, já que você precisa fazer um script de um pouco de VBA para executar o relatório, mas eu já precisava trabalhar essa parte para outro trabalho que tive.
Editar: Adicionado script abaixo
Eu realmente não posso levar todo o crédito por isso, nem citar referências, eu temo. Ele é composto de 3 ou 4 recursos diferentes já existentes e adaptado para atender às minhas necessidades (especificamente, eu queria gerar um conjunto de exportações de pdf para uma variedade de entradas). E então simplificou um pouco mais para aqui:
Arquivo de script "RunReport.rss"
Que é então executado a partir da linha de comando com
E neste caso cria um arquivo chamado "output.pdf"
Espero que isso possa ser útil?
Encontrei uma solução alternativa, mas não uma com a qual estou especialmente feliz. Conseguimos usar nosso software de monitoramento de sites para acessar o servidor de relatórios do SSRS, e parece fazer o suficiente para que o componente da web do SSRS seja iniciado. O primeiro usuário do dia agora recebe uma resposta em 4 segundos.
Passei horas tentando fazer com que o PowerShell fizesse isso por mim e cheguei muito perto. Então vou deixar isso aqui. Se outra pessoa puder resolver a última peça do quebra-cabeça e fazer isso funcionar, creditarei a resposta:
A parte chave que falta é que o SSRS usa o portal da web para responder.