Rs2008 在內存管理方面已經有了很大的改變。主要增長了文件緩存,容許把內存數據卸載到文件緩存中。而Rs2005 都是把數據放到內存中。對於大數據量的報表而言,很容易出現OutOfMemory 錯誤。數據庫
在實際應用中,發現Rs2008 也常常出現 OutOfMemory 錯誤。主要有如下幾個緣由:緩存
1 物理內存太低。服務器
機器只有2G內存,特別是64位的機器。負載均衡
2 同一臺服務器同時承擔兩種角色: 數據庫服務器,報表服務器。但沒有限定數據庫服務器的佔用的最大內存。大數據
因爲數據庫一般會採用貪婪的內存策略獲取儘量多的內存,致使報表服務器的內存嚴重不足。spa
3 報表服務器默認的內存管理參數不適用於有大量報表用戶同時使用的狀況。默認配置適用於負載均衡的場景。操作系統
若是系統常常出現負載尖峯(某一時刻有大量報表用戶同時使用的狀況),則報表服務器則會從無壓力區域迅速達到高壓力區域。出現OutOfMeory,或者拒絕新的請求(503錯誤,服務器狀態不可用)。server
爲了改善這種狀況,須要對報表服務器內存管理策略進行調整。內存
在 RsReportServer.config配置文件中增長配置。input
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>