最近幾天武林網(wǎng)官網(wǎng)的的服務(wù)器總是出現(xiàn)w3wp.exe內(nèi)存占用率居高不下的問題,很是煩惱,因為服務(wù)器一直是開啟的memcache,對服務(wù)器的內(nèi)存要求占用比較多(WIN2008 PHP5.6環(huán)境安裝memcache擴展 開啟方法),經(jīng)過一段時間的摸索,小編給大家分享w3wp.exe內(nèi)存占用率過高的處理方法。
w3wp.exe是一個IIS進程,在IIS6下,經(jīng)常出現(xiàn)w3wp.exe的內(nèi)存及CPU占用不能及時釋放,從而導致服務(wù)器響應(yīng)速度很慢。
IIS的程序池默認回收間隔是1740分鐘(29小時),在自動回收過程中,應(yīng)用程序池將會清空,保留在內(nèi)存中的數(shù)據(jù)將會被清理(相當于IIS重啟)。對于互聯(lián)網(wǎng)應(yīng)用程序,為了減少數(shù)據(jù)庫服務(wù)器的負擔,也許會選擇將大量數(shù)據(jù)暫存在內(nèi)存中,回收會造成內(nèi)存數(shù)據(jù)丟失,如果沒有及時保存到數(shù)據(jù)庫中,可能導致應(yīng)用程序出問題。如果遇到系統(tǒng)使用高峰期,回收將可能導致一段時間應(yīng)用程序無響應(yīng)(出現(xiàn)假死狀態(tài)),給予用戶一種很不好的體驗。
在優(yōu)化應(yīng)用程序池之前,我們應(yīng)用先了解下程序池的幾個配置信息:
發(fā)生配置更改時禁止回收:如果為True,應(yīng)用程序池在發(fā)生配置更改時將不會回收。
固定時間間隔(分鐘):超過設(shè)置的時間后,應(yīng)用程序池回收,為0意味著應(yīng)用程序池不會按固定間隔回收。系統(tǒng)默認設(shè)置的時間是1740分鐘(29小時)。
禁用重疊回收:如果為true,將發(fā)生應(yīng)用程序池回收,以便在創(chuàng)建另一個工作進程之前退出現(xiàn)有工作進程。
請求限制:應(yīng)用程序池在回收之前可以處理的最大請求數(shù)。如果值為0,則表示應(yīng)用程序池可以處理的請求數(shù)沒有限制。
生成回收事件日志條目:每發(fā)生一次指定的回收事件時便產(chǎn)生一個事件日志條目,里面的明細設(shè)置不一一介紹。
問題分析:每1740分鐘(29小時)回收一次是否合理?
不太合理,這個周期內(nèi),有可能應(yīng)用程序處于訪問高峰期。因為每天的回收時間都是不一樣的,很有可能在高峰期回收,就會造成短時間內(nèi)網(wǎng)站訪問出現(xiàn)問題。因此,要避免最大程度的減少對用戶的影響,我們需要充分的分析應(yīng)用程序的訪問情況,例如哪個時間段是高峰,
哪個時間段訪問人數(shù)最少。了解到這些后,應(yīng)用程序部署人員就應(yīng)該設(shè)定固定的回收時間,例如一個網(wǎng)站凌晨兩點訪問人數(shù)是最少的,那么它可以設(shè)置“特定回收時間”在凌晨兩點,應(yīng)用程序池里面的特定時間是支持設(shè)定多個的,請注意。
降低 w3wp.exe 內(nèi)存占用率的解決方案
打開IIS服務(wù)管理器 -> 應(yīng)用程序池 -> 選擇網(wǎng)站對應(yīng)的應(yīng)用程序池 -> 點擊“正在回收”
在彈出的窗口設(shè)置特定回收時間(在此之前右鍵網(wǎng)站應(yīng)用程序池,選擇高級設(shè)置,將其固定時間間隔(分鐘)設(shè)置為0),并設(shè)置基于內(nèi)存的最大值,如下圖所示:
補充贈送:解決CPU占用過多
1、在IIS中對每個網(wǎng)站進行單獨的應(yīng)用程序池配置。即互相之間不影響。
2、在任務(wù)管理器中增加顯示PID字段。就可以看到占用內(nèi)存或者CPU最高的進程PID
3、在命令提示符下運行iisapp -a。注意,第一次運行,會提示沒有js支持,點擊確定。然后再次運行就可以了。這樣就可以看到PID對應(yīng)的應(yīng)用程序池。(iisapp實際上是存放在C:/windows/system32目錄下的一個VBS腳本,全名為iisapp.vbs,如果你和我一樣,也禁止了Vbs默認關(guān)聯(lián)程序,那么就需要手動到該目錄,先擇打開方式,然后選“Microsoft (r) Windows Based Script Host”來執(zhí)行,就可以得到PID與應(yīng)用程序池的對應(yīng)關(guān)系。)
4、到IIS中察看該應(yīng)用程序池對應(yīng)的網(wǎng)站,就ok了,做出上面的內(nèi)存或CPU方面的限制,或檢查程序有無死循環(huán)之類的問題。5、找出最消耗CPU的SQL語句進行優(yōu)化
-- 找出前50最耗CPU的SQL語法SELECT TOP 50qs.total_worker_time/qs.execution_count as [Avg CPU Time],SUBSTRING(qt.text,qs.statement_start_offset/2, (case when qs.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 else qs.statement_end_offset end -qs.statement_start_offset)/2) as query_text,qt.dbid, dbname=db_name(qt.dbid),qt.objectid FROM sys.dm_exec_query_stats qscross apply sys.dm_exec_sql_text(qs.sql_handle) as qtORDER BY [Avg CPU Time] DESC
新聞熱點
疑難解答
圖片精選