七、内存优化(4)性能计数器

一、Windows的内存计数器

1. 操作系统的整体内存使用情况

(1)Committed Bytes

  反映整个Windows系统的内存用量,包括Windows自身及所有用户进程使用的内存总数,包括物理内存里的数据和分页缓存文件中的数据。


(2)Commit Limit

  反映整个Windows系统能够申请的最大内存数,其值等于物理内存加上文件缓存的大小。

  如果Committed Bytes已经接近或等于Commit Limit,表明系统的内存使用已经接近极限。如果缓存文件不能自动增长,系统将不能提供更多的内存空间。


(3)Available MBytes

  该值是当前系统空闲的物理内存量,直接反映出Windows系统是否有内存压力。如果此值长期小于100MB,一般来说物理内存是不太够的。


(4)Page File:% Usage 和 Page File:% Peak Usage

  反映缓存文件使用量的多少。数据在缓存文件中存得越多,说明物理内存数量和实际需求量的差距越大,性能也越差。


(5)Pages/sec

  如果在缓冲区中未能命中,就需要去物理内存的其它区域寻找,如果找到了,就是一个Soft Page Fault;如果在缓存文件中找到,就是一个Hard Page Fault。Pages/sec反映Hard Page Fault 表示每秒钟需要从磁盘上Paging动作(读取或写入)的页面数量。

  一共有下列几个相关的计数器,计算公式为:

  Memory:Page Faults/sec = Soft Page Fault + Hard Page Fault

  Memory:Page/sec = Memory:Pages Input/sec + Memory:Pages Output/sec

  对于一个调度良好,有足够内存资源的系统来讲,所需的数据尽量长期保存在物理内存里,即使发生Soft Page Fault一般也不会带来性能影响(因此一般不必关心Page Faults/sec计数器)。如果频繁地被换进换出(Page in/Page Out),势必会严重影响性能。


(6)综合分析

  作为DBA,应当综合考量上述计数器的值。如果Committed Bytes值长期接近Commit Limit值,可能需要增加内存。通过Page File:% Usage 和 Page File:% Peak Usage 查看有多少数据实际上是缓存在硬盘上的缓存文件里。通过Available MBytes的值,可以了解系统还有多少空闲的物理内存可被使用。再看Pages/sec的值,较高的值反映了系统因为物理内存不足而频繁使用缓存文件。



2. 操作系统自身的内存使用情况

  一般来讲,Windows正常使用的内存都在2GB以下。如果遇到一些特殊的情况,例如Windows在做一些特殊的操作,或者Windows发生内存泄露,导致Windows自身将耗用几GB甚至十几GB的内存,直接挤压应用程序的物理内存。因此,DBA还需要通过以下计数器查看Windows自身的内存使用情况。

(1)Memory: Cache Bytes

  操作系统的工作集使用的物理内存。包括高速缓存、页交换区、可调页的ntoskrnl.exe和驱动程序代码,以及系统映射视图等。它的计算公式是:

  Memory: Cache Bytes = Memory: System Cache Resident Bytes + Memory: Pool Paged Resident Bytes + Memory: System Driver Resident Bytes + Memory: System Code Resident Bytes


(2)Memory: System Cache Resident Bytes (System Cache)

  系统高速缓存消耗的物理内存。


(3)Memory: Pool Paged Resident Bytes

  页交换区消耗的物理内存。


(4)Memory: System Driver Resident Bytes

  可调页的设备驱动程序代码消耗的物理内存。


(5)Memory: System Code Resident Bytes

  ntoskrnl.exe中可调页代码消耗的物理内存。



3. SQL Server进程的内存使用情况

  可以查看每个进程的内存使用情况。SQL Server的进程名字是sqlservr。

211149252.png


  查看该进程的以下计数器:

(1)% Processor Time

  是所有进程线程使用处理器执行指令所花的时间百分比,包括用户态和核心态的时间。指令是计算机执行的基础单位。线程是执行指令的对象,进程是程序运行时创建的对象,每个运行的进程至少有一个线程。此计数包括处理某些硬件间隔和陷阱条件所执行的代码。


(2)Working Set

  指这个进程的 Working Set 中的当前字节数,包含Shared Pages。Working Set 是在进程中被线程最近触到的那个内存页集。如果计算机上的可用内存处于阈值以上,即使页不在使用中,也会留在一个进程的 Working Set中。当可用内存降到阈值以下,将从 Working Set 中删除页。如果需要页时,它会在离开主内存前软故障返回到 Working Set 中。

  Working Set - Private 仅用于这个进程并且不共享也不能为其他进程共享的专用显示作业集的大小。

  Working Set Peak 指在任何时间这个在进程的 Working Set 的最大字节数。


