笔记29-徐 Windows与SQLSERVER系统使用内存情况和合理配置SQLSERVER内存 --P166

笔记29-徐 Windows与SQLSERVER系统使用内存情况和合理配置SQLSERVER内存  --P166

  1 --Windows与SQLSERVER系统使用内存情况和合理配置SQLSERVER内存  --P166
  2 --性能监视器  perfmon
  3 --添加-》可用计数器-》Memory-》添加available MBytes和pages/sec
  4 
  5 --数据收集器集-》用户定义-》新建-》数据收集器集-》名称:SQLSERVER内存使用-》手动创建-》性能计数器-》
  6 --添加下面的性能计数器-》时间间隔15秒-》保存路径:C:\Users\Administrator\Desktop\SQLSERVER内存使用-》
  7 --保存并关闭-》选中刚才创建的数据收集器-》启动-》变成datacollector01   -》在用户定义下面 SQLSERVER内存使用 右键-》停止
  8 --或者在空白的地方-》右键-》停止
  9 
 10 --可以右键-》在用户定义下面 SQLSERVER内存使用-》属性-》更改数据收集器保存路径
 11 
 12 
 13 
 14 --committed bytes:整个Windows系统,包括Windows自身以及所有用户进程使用的内存总数
 15 
 16 --commit limit:整个Windows系统能够申请的最大内存数,其值等于物理内存加上文件缓存大小
 17 
 18 --available MBytes(重要):现在系统空闲的物理内存数。这个指标能够直接反映出Windows层面上有没有内存压力
 19 --跑在Windows2000上会把空闲内存用完知道剩下4MB~10MB。跑在Windows2003或以上就会留给
 20 --Windows多一点的物理内存
 21 
 22 
 23 --page file :%usage  page file:% peak usage
 24 --反应缓存文件使用量的多少,使用越多缓存,性能越差
 25 
 26 --pages /sec:每秒钟需要从磁盘上读取或写入的页面数目
 27 
 28 --soft page fault一般不会带来性能影响,因此一般不太关心
 29 
 30 
 31 --一个良好的系统,他要处理的数据应该比较长期地保存在物理内存里。如果频繁换页/换入换出
 32 --势必影响性能,pages/sec不能长时间保持在一个比较高的值
 33 
 34 --对于一台SQL服务器,如果available MBytes长期小于10MB,说明物理内存不太够
 35 --pages/sec 物理内存不足也会做成频繁换页/换入换出 pages/sec不能长时间保持在一个比较高的值
 36 
 37 --Windows系统自身内存使用情况------------------------------------------------------------------
 38 --一个32位Windows系统,正常内存使用大概几百MB
 39 --64位Windows系统大概1GB~2GB
 40 
 41 
 42 --如果发生内存泄漏(一般由硬件驱动造成),Windows会用到几个GB甚至十几GB,反过来挤压应用的内存
 43 
 44 
 45 
 46 --memory :cache bytes
 47 --系统的working set,也就是系统使用的物理内存数目,包括高速缓存,页交换区,可调页的ntoskrnl.exe
 48 --和驱动程序代码,以及系统映射视图
 49 
 50 
 51 --cache bytes计数器是下面几个计数器的和:system cache resident bytes,system driver resident bytes
 52 --,system code resident bytes ,pool paged resident bytes
 53 
 54 --system cache resident bytes:系统高速缓存消耗的物理内存。高速缓存的主要功能是提高文件读写的速度
 55 
 56 --,pool paged resident bytes:页交互区消耗的物理内存
 57 
 58 --system driver resident bytes:可调页的设备驱动程序代码消耗的物理内存
 59 
 60 --system code resident bytes:ntoskrnl.exe中可调页代码消耗的内存
 61 
 62 --system pool 内存池
 63 --如果两个重要的内存池 内存出现泄漏,或者空间用尽,Windows会出现奇怪不正常的行为,
 64 --进而影响SQL稳定运行。所以需要检查这两个内存池
 65 
 66 --pool nonpaged bytes 非换页内存池
 67 
 68 --pool paged resident bytes 换页内存池
 69 
 70 
 71 
 72 -------单个process使用情况------------------------------------------------------------------------
 73 
 74 --常见场景:available MBytes看出服务器的内存基本用尽,但是从cache bytes看Windows自己没有
 75 --使用多少。现在要开始分析应用程序的内存使用了
 76 
 77 --在选择对象的实例里面要每个进程都要添加进计数器里面,不要选择_Total
 78 --SQL的进程是sqlservr
 79 
 80 --%processor time:是目标进程消耗的CPU资源数,包括用户态和核心态的时间
 81 --page faults/sec:是目标进程上发生的page faults的数目
 82 --handle count:目标进程handle(指向object指针)数目句柄数。如果进程内部有对象老是创建,不及时
 83 --回收,就会发生handle leak
 84 
 85 --thread count:目标进程的线程数目。如果进程老是创建新线程,不释放老线程,就会发生thread leak
 86 
 87 --pool paged bytes:是目标进程所使用的paged pool大小
 88 
 89 --pool nonpaged bytes:是目标进程所使用的non-paged pool大小
 90 
 91 --working set:某个进程的地址空间,存放在物理内存的那一部分
 92 
 93 --virtual bytes:某个进程所申请的虚拟地址空间大小,包括reserved memory 和committed memory
 94 
 95 --private bytes:某个进程提交了的地址空间commited memory中,非共享部分
 96 
 97 
 98 --假设有processA 和processB,他们的虚拟地址空间都分成两部分,核心态和用户态
 99 --核心态是由Windows控制,所有进程共享。
