SQL Server内存性能分析

内存概念:数据库

Working Set = Private Bytes + Shared Memory缓存

Working Set:某个进程的地址空间中,存放在物理内存的那一部分服务器

Private Bytes:某个进程提交的地址空间(Commited Memory)中,非共享的部分数据库设计

Shared Memory:对多个进程可见的内存,或存在于多个进程的虚拟地址空间。例如若是两个进程使用相同的DLL,只要该DLL代码装入内存一次,其余全部映射这个DLL的进程只要共享这些代码就能够了ide

 

Virtual Address Space :2的64次方。Windows会自行决定何时放在Physical Memory,何时放在Paging file性能

Reserved Memory:应用程序会先Reserve一块内存的地址空间优化

Committed Memory:将Reserve的内存页面正式Commit使用,Commit的页面会最终转换到Physical Memory中的有效页面spa

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动做)
Pages/sec = Memory:Pages Input/sec + Pages Output/sec

Page File:%Usage和Page File:%Peak Usage :反映Paging File使用量的多少。数据在Paging File中存的越多,说明Physical Memory和实际需求量差距越大,性能越差 

=================================================================================

Windows系统自身内存使用状况:
通常状况下在64为机器上,使用1-2GB左右。若是因为一些硬件驱动形成了内存泄露,则Windows可能会占用到几GB甚至更多的内存。

系统的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:Working Set

Process:Private Bytes

Process:Virtual Bytes:某个进程所申请的Virtual Address Space,包括Reserved Memory和Committed Memory

若是系统内存有瓶颈,磁盘通常也会很忙,paging也会较多;但若是磁盘很忙,可是paging不高,就不能说明系统内存有瓶颈

 

=================================================================================

SQL Server内存:
Traget Server Memory:SQL Server在理论上可以使用的最多的内存量。若是在SQL Server中设置了 Max Server Memory,则会使用该值做为内存上限

Total Server Memory:SQL Server本身分的代码申请的Buffer Pool空间大小,全部的Database Cache和大部分的Consumer(Connection、Query Plan、
Optimizer等)都保存在Buffer Pool中,对于一些特别长的语句的Query Plan、Optimizer等内存使用一部分的Multi-Page

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的总体内存使用量。 
 
Traget Server Memory和Total Server Memory都是指逻辑上的内存空间大小,而不是物理内存空间大小。数据是存放在page file仍是物理内存中是由Windows决定的。 

SQL Server内存使用分类:

按申请方式分类:

对Database Cache,会先Reserve,再Commit。其余的全部内存使用,基本都是直接Commit,都是Stolen(Memory Leak)


按申请大小分类:

对于全部小于或等于8KB的,直接分配给一个页面:8KB。全部这些页面都集中管理,这块内存被称为Buffer Pool,一次一个页面的分配被称为Single page Allocation  

对于大于8KB的内存申请,会被集中在另一个区域,成为Multi-Page(或MemToLeave),这种分配称为Multipl Page Allocation

 


SQL Server性能计数器使用:

Memory Manager:监视服务器内存整体使用状况

Ttotal Server Memory(KB)

Traget Server Memory(KB)
Optimizer 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会维持在一个稳定的值 
 
Lazy writes/sec:每秒被缓冲区管理器的Lazy writer写入的缓冲区数。Lazy writer是一个系统进程,用于呈批刷新脏的老化的缓冲区(包括更改的缓冲区,必须将这些更改写回磁盘,才能将缓冲区重用于其余页),并使他们可用于用户进程。当SQL Server感受到内存压力时,就会将最久没有被重用到的数据页和执行计划清理出内存。这些数据页和执行计划,就被称为“老化的缓冲区”,这个清理动做就是由Lazy writer完成的。因此若是SQL Server内存压力不大,Lazy writer就不会被常常触发。若是被常常触发,就应该是有内存瓶颈 
  
Page life expentancy:页若不被引用,将在缓冲池中停留的秒数。若是SQL Server没有新的内存需求,或者有空余的空间来完成新的内存需求,那么Lazy writer就不会被触发,页面会一直放在缓冲池中,Page life expentancy就会维持在一个较高的值。若是SQL Server出现了内存压力,Lazy writer就会被触发,Page life expentancy也会忽然降低。因此若是Page life expentancy老是高高低低,SQL Server应该就出现了内存瓶颈 
 
Page reads/sec:每秒发出的物理数据库页读取数。此统计信息显示的是全部数据库间的物理页读取总数。若是用户访问的数据都缓存在了内存里,那么SQL Server就不须要从磁盘读取页面,不准须要作任何的Page reads。当SQL Server须要读取这些页面时,必需要为他们腾出内存空间。因此当Page reads/sec高时,通常Page life expentancy会降低,Lazy writes/sec会上升 
因为物理I/O开销大,Page Reads动做必定会影响SQL Server性能,能够经过使用更大的数据缓存、智能索引、更有效的查询或更改数据库设计等方法下降Page Reads

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.sysprocesses

select * from sys.dm_os_wait_stats

select *from sys.dm_exec_requests

 

=================================

计数器(2分钟):

Processor\% Privileged Time
Processor\% Processor Time
Memory\Available Mytes
PhysicalDisk\Avg. Disk sec/Read
PhysicalDisk\ Avg. Disk sec/Write
SQLServer:SQL Statistics\Batch Requests/sec
SQLServer:Memory Manager\Target Server Memory (KB)
SQLServer:Memory Manager\Total Server Memory (KB)

Process(w3wp)\Working SetProcess(w3wp)\Private Bytes

相关文章
相关标签/搜索