我的 ssrs 报告生成的瓶颈是什么?

问题描述 投票:0回答:1

通过 .NET 控制台应用程序,我尝试将相同的 SSRS 报告从 SQL Server 报表服务器呈现为 PDF 数百次,但使用不同的参数。每个报告的大小约为 1 MB。

该项目正在使用 WCF 方法与报表服务器:

使用基本的异步方法同时生成报告:

var listOfTasks = customers
    .Select(async customer =>
    {
        var parameters = new Dictionary<string, string>
        {
            { "CustomerId", customer.Id },
            { "BillDate", billDate }
        };
        await GenerateInvoice(parameters);
    })
    .ToList();

await Task.WhenAll(listOfTasks);
private async Task GenerateInvoice(Dictionary<string, string> parameters)
{
    var reportBytes = await _renderSsrs.ConvertToAsync(
       "\reportPath\InvoiceReport", 
       parameters, 
       FormatType.PDF);

    var filePath = $@"C:\temp\Invoices\Invoice-{parameters["CustomerId"]}.pdf";

    await CreateFileFromBytesAsync(reportBytes, filePath);
}

ConvertToAsync
的实现细节可以在这里找到:
https://gist.github.com/madcodemonkey/17216111f8ffa8d4515455fb90e1b4e9#file-program-cs

问题

最初 50 份左右的报告生成速度相当快,但很快就开始变慢,直到慢慢完全停止并停止生成更多 pdf。在 SQL Server 端,它显示有打开的连接,但正在休眠并等待命令。

同一份报告的数据检索时间到处都是:

最终进程停止并出现“报告执行已过期或无法找到”异常:

我相信该错误来自 SOAP WCF 客户端超时,与浏览器缓存无关,因为我没有尝试通过 Web 浏览器打开报告。

目前看来数据库/报表服务器是瓶颈,但这只是一个假设。

sp_who2
中没有列出任何阻塞进程,它只是坐在那里等待某些东西的连接。分析器似乎大部分趋于平稳,CPU 活动下降:

我尝试将 rsreportserver.config“MaxActiveReqForOneUser”设置从 20 提高到 50,但没有任何改善。

有人对应用程序为何停止运行有任何建议或想法吗?如果需要,我可以发布完整的代码,但我试图让这篇文章的开头简洁。

c# wcf async-await reporting-services
1个回答
0
投票

问题是否是您一次向服务器发出太多请求,导致资源耗尽?

是的。限制并发请求。在我的测试中,20 效果很好。使用 Parallel.ForEach 之类的东西是限制并发的简单模式,例如

var po = new ParallelOptions { MaxDegreeOfParallelism = 20 };
Parallel.ForEach(paramterValues, po, x =>
{
© www.soinside.com 2019 - 2024. All rights reserved.