笔记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 --所以请永远不要使用