(3)Virtual Bytes 和 Private Bytes

  Virtual Bytes 指进程申请的虚拟地址空间大小,包括Reserved Memory 和 Committed Memory。使用虚拟地址空间不一定是指对磁盘或主内存页的相应的使用。虚拟空间是有限的,可能会限制处理加载数据库的能力。

  Private Bytes 指这个进程不能与其他处理共享的、已分配的当前字节数。


(4)Page Faults/sec

  指在这个进程中执行线程造成的页面错误出现的速度。当线程引用了不在主内存工作集中的虚拟内存页即会出现 Page Fault。如果它在备用表中(即已经在主内存中)或另一个共享页的处理正在使用它,就会引起无法从磁盘中获取页。


(5)Handle Count 和 Thread Count

  Handle Count 指由这个进程现在打开的句柄(指向Object的指针)总数。这个数字等于这个进程中每个线程当前打开的句柄的总数。如果进程内部有对象老是创建,不及时回收,就会造成Handle Leak。

  Thread Count 指在这次进程中正在活动的线程数目。如果进程总是创建新线程,不释放旧的线程,就会造成Thread Leak。


(6)Pool Paged Bytes 和 Pool Nonpaged Bytes

  Pool Paged Bytes 指在分页池中的字节数,分页池是系统内存(操作系统使用的物理内存)中可供对象(在不处于使用时可以写入磁盘的)使用的一个区域。Memory:Pool Paged Bytes 的计数方式与 Process:Pool Paged Bytes 的方式不同,因此可能不等于 Process:Pool Paged Bytes\_Total。这个计数器仅显示上一次观察的值;而不是一个平均值。

  Pool Nonpaged Bytes 指在非分页池中的字节数,非分页池是指系统内存(操作系统使用的物理内存)中可供对象(指那些在不处于使用时不可以写入磁盘上而且只要分派过就必须保留在物理内存中的对象)使用的一个区域。Memory:Pool Nonpaged Bytes 的计数方式与 Process:Pool Nonpaged Bytes 的计数方式不同,因此可能不等于 Pool Nonpaged Bytes\\_Total。 这个计数器仅显示上一次观察的值;而不是一个平均值。



二、SQL Server的内存计数器

  请参考《SQL Server 2012 内存计数器的变化》 http://jimshu.blog.51cto.com/3171847/991313



三、监视内存使用量

  若要监视 SQL Server 使用的内存量,请检查下列性能计数器:

(1)Process: Working Set

  此计数器显示进程所用的内存量,即某个进程的地址空间中,存放在物理内存的那一部分。如果此内存量一直小于 min server memory 和 max server memory 服务器选项设置的内存量,则 SQL Server 被配置为使用过多内存。


(2)SQL Server:Buffer Manager: Buffer Cache Hit Ratio

  此计数器仅适用于应用程序。但是,90% 或更高的命中率是令人满意的。添加更多内存,直到该值始终大于 90%。大于 90% 的值表示数据缓存满足所有数据请求中 90% 以上的请求。


(3)SQL Server: Buffer Manager: Total Pages

  以下是SQL Server 2008的一组计数器示例:

Object_name

Counter_name

Pages

MBytes

SQLServer:BufferManager

Free pages

6,053

49.6

SQLServer:BufferManager

Total pages

807,638

6,616.2

SQLServer:BufferManager

Database pages

407,600

3,339.1

SQLServer:BufferManager

Stolen pages

393,985

3,227.5

  此计数器显示缓冲池(Buffer Pool)中的页数。从上表可以看出计算公式为:Total Pages = Free Pages + Database Pages + Stolen pages。

  SQL Server 2012取消了上述4个计数器,而在 SQL Server:Memory Manager 中增加了5个计数器。例如,Database Cache Memory (KB)反映服务器当前正用来缓存数据库页面的内存量。


(4)SQL Server: Memory Manager: Total Server Memory (KB)

  如果此计数器的值相对于计算机的物理内存量而言一直很高,则可能表示需要更多内存。


本文结语:

  通过计数器,查看Windows和SQL Server的内存使用情况。


本文出自 “我们一起追过的MSSQL” 博客,转载请与作者联系!

你可能感兴趣的:(PTO)