内存概念: Working Set = Private Bytes + Shared Memory Working Set:某个进程的地址空间中,存放在物理内存的那一部分 Private Bytes:某个进程提交的地址空间(Commited Memory)中,非共享的部分 Shared Memory:对多个进程可见的内存,或存在于多个进程的虚拟地址空间。例如如果两个进程使用相同的DLL,只要该DLL代码装入内存一次,其他所有映射这个DLL的进程只要共享这些代码就可以了
Virtual Address Space :2的64次方。Windows会自行决定什么时候放在Physical Memory,什么时候放在Paging file Reserved Memory:应用程序会先Reserve一块内存的地址空间 Committed Memory:将Reserve的内存页面正式Commit使用,Commit的页面会最终转换到Physical Memory中的有效页面 Memory Leak:一直不断的Reserve或Commit内存资源,即使不再被使用也不会释放给其他用户使用
Page Fault:访问一个存放于Viratul Address Space,但不存在于物理内存(Working Set)的页面,就会发生Page Fault。如果目标页面存放于硬盘(例如Pageing File),则会进行硬盘读写,称之为Hard Fault。如果已经存在在物理内存中,但是还没有直接放在这个进程的Working Set下,则需要Windows重新定向一次,不会带来硬盘读写,称之为Soft Fault。由于Soft Fault一般不会带来性能影响,因此一般不使用该计数器,而是使用Pages/sec Committed Bytes:整个Windwos系统(包括Windows自身及其所有用户进程)使用的内存总数,包括Physical Memory和Paging file中的数据 Pages/sec:Hard Page Fault每秒钟需要从磁盘上读取或写入的页面数目(包括Windows和所有应用进程的所有磁盘Paging动作) Page File:%Usage和Page File:%Peak Usage :反映Paging File使用量的多少。数据在Paging File中存的越多,说明Physical Memory和实际需求量差距越大,性能越差 ================================================================================= Windows系统自身内存使用情况: 系统的Working Set,也就是系统使用的物理内存量,包括高速缓存、页交换区、可调页的ntoskrnl.exe、驱动程序代码和系统映射图等 Cache Bytes:系统使用的物理内存数目 Cache Bytes = System Cache Resident Bytes + System Driver Resident Bytes + System Code Resident Bytes + Pool Paged Resident Bytes Memory:System Cache Resident Bytes(System Cache):系统高速缓存消耗的物理内存。高速缓存的主要功能是提高文件读写速度(例如读写超大文件) 赋予SQL服务账号“Lock Pages in Memory”权限,以便SQL Server可以将自己所申请的内存锁定放在物理内存中,企业版自动启用该功能。但是NonbufferPool的内存不受限制 SQL Server作为一个用户态为主的应用程序,还是会受限于核心态。如果核心态里发出内存要求,SQL Server就会被迫把自己的内存释放出来。用户态永远也抢不过核心态。 ================================================================================= 检查某个进程的内存使用情况: Process:Private Bytes Process:Virtual Bytes:某个进程所申请的Virtual Address Space,包括Reserved Memory和Committed Memory 如果系统内存有瓶颈,磁盘一般也会很忙,paging也会较多;但如果磁盘很忙,但是paging不高,就不能说明系统内存有瓶颈
================================================================================= SQL Server内存: Total Server Memory:SQL Server自己分的代码申请的Buffer Pool空间大小,所有的Database Cache和大部分的Consumer(Connection、Query Plan、
Buffer Pool = Max Server Memory 或 SQL physical memory-Multi-page Max Server Memory是Buffer Pool的上限,但不是SQL Server所有内存使用的上限。SQL Server内存的使用包括Buffer Pool和MemToLeave,所以SQL Server实际内存使用量一定大于Max Server Memory。但在正常情况下,MemToLeave的使用会远小于Buffer Pool,控制好Buffer Pool,基本上就控制住了SQL Server的整体内存使用量。 SQL Server内存使用分类: 按申请方式分类: 对Database Cache,会先Reserve,再Commit。其他的所有内存使用,基本都是直接Commit,都是Stolen(Memory Leak)
对于所有小于或等于8KB的,直接分配给一个页面:8KB。所有这些页面都集中管理,这块内存被称为Buffer Pool,一次一个页面的分配被称为Single page Allocation 对于大于8KB的内存申请,会被集中在另外一个区域,成为Multi-Page(或MemToLeave),这种分配称为Multipl Page Allocation
Memory Manager:监视服务器内存总体使用情况 Ttotal Server Memory(KB) Traget Server Memory(KB) SQL Cache Memory(KB):服务器正在用于动态SQL Server高速缓存的动态内存总数 Lock Memory(KB):服务器用于锁的动态内存总量 Connection Memory(KB):服务器正在用来维护连接的动态内存总量 Granted Workspace Memory(KB):当前给予执行哈希、排序、大容量复制和索引创建等操作进程的内存总量 Memory Grants Pending:等待工作空间内授权的进程总数。如果该值不等于0,就说明当前有一个用户的内存申请由于内存压力而被延迟。一般来讲,这就意味着有比较严重的内存瓶颈
Buffer Manager:用于监视内存如何使用 Buffer Cache Hit Ratio:在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分比。经过很长时间后,该比率的变化应该很小,基本应该在99%以上。如果小于95%,通常就有了内存不足的问题。可以通过增加SQL Server的可用内存来提高 Database Pages:缓冲池中有数据库内容的页数。也就是所谓的Database Cache的大小 Free pages:所有空闲可用的总页数。当这个值降低是就说明SQL Server正在分配内存给一些用户。当这个值下降到比较低的值时(例如只剩几百个page了),SQL Server就会开始做Lazy Write,把一些内存让出来,所以该值一般不会为0.但如果该值反复降低,就说明内存存在瓶颈。一个没有内存瓶颈的SQL Server的Free Pages会维持在一个稳定的值 Page writes/sec:每秒执行的物理数据库页写入数。该值和内存使用没有什么关系,和Checkpoint pages/sec一样,更用户的修改量有关 Checkpoint pages/sec:由要求刷新所有脏页的检查点或其他操作每秒刷新到磁盘的页数。该值和内存压力没有直接关系,和用户行为有关。如果用户操作主要是读,Checkpoint值就比较小。如果很多操作都是Insert/Update/Delete,name内存中修改过的数据脏页就会比较多,每次Checkpoint的量也会较大。主要用来分析磁盘I/O Stolen Pages:用于非Database Pages(包括执行计划缓存)的页数。这里就是Stolen Memory在Buffer Pool里的大小 Target Pages:缓冲池中理想的页数,乘以8KB,就应该是Target Server Memory的值 Total Pages:缓冲池中的页数(包括数据库页、可用页和Stolen页)乘以8KB,就应该还是Total Server Memory的值
SQL性能分析步骤: 1)当内存出现瓶颈时,会出现大量的paging动作,磁盘也就会很繁忙。所以要先解决内存瓶颈,才能降低I/O 2)分析磁盘性能是否正常,读/写是否已达到预期值,是读还是写繁忙 3)查看引起高I/O的操作类型(Page Reads、Page Writes、Lazy Writes、Checkpoints、Log Writes等)
动态性能视图: select * from sys.dm_os_wait_stats select *from sys.dm_exec_requests
================================= 计数器(2分钟): Processor\% Privileged Time Process(w3wp)\Working Set
|
|