ReportServer2008內(nèi)存管理策略
Rs2008 在內(nèi)存管理方面已經(jīng)有了很大的改變。主要增加了文件緩存,允許把內(nèi)存數(shù)據(jù)卸載到文件緩存中。
而Rs2005 都是把數(shù)據(jù)放到內(nèi)存中。對(duì)于大數(shù)據(jù)量的報(bào)表而言,很容易出現(xiàn)OutOfMemory 錯(cuò)誤。
在實(shí)際應(yīng)用中,發(fā)現(xiàn)Rs2008 也經(jīng)常出現(xiàn) OutOfMemory 錯(cuò)誤。主要有以下幾個(gè)原因:
1 物理內(nèi)存過低。
機(jī)器只有2G內(nèi)存,特別是64位的機(jī)器。
2 同一臺(tái)服務(wù)器同時(shí)承擔(dān)兩種角色: 數(shù)據(jù)庫(kù)服務(wù)器,報(bào)表服務(wù)器。但沒有限定數(shù)據(jù)庫(kù)服務(wù)器的占用的最大內(nèi)存。
由于數(shù)據(jù)庫(kù)通常會(huì)采用貪婪的內(nèi)存策略獲取盡可能多的內(nèi)存,導(dǎo)致報(bào)表服務(wù)器的內(nèi)存嚴(yán)重不足。
3 報(bào)表服務(wù)器默認(rèn)的內(nèi)存管理參數(shù)不適用于有大量報(bào)表用戶同時(shí)使用的情況。默認(rèn)配置適用于負(fù)載均衡的場(chǎng)景。
如果系統(tǒng)經(jīng)常出現(xiàn)負(fù)載尖峰(某一時(shí)刻有大量報(bào)表用戶同時(shí)使用的情況),則報(bào)表服務(wù)器則會(huì)從無壓力區(qū)域迅速達(dá)到高壓力區(qū)域。出現(xiàn)OutOfMeory,或者拒絕新的請(qǐng)求(503錯(cuò)誤,服務(wù)器狀態(tài)不可用)。
為了改善這種情況,需要對(duì)報(bào)表服務(wù)器內(nèi)存管理策略進(jìn)行調(diào)整。
在 RsReportServer.config配置文件中增加配置。
該文件一般在C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer目錄下
WorkSetMaxiMum 默認(rèn)為報(bào)表服務(wù)器啟動(dòng)檢測(cè)到的最大可用內(nèi)存。
MemoryThreshold 默認(rèn)是 WorkSetMaxiMum 的90%
MemorySafetyMargin 默認(rèn)是 WorkSetMaxiMum 的80%
WorkingSetMinimum 默認(rèn)是 WorkSetMaxiMum 的60%
通過以上討論,強(qiáng)烈建議
1 手工指定 WorkSetMaxiMum 而不是在報(bào)表服務(wù)器啟動(dòng)是自動(dòng)檢測(cè)。
2 MemorySafetyMargin 改為 50% ,壓縮低內(nèi)存區(qū)域,使系統(tǒng)從容應(yīng)對(duì)峰值負(fù)載情況。
WorkingSetMinimum 設(shè)為 WorkSetMaxiMum 25%到 30%
示范:
服務(wù)器同時(shí)是報(bào)表服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器的情況:
假定內(nèi)存共 24G
Sqlserver最大使用 18G ,1G 給操作系統(tǒng)使用,剩余 5G給報(bào)表服務(wù)器。
配置如下:
<MemorySafetyMargin>50</MemorySafetyMargin>
<MemoryThreshold>90</MemoryThreshold>
<WorkingSetMaximum>5000000</WorkingSetMaximum>
<WorkingSetMinimum>1500000</WorkingSetMinimum>