轉自:http://blog.csdn.net/dba_huangzj/article/details/7527543 一、 問題 : 1、SQL Server 所占用 內存 數量從啟動以后就不斷地增加: 首先,作為成熟的產品, 內存 溢出的機會微乎其微。對此要了解SQL SERVER與windows是如何協調、共享 內存 。并且SQL
1、SQL Server 所占用內存數量從啟動以后就不斷地增加:
首先,作為成熟的產品,內存溢出的機會微乎其微。對此要了解SQL SERVER與windows是如何協調、共享內存。并且SQL SERVER的內部對內存的管理機制。
2、在Windows 2003以上版本運行的SQL Server,內存使用量突然急劇下降:
內存是Sqlserver的生命線。在errorlog中,出現一下情況:
這類問題往往不是sql server導致的,而是Windows感覺到急迫的內存壓力,迫使sql server 釋放內存。
3、用戶在做操作時,遇到內存申請失敗:不是用戶想申請多少就有多少
4、內存壓力導致的性能下降:內存壓力是性能問題最常見的原因之一。
操作系統不缺內存不代表sql server不缺內存
默認情況下,windows進程有4G虛擬地址空間,2G給核心態(kernel mode),剩下的2G給用戶態(user mode)。這兩部分會嚴格區分。
任何一個用戶進程的地址空間分布圖:
方法1:在boot.ini文件中使用/3GB參數,可以在企業版的windows下講核心態降到1G,講用戶態升到3G。
方法2:使用Address Windowsing Extensions(地址空間擴展,awe),是一種允許32位應用分配64GB物理內存,并把視圖或窗口映射到2G虛擬地址空間的機制。不是所有的內存申請都使用awe,只有先reserve,再commit的內存調用才使用awe。
在檢查sql server內存使用情況時,首先要檢查windows層面的內存使用情況。
需要檢查的內容有:windows系統自身內存使用數量及內存分布。是否有內存壓力,壓力是否比較嚴重。甚至每個進程的內存使用情況。最后就是是否互相影響。
可以使用性能監視器實現。
Windows系統使用情況:
1、整體使用分析:
Committed bytes:
整個windows系統的內存總數,包括物理內存的數據和文件緩存中的數據。
Commit Limit:
整個windows系統能夠申請的最大內存數,等于物理內存加上文件緩存的大小。如果Commit Limit≈Committed bytes,說明系統內存接近極限。如果緩存文件不能自動增長,系統將不能提供更多的內存空間。
Available MBytes:
現在系統空閑的物理內存,直接反映windows層面有沒有內存壓力。
Page File:%Usage 和Page File:%Peak Usage:
反映緩存文件使用量的多少,數據在文件緩存中存得越多,說明物理內存數量和實際需求量的差距越大,性能也越差。
Pages/sec:
Hard Page Fault每秒需要從磁盤讀取或寫入的頁面數目。是Memory:pages input/sec + Memory:pages output/sec之和。
Memory:page faults/sec 是soft page fault 和 hard page fault的總和。但由于soft page fault 對性能影響不大,所以用處沒pages/sec那么有用。pages/sec不能長時間保持在一個比較高的值。
2、Windows系統自身內存使用情況:
Memory:cache bytes:
系統的working set ,也就是系統使用的物理內存數目。
Memory:System cache resident bytes (system cache):系統告訴緩存消耗的物理內存。
Memory:Pool paged resident bytes:頁交換區消耗的物理內存。
Memory:System Driver resident bytes:可調頁的設備驅動程序代碼消耗的物理內存。
Memory:System Code resident bytes:Ntoskrnl.exe中可調頁代碼消耗的內存。
3、System pool:Memory :pool Nonpaged bytes(非頁交換區)和Memory:pool paged resident bytes(頁交換區)
Process:%processor Time:目標進程消耗的CPU資源數,包括用戶態和核心態的時間。
Process:Page Faults/sec 目標進程上發生的PageFaults的數目。
Process:Handle Count 目標進程handle數據,如果進程內部有對象老是創建不及時回收,就會發生Thread Leak
Process:Pool Paged Bytes目標進程所使用的Paged Pool的大小。
Process:Pool Nonpaged Bytes目標進程所使用的Non-Paged pool大小。
Process:working set 某個進程的地址空間中,存放在物理內存的那部分。
Process:Virual Bytes:某個進程所申請的虛擬地址空間大小。
Process:Private bytes:某個進程提交了地址空間中非共享的部分。
內存永遠是最重要的系統資源。
Sqlserver有兩個重要的內存計數器:Total Server Memory 和Target Server Memory。
Total Server Memory:自己分配的Buffer pool 內存總和。
Target Server Memory:理論上能夠使用的最多內存數目。
原因:
1、windows在某種情況下申請了太多內核態內存,反而壓縮了用戶態可以使用的物理內存。
2、有些硬件驅動程序申請了太多內核態內存,也占用太多物理內存。
3、某些應用突然申請大量物理內存。
使用下面方法避免SQL SERVER 內存被急劇搶占:
1、開啟Lock page in memory功能
只有05/08企業版才有
2、使用sp_configure 設置sql 的MAX SERVER MEMORY。
3、升級新版本或者補丁。
4、升級硬件驅動。
兩條原則:
(1)Windows 系統和其他關鍵應用服務要有足夠的內存,不要在運行過程中因為內存不足,而搶SQL SERVER已經申請的內存。
(2)在滿足第一點的前提下,SQL SERVER使用盡可能多的內存,并保證內存使用數量的穩定性。
方法:
1、使用64位
2、專用服務器
3、設置SQL Server Max Server Memory
4、給SQL Server 啟動賬號賦予Lock Pages in memory權限。
5、“set working set size”不要使用。
1、Min Server Memory (sp_configure):最終由windows確定,不保證SQL Server使用最小物理內存數。
2、Max Server Memory(sp_configure):數據放在物理內存還是緩沖文件中,由windows決定。
3、Set Working Set Size (sp_configure):不要使用。
4、AWE Enalbed(sp_configure):對32位系統有意義。
5、Lock Pages in memory (企業版會自動開啟):有一定機會確保sql server的物理內存數。
Database Cache:存放數據頁的緩沖區。
各類Consumer:
Connection::默認4K
General:包含語句的編譯、范式化、每個鎖數據結構、事務上下文、表格和索引的元數據等。默認8K。
Query Plan:默認8k,
Optimizer:默認8k,
Utilities:像BCP、Log Manager、Parallel Queries、Backup的特殊操作。默認8k,
線程內存:進程內的每個線程分配0.5MB內存。存放線程的數據結構和相關信息。默認512K
第三方代碼申請的內存(COM,XP...)
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com