前兩天我的服務器突然告警提示我的内存占用過高,使用率高達94.3%。當時我就有點納悶了,服務器配置
互聯網服務器
是4核8G的,隻裝了4個應用程序,其中就有SQL SERVER2012,而且使用頻率也不高,怎麼會提示我内存使用率過高,難道是中毒了?在緊急排查服務器進程後發現是SQL SERVER Windows NT占用内存過高,僅這一個程序就占用50%的内存。
原來SQL Server對服務器内存的使用策略是用多少内存就占用多少内存,隻用在服務器内存不足時,才會釋放一點占用的内存,所以SQL Server 服務器内存往往會占用很高。我們可以通過DBCC MemoryStatus來查看内存狀态。
SQL SERVER運行時會執行兩種緩存:
1. 數據緩存:執行個查詢語句,SQL SERVER會将相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)加載到内存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁盤了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。
可以調用以下幾個DBCC管理命令來清理這些緩存:
DBCC FREEPROCCACHE --清除存儲過程相關的緩存
DBCC FREESESSIONCACHE --會話緩存
DBCC FREESYSTEMCACHE('All') --系統緩存
DBCC DROPCLEANBUFFERS --所有緩存
但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server并不會因此釋放掉已經占用的内存。SQL SERVER并沒有提供任何命令允許我們釋放不用到的内存。因此我們隻能通過動态調整SQL SERVER可用的物理内存設置來強迫它釋放内存。
解決Sqlserver内存占用過高的方法:
1、清除所有緩存 DBCC DROPLEANBUFFERS
2、調整SQLSERVER可使用的最大服務器内存。
在SQL管理器,右擊實例名稱
右擊實例名稱選擇屬性
在屬性實例屬性裡面找到内存選項
最大内存建議不超過系統内存的1/2
把最大内存改成合适的内存,确定後内存就會被強制釋放,然後重啟實例。再看看任務管理器,内存使用率就降下來啦。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!