博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server内存性能分析
阅读量:5930 次
发布时间:2019-06-19

本文共 5891 字,大约阅读时间需要 19 分钟。

内存概念:

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动作)

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 Set

Process(w3wp)\Private Bytes

 

转载地址:http://pcktx.baihongyu.com/

你可能感兴趣的文章
使用yum安装MariaDB
查看>>
python字典的提取
查看>>
在Spring中整合JUnit单元测试
查看>>
【C#】xml序列化及反序列化
查看>>
oracle外连接,Oracle中Left Outer Join和外关联(+)的区别
查看>>
Django运维后台的搭建之一:使用model建立数据信息
查看>>
VM 虚拟机上 CentOS7 永久修改系统时间
查看>>
关于LP Wizard生成Allegro封装无焊盘的解决方案
查看>>
php日期时间计算,转载
查看>>
php 排查函数文件执行路径的打印
查看>>
批量上传图片
查看>>
linux必需掌握的基础(二)
查看>>
回归自然-测试、回归、预发布、灰度发布、生产环境自己的理解
查看>>
Java 线程详解(二)synchronize
查看>>
我的友情链接
查看>>
常用的脚本编程知识点
查看>>
华为交换机端口基本配置
查看>>
java 虚拟机
查看>>
Android开发资料推荐之安卓巴士Android开发神贴整理
查看>>
SQL修改密码
查看>>