Rs2008 在内存管理方面已经有了很大的改变。主要增加了文件缓存,允许把内存数据卸载到文件缓存中。而Rs2005 都是把数据放到内存中。对于大数据量的报表而言,很容易出现OutOfMemory 错误。
在实际应用中,发现Rs2008 也经常出现 OutOfMemory 错误。主要有以下几个原因:
1 物理内存过低。
机器只有2G内存,特别是64位的机器。
2 同一台服务器同时承担两种角色: 数据库服务器,报表服务器。但没有限定数据库服务器的占用的最大内存。
由于数据库通常会采用贪婪的内存策略获取尽可能多的内存,导致报表服务器的内存严重不足。
3 报表服务器默认的内存管理参数不适用于有大量报表用户同时使用的情况。默认配置适用于负载均衡的场景。
如果系统经常出现负载尖峰(某一时刻有大量报表用户同时使用的情况),则报表服务器则会从无压力区域迅速达到高压力区域。出现OutOfMeory,或者拒绝新的请求(503错误,服务器状态不可用)。
为了改善这种情况,需要对报表服务器内存管理策略进行调整。
在 RsReportServer.config配置文件中增加配置。
WorkSetMaxiMum 默认为报表服务器启动检测到的最大可用内存。
MemoryThreshold 默认是 WorkSetMaxiMum 的90%
MemorySafetyMargin 默认是 WorkSetMaxiMum 的80%
WorkingSetMinimum 默认是 WorkSetMaxiMum 的60%
通过以上讨论,强烈建议
1 手工指定 WorkSetMaxiMum 而不是在报表服务器启动是自动检测。
2 MemorySafetyMargin 改为 50% ,压缩低内存区域,使系统从容应对峰值负载情况。
WorkingSetMinimum 设为 WorkSetMaxiMum 25%到 30%
示范:
服务器同时是报表服务器和数据库服务器的情况:
假定内存共 24G
Sqlserver最大使用 18G ,1G 给操作系统使用,剩余 5G给报表服务器。
配置如下:
<MemorySafetyMargin>50</MemorySafetyMargin>
<MemoryThreshold>90</MemoryThreshold>
<WorkingSetMaximum>5000000</WorkingSetMaximum>
<WorkingSetMinimum>1500000</WorkingSetMinimum>