100 
101 --processA
102 --committed memory :1,2,3,4,7
103 --reserved memory:8
104 --shared memory:通过特殊API申请的内存,processA和processB都能够访问
105 
106 --物理内存physical memory:1,3,4,d,7,9,b,c
107 --缓存文件page file:2,y
108 
109 --系统核心态内存
110 --system working set=x
111 
112 --检查计数器主要找到以下:
113 --使用内存最多的进程
114 --内存使用量在不断增长的进程
115 --出现问题的那个时间段,内存使用数量发生过突变(增或降)的进程
116 --这些可以通过working set  private bytes得到初步答案
117 
118 --如果内存足够,系统不需要经常到硬盘找数据,读动作会变少,内存不够,系统会繁忙,内存是因,磁盘是果
119 
120 --如果一个进程的用户态CPU时间比较高,一般说明他没有遇到其他瓶颈,包括内存和磁盘
121 --他正在全力运行。
122 --如果内存有瓶颈,一般用户态的CPU时间不会很高,但是核心态的CPU时间反而会升高,因为
123 --这时候要做paging动作,所带来的产品I/O动作必须运行在核心态下,所以这时候CPU总体使用率
124 --不会为0,但一般也不会超过50%
125 
126 --分析一台服务器的内存使用之前,要注意下面几点:
127 
128 --1、首先确认服务器是32位还是64位,SQLSERVER是32位还是64位
129 --因为SQL由于其32位地址空间限制,无法再申请更多内存,所以会存在瓶颈。
130 
131 --2、观察计数值的趋势和相互之间的关系,切忌用一两个值就作出结论
132 --一般系统有内存瓶颈,磁盘会繁忙,paging动作会比较多
133 
134 --3、分析从内存检查使用开始
135 --再三强调,内存决定服务器的整体性能,是对性能影响最大的一个系统资源。作为一个最佳经验,
136 --建议始终从内存检查开始
137 
138 
139 --4、检查Windows系统自己的内存使用
140 --64位系统Windows会使用更多的内存,
141 --还有system cache resident bytes下降导致Windows释放占有的物理内存。
142 --看一下Windows的working set
143 
144 
145 
146 --5、观察应用进程的内存使用
147 --系统是32位还是64位,
148 --boot.ini是否有/3GB参数,
149 --是否开启了AWE功能
150 
151 
152 
153 --6、分析内存使用对CPU和I/O使用的影响
154 --paging是否较多
155 
156 
157 
158 --Windows和SQL内存使用关系
159 
160 --在绝大多数情况下,SQL会约束自己的内存使用量,不会消耗完系统的内存资源
161 
162 --Windows2000中,SQL根据服务器的活动来增大或收缩缓冲区高速缓存,以使可用物理内存
163 --保持在4MB到10MB之间。
164 
165 --Windows2003,SQL使用内存通知API QueryMemoryResourceNotification
166 --确定缓冲池何时可以继续分配内存。当Windows缺内存时,SQL通过这个API能够知道
167 --决定合适能够释放内存
168 
169 
170 --两个逻辑内存空间大小:total server memory  target server memory
171 --SQL启动的时候会检查AWE ,SP_CONFIGURE里的max server memory 当前服务器可用内存数
172 
173 
174 --SQL内存使用量突然下降
175 --Windows2000时,SQL会用到系统只剩4MB~10MB的内存,对于其他应用例如IIS 会影响较大
176 
177 --Windows2003时,改用API QueryMemoryResourceNotification来确认Windows是否有内存压力
178 --Windows内存管理也有改变,但是有时候SQL的内存会被压缩很多
179 
180 
181 --(1)Windows在某种情况下申请了太多内核态内存,反过来压缩了用户态可以使用的物理内存(SQL使用用户态内存)
182 
183 --(2)有些硬件驱动申请了太多内核态内存,也占用了太多物理内存
184 
185 --(3)某些应用申请了大量物理内存,使得Windows上内存紧张
186 
187 
188 --(1)开启lock page in memory功能
189 --SQL2005/2008 企业版才有,使用启动帐户使用具有lock page in memory的权限
190 --组策略-》计算机配置-》Windows设置-》安全设置-》本地策略-》用户权限分配-》锁定内存页
191 --锁定内存页默认有system 和administrator 启动帐户是local system
192 --但是只是锁住用户态,如果Windows内存不够,增加核心态内存,也会挤掉用户态内存
193 
194 
195 --(2)sp_configure 设置max server memory
196 
197 --(3)升级Windows2003到SP2,或者使用Windows2008 ,这些版本Windows管理内存机制有了调整
198 
199 
200 --(4)升级硬件驱动程序,或者联系微软技术服务,帮忙检查是不是硬件方面问题引起
201 
202 
203 
204 
205 -----------------------合理配置SQLSERVER内存----------------------------------------------------
206 --(1)如果服务器支持64位操作系统,没有特殊理由的话,请安装64位系统。这样SQL能够有效地使用
207 --大于2GB的内存。如果一定要用32位系统,务必将AWE打开。但是不要用/3GB这个开关
208 
209 --(2)尽量使服务器专门供数据库使用,不要将其他服务(例如IIS,中间层应用服务等)安装在同一台
210 --机器上。多个生产应用服务在同一台机器上运行,会大大增加维护成本
211 
212 --(3)建议设置SQLSERVER max server memory,以确保Windows有足够的内存供系统本身使用。
213 --一台4GB机器,建议预留1GB,设置SQLSERVER max server memory为2.8GB
214 --一台8GB机器,建议预留2GB,设置SQLSERVER max server memory为6GB
215 --一台大于8GB的64位机器,建议预留3GB~4GB。
216 --如果一台服务器上还有其他应用使用内存,也要扣除他们的内存使用数
217 
218 --一般设置SQLSERVER min server memory意义不大
219 
220 --(4)如果是企业版SQLSERVER,建议赋给SQL启动帐号lock page in memory的权限
221 
222 --(5)“set working set size” 这个SQL参数在现在的Windows上不能起到固定SQL物理内存的作用,
223 --所以请永远不要使用

 

posted @ 2013-07-27 15:55 桦仔 阅读(...) 评论(...) 编辑 收藏