sqlservr.exe佔用大量內存

SQL Server是如何使用內存

最大的開銷一般是用於數據緩存,如果內存足夠,它會把用過的數據和覺得你會用到的數據統統扔到內存中,直到內存不足的時候,才把命中率低的數據給清掉。所以一般我們在看statistics io的時候,看到的physics read都是0。其次就是查詢的開銷,一般地說,hash join是會帶來比較大的內存開銷的,而merge join和nested loop的開銷比較小,還有排序和中間表、遊標也是會有比較大的開銷。最後我們來看查詢的開銷,這個開銷顯然是越低越好,因爲我們不能從中得到好處,相反,使用了越多的內存多半意味着查詢速度的降低。所以我們一般要避免中間表和遊標的使用,在經常作關聯和排序的列上建立索引。

我們先來看數據緩存對性能的影響,如果系統中沒有其它應用程序來爭奪內存,數據緩存一般是越多越好,甚至有些時候我們會強行把一些數據存儲在高速緩存中。服務器如果還有其它應用程序,雖然在需要的時候MS SQL會釋放內存,但是線程切換、IO等待這些工作也是需要時間的,所以就會造成性能的降低。sqlservr.exe 是很喫內存的,如果不控制的話,他會佔光所有的物理內存,這樣我們就必須設置MS SQL的最大內存使用。

降低 sqlservr.exe 內存佔用率的解決方案:

1、一般情況下都是SQL語句優化的不夠好,或者緩存方案使用不當造成,建議儘可能優化SQL語句以及使用合理的緩存方案。

2、優化網站程序,少用或不用session、cache、application之類的緩存方案,還有就是翻頁處理不好也是會佔很多內存。

3、設置最大服務器內存:打開SQL Server Management Studio,右鍵服務器SQL Server -> 屬性 -> 內存 -> 設置最大服務器內存,這個可根據服務器配置以及需求而定,本例以2G內存爲例,設置爲物理內存的60%。

如果內存大於或者等於4G的,我一般這麼設置(總內存單位爲GB):

初始值=(總內存-(總內存/8)-2)*1024
EXEC sys.sp_configure N'max server memory (MB)', N'初始值'
GO
RECONFIGURE WITH OVERRIDE
GO
先預留1GB給OS
4~16GB RAM,則每4GB留1GB,
16GB RAM+,則每8GB留1GB
然後根據MemoryAvailable Mbytes的值(建議在300MB左右),再逐漸調高MAX Memory Value。

 限制服務器內存後報錯

程序報錯:資源池 'default' 沒有足夠的系統內存來運行此查詢

可以嘗試通過更新數據庫的統計表信息解決,執行以下的SQL語句即可:

EXEC sp_updatestats

簡單理解IIS應用程序池

w3wp.exe是一個IIS進程,在IIS6下,經常出現w3wp.exe的內存及CPU佔用不能及時釋放,從而導致服務器響應速度很慢。

IIS的程序池默認回收間隔是1740分鐘(29小時),在自動回收過程中,應用程序池將會清空,保留在內存中的數據將會被清理(相當於IIS重啓)。對於互聯網應用程序,爲了減少數據庫服務器的負擔,也許會選擇將大量數據暫存在內存中,回收會造成內存數據丟失,如果沒有及時保存到數據庫中,可能導致應用程序出問題。如果遇到系統使用高峯期,回收將可能導致一段時間應用程序無響應(出現假死狀態),給予用戶一種很不好的體驗。

在優化應用程序池之前,我們應用先了解下程序池的幾個配置信息:

發生配置更改時禁止回收:如果爲True,應用程序池在發生配置更改時將不會回收。 
固定時間間隔(分鐘):超過設置的時間後,應用程序池回收,爲0意味着應用程序池不會按固定間隔回收。系統默認設置的時間是1740分鐘(29小時)。
禁用重疊回收:如果爲true,將發生應用程序池回收,以便在創建另一個工作進程之前退出現有工作進程。 
請求限制:應用程序池在回收之前可以處理的最大請求數。如果值爲0,則表示應用程序池可以處理的請求數沒有限制。 
生成回收事件日誌條目:每發生一次指定的回收事件時便產生一個事件日誌條目,裏面的明細設置不一一介紹。

問題分析:每1740分鐘(29小時)回收一次是否合理?

不太合理,這個週期內,有可能應用程序處於訪問高峯期。因爲每天的回收時間都是不一樣的,很有可能在高峯期回收,就會造成短時間內網站訪問出現問題。因此,要避免最大程度的減少對用戶的影響,我們需要充分的分析應用程序的訪問情況,例如哪個時間段是高峯,

哪個時間段訪問人數最少。瞭解到這些後,應用程序部署人員就應該設定固定的回收時間,例如一個網站凌晨兩點訪問人數是最少的,那麼它可以設置“特定回收時間”在凌晨兩點,應用程序池裏面的特定時間是支持設定多個的,請注意。 

降低 w3wp.exe 內存佔用率的解決方案

打開IIS服務管理器 -> 應用程序池 -> 選擇網站對應的應用程序池 -> 點擊“正在回收” 

在彈出的窗口設置特定回收時間(在此之前右鍵網站應用程序池,選擇高級設置,將其固定時間間隔(分鐘)設置爲0),並設置基於內存的最大值,如下圖所示:

 

解決CPU佔用過多

1、在IIS中對每個網站進行單獨的應用程序池配置。即互相之間不影響。
2、在任務管理器中增加顯示PID字段。就可以看到佔用內存或者CPU最高的進程PID
3、在命令提示符下運行iisapp -a。注意,第一次運行,會提示沒有js支持,點擊確定。然後再次運行就可以了。這樣就可以看到PID對應的應用程序池。(iisapp實際上是存放在C:windowssystem32目錄下的一個VBS腳本,全名爲iisapp.vbs,如果你和我一樣,也禁止了Vbs默認關聯程序,那麼就需要手動到該目錄,先擇打開方式,然後選“Microsoft (r) Windows Based Script Host”來執行,就可以得到PID與應用程序池的對應關係。)
4、到IIS中察看該應用程序池對應的網站,就ok了,做出上面的內存或CPU方面的限制,或檢查程序有無死循環之類的問題。

5、找出最消耗CPU的SQL語句進行優化

-- 找出前50最耗CPU的SQL語法
SELECT TOP 50
qs.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 qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Avg CPU Time] DESC

轉自:http://t.zoukankan.com/GarsonZhang-p-10514892.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章