1.修改回收閥值memoryLimit
在ASP.NET Web服務器上,ASP.NET所能夠用到的內存,通常不會等同於所有的內存數量。在machine.config(C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/CONFIG)配置文件中,配置節<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認為“60”,即指定了ASP.NET進程(在任務管理器中大家就可以看到ASP.NET的進程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內存的60%。當ASP.NET使用的內存量超過這個限額時,IIS會開始自動回收(recycle)進程,即創建一個新的進程去負責應付Http請求,而將舊進程所占用的內存回收。
當我們有一台很大內存的服務器時,“memoryLimit”這個值是需要進行適當的調整的。比如我們准備了一台chemas-microsoft-com ffice marttags" />t="on">4G內存的服務器,那么t="on">4G×60%=t="on">2.4G。但是,對於Win32操作系統,一個進程所能占用的所有內存空間只有t="on">2G。當ASP.NET進程占用的內存開始達到t="on">2G時,由於它並沒有達到t="on">2.4G的“回收閾值”,所以IIS不會啟動recycle進程操作,但是由於Win32的限制,實際上已經不能給這個進程分配更多的內存了,於是,OutOfMemoryException就很可能會被拋出了。為了避免這樣的情況,我們就必須將“memoryLimit”適當調小,以讓IIS更早的進行進程回收。
微軟推薦的ASP.NET進程占用內存是不超過60%,並最好使計算出的實際值不超過t="on">800M。就是說,對於一台t="on">4G內存的服務器,最好將“memoryLimit”屬性設置成“20”。設置一個適當的回收閾值,讓IIS適時的進行進程回收,對於保證整個服務器的穩定運行,避免OutOfMemoryException是非常重要的。
在IIS6中,ASP.NET進程的回收閾值不再由配置節中的“memoryLimit”屬性決定,而是由IIS管理器中的應用程序池配置中的設置決定。
但是,即使正確設置了這些配置,也不能保證完全避免OutOfMemoryException的發生,原因可能是多樣而復雜的,比如內存回收操作可能耗時太多等等。開發人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費內存。:)
2.數據庫連接設置
在連接串里加入以下語句:
Pooling=true; MAX Pool Size=512;Min Pool Size=50;Connection Lifetime=30
3.應用池設置優化
一、回收
1、回收工作進程(分鍾):選中,值為1740
2、回收工作進程(請求數目):不選(原先設置為35000)
3、在下列時間回收工作進程:不填
4、消耗太多內存時回收工作進程:全不選。(2、3、4項可能避免了在訪問量高的時候強制回收進程可能引發的服務器響應問題,導致iis假死不響應)
二、性能
只選中空閑超時20分鍾。其他都不選。WEB園最大工作進程數為1(默認)。注意web園這里一定要保持默認,如果填寫其他超過1的數字就會導致一些網站程序的后台程序打不開或者刷新不停。
原來的請求隊列限制為4000,現在無限制。
三、運行狀況
前兩項都起用,是原來的默認設置。啟動時間限制90秒,關閉時間限制180秒。
啟動快速失敗保護的鈎去掉!
為了避免真的遇到很多錯誤時沒有提示,可以不關閉,只是把快速保護的保護范圍加大些,例如失敗數50次 時間段5分鍾 則關閉對應的程序。
“關閉時間限制180秒”是必須的,因為進程關閉的時間,原來為90秒限制,是默認值,如果進程關閉時間超過90秒,則認為超時,從而出現:進程關閉時間超過了限制 日志,所以,適當延長這個時間,可以避免這種錯誤
4.進程關閉時間超過了限制
原因:獨立進程的內存堆棧消耗完了,IIS不能創建更多的進程工作空間來處理
解決方法:
1. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC
2. 在Parameters鍵下新建一個DWORD項,名字為:UseSharedWPDesktop 值為1 重啟IIS
5.建議
a.新建應用程序池,不同的網站引用不同程序池。
b.新建計划,定時執行iis回收
Recyclepool.vbs 文件內容: appPoolName = WScript.Arguments(0) Set oWebAdmin = GetObject("winmgmts:root\WebAdministration") Set oAppPool = oWebAdmin.Get("ApplicationPool.Name='" + appPoolName + "'") oAppPool.Recycle set fso=createobject("scripting.filesystemobject") if (fso.fileexists("d:\appPool\recycleIISPool.log")) then '1-forreading,2-forwriting,8-appending set file=fso.opentextfile("d:\appPool\recycleIISPool.log",8,ture) else set file=fso.createtextfile( "d:\appPool\recycleIISPool.log",8,ture) end if 'write(x)寫入x個字符,writeline寫入換行,writeblanklines(n)寫入N個空行 file.writeline now&" 應用程序池“"&appPoolName &"”已經回收成功。" file.close Recyclepool.bat文件內容: cscript D:\appPool\recyclepool.vbs platweb
用vbs腳本及批處理文件,結合任務計划程序,保證在指定時間點執行IIS回收。配合windows計划任務解決IIS定時回收問題。