SQL Server监控常规计数器收集参考(mssql阻塞的跟踪查询,死锁的跟踪查询,改善)

常规计数器收集操作系统服务器的服务器性能信息,包括Processor、磁盘、网络、内存

Processor 处理器

1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比。通过此计数器可以确定服务器当前CPU使用百分比。

1.2 % Privileged Time是在特权模式下进程线程执行代码所花时间的百分比。当调用 Windows 系统服务时,此服务经常在特权模式运行,以便获取对系统专有数据的访问。

PhysicalDisk物理磁盘(某个RAID)

2.1 Avg. Disk Queue Length等待请求的队列长度,若此值过大,说明磁盘存在瓶颈,自然磁盘延迟的值也会过大。

2.2 Avg. Disk sec/Read;Avg. Disk sec/Transfer;Avg. Disk sec/Write这三个计数器表示磁盘每次读写需要多少时间,表示磁盘的延迟情况,以秒为单位,若延迟超过25mm表示磁盘性能较差。

LogicalDisk逻辑磁盘(某个卷)

3.1 % Free Space某个磁盘的空闲百分比;Free Megabytes 磁盘剩余大小MB

3.2 Disk Read Bytes/sec;Disk Transfers/sec;Disk Write Bytes/sec这三个计数器表示每秒磁盘的读写情况,表示磁盘的IO性能(iops)

Memory 内存

4.1 Available Mbytes可以内存大小MB,此内存能立刻分配给一个进程或系统使用。它等于分配给待机(缓存的)、空闲和零分页列表内存的总和。

4.2 Cache Bytes 系统使用的内存

4.3 Commit Limit可以申请的内存总大小(虚拟内存和物理内存);Committed Bytes已经使用的内存大小(虚拟内存和物理内存);均是以Byte(字节)为单位。

4.4 Free System Page Table Entries指系统当前未使用的页表项数目。表示内存是否空闲。

4.5 Page Faults/sec 每秒出错页面的数量,也就是未在内存中命中的页面数。因此伴随着Pages/sec计数器是由于出错页面从磁盘读取数据页的速度。此值越大说明内存可能存在一定瓶颈,或者存在大量数据存取。

Network Interface 网络接口

5.1 Current Bandwidth指以位/每秒估计的网络接口的当前带宽。对于那些带宽不变的或无法估计出准确数据的界面,这个值为名义带宽。

5.2 Bytes Received/sec;Bytes Sent/sec;Bytes Total/sec每秒种发送和接收的字节数,表示当前网络的使用情况。

5.3 Output Queue Length输出数据包队列,此值大于2说明传输存在延迟。

5.4 Packets Outbound Discarded 被选为丢弃的数据包数目,丢弃的原因可能是释放缓冲空间。Packets Outbound Errors 由于错误不能传输的数据包数目

5.5 Packets Received Discarded 被选为丢弃的数据包数目,丢弃的原因可能是释放缓冲空间。Packets Received Errors 由于错误不能传输的数据包数目

SQL Server计数器

SQL Server中的Access Methods对象提供监视访问数据库中的逻辑数据的计数器;Buffer Manager计数器监视对磁盘上的数据库也的物理访问。

Access Methods 存取方式

Access Methods监视用于访问数据库中存储的数据的方法有助于确定是否可以通过添加或修改索引、添加或移动分区、添加文件或文件组、对索引进行碎片整理或者重写查询来提高查询性能。 Access Methods 计数器也可用于监视数据库中数据、索引和可用空间的数量,从而指示每个服务器实例的数据卷和碎片。索引的碎片过多会降低性能。

1.1 Page Splits/sec每秒由于索引页溢出而发生的页拆分数。此数据越大表示某表的修改频率较高,且要确认该索引是否适合建立该字段上。

1.2 Workfiles Created/sec每秒创建的工作文件数

1.3 Worktables Created/sec每秒创建的工作表数

Buffer Manager 缓存管理

监视用于存储数据页的内存;读取和写入数据库页时的物理io等,通过此对象可以判断是否存在物理内存瓶颈可以了解服务器的查询性能等等。

2.1 Buffer cache hit ratio命中高速缓冲区页的百分比。若此值过低说明可能内存存在一定瓶颈

2.2 Database pages缓冲池中数据库内容的页数

2.3 Page life expectancy页指示页面在没有引用的情况下,在此节点的缓冲池中停留的时间(以秒计)。此值若降低说明,服务器频繁查询数据库中数据。

2.4 Checkpoint pages/sec Checkpoint的执行频率,若执行的频率过高。则说明服务器过于频繁的修改数据。

2.5 Lazy writes/sec 若懒写入过于频繁,说明没有空闲的缓冲区供使用,内存可能存在一定瓶颈。“惰性编写器”是一个系统进程,用于成批刷新脏的过期的缓冲区(包含更改的缓冲 区,必须将这些更改写回磁盘,才能将缓冲区重用于其他页),并使它们可用于用户进程。

Memory Manager 内存管理

监视总体的服务器内存使用情况,以估计用户活动和资源使用,有助于查明性能瓶颈。

3.1 Memory Grants Pending指定等待工作空间内存授权的进程总数。指等待分配内存的进程数量,若此值过高或内存或磁盘存在一定瓶颈。

3.2 Target Server Memory (KB);Total Server Memory (KB)理想上能使用内存量与内存管理器提交的内存量。若此两值存在差异则说明内存异常。

General Statistics 常规统计

4.1 User Connections;Logins/sec;Logouts/sec 用户并发情况

4.2 Processes blocked当前阻塞数量

4.3 Temp Tables For Destruction等待被清除系统线程破坏的临时表/表变量数。无用的临时表和表变量。

SQL Statistics; Wait Statistics请求与等待统计

5.1 Batch Requests/sec;SQL Compilations/sec;SQL Re-Compilations/sec每秒的请求、编译和重编译的次数,这些对于优化供参考。

5.2 Lock waits等待锁的进程数。

5.3 Log write waits等待写入日志缓存的进程数

5.4 Page IO latch waits与页 I/O 闩锁相关的统计信息。用于判断内存或磁盘的瓶颈情况

5.5 Page latch waits与页闩锁(不包括 I/O 闩锁)相关的统计信息。用于判断内存或磁盘的瓶颈情况

Databases针对数据库级别

6.1 Log Flush Wait Time;Log Flushes/sec日志刷新等待和频率,若数据异常则可能存在磁盘瓶颈

6.2 Transactions/sec 事务数

Locks

7.1 Lock Requests/sec;Lock Timeouts/sec锁请求频率;锁超时频率

7.2 Number of Deadlocks/sec 死锁情况。

------------------------------------------------------------------------------------

磁盘相关

           ins_dir = MSSQL_DIR + "/ms" + str(port)data_dir = ins_dir + '/data'log_dir = ins_dir + '/log' backup_dir = ins_dir + '/backup' ins_size = func_os.get_dir_size( ins_dir)          data_size = func_os.get_dir_size(data_dir)log_size = func_os.get_dir_size(log_dir) backup_size = func_os.get_dir_size( backup_dir)real_ins_size = ins_size - backup_size          other_size = real_ins_size - data_size - log_size
总空间:real_ins_size = 实例目录空间 - 备份空间(落地备)数据空间:data_size其他文件空间:other_size = 总空间 - 数据空间 - 日志空间 = tepmdb空间大小(日志+数据)+ 其它(errorlog+agentlog+fulltextlog+系统库+JOBS)BinLog空间:log_size

SQL Server性能相关

动态管理视图和函数

   与session执行有关sys.dm_exec_connectionssys.dm_exec_sessions与系统有关sys.dm_os_performance_counters与IO相关sys.dm_io_virtual_file_stats

目录视图

   数据库和文件目录视图sys.master_filessys.databases

sessions

   命令 select count(*) from sys.dm_exec_sessions where login_name not in ( 'root', 'aurora', 'sa', 'eagleye') and login_name not like 's\_%' escape '\' and login_name not like %mssqld' and login_name not like '%Administrator' and status not in ( 'Preconnect', 'Dormant‘)解释sys.dm_exec_sessions:是服务器范围的视图,显 示了有关所有活动用户连接和内部任务的信息。login_name 当前执行的会话所使用的 SQL Server 登录名。status    会话的状态。 可能的值:Running - 当前正在运行一个或多个请求Sleeping - 当前没有运行任何请求Dormant – 会话因连接池而被重置,并且现在处于登录前状态。Preconnect - 会话在资源调控器分类器中。分类资源调控器支持对传入会话的分类。分类基于函数中包含的一组用户编写的条件。函数逻辑的结果使资源调控器可以将会话归入现 有工作负荷组类。会话传入链接——分类(分类器函数)——路由到工作负荷组——工作负荷组使用相关联的资源池——资源池提供同时限制应用程序资源

bufferhit

命令 SELECT a.cntr_value * 1.0 / b.cntr_value * 100.0 AS BufferCacheHitRatio FROM sys.dm_os_performance_counters a JOIN ( SELECT cntr_value, OBJECT_NAME FROM sys.dm_os_performance_counters WHERE counter_name = 'Buffer cache hit ratio base' AND OBJECT_NAME = 'MSSQL$MS%d:Buffer Manager') b ON a.OBJECT_NAME = b.OBJECT_NAME WHERE a.counter_name = 'Buffer cache hit ratio' AND a.OBJECT_NAME = 'MSSQL$MS%d:Buffer Manager'解释 sys.dm_os_performance_counters       为服务器维护的每个性能计数器返回一行。counter_name    计数器的名称OBJECT_NAME          计数器的所属类别 Buffer Manager 对象提供了计数器,用于监视 SQL Server 如何使用:内存存储数据页、内部数据结构和过程缓存。计数器监视 SQL Server 读取和写入数据库页时的物理 I/O。Buffer Manager中的Buffer cache hit ratio base和Buffer cache hit ratioBuffer cache hit ratio 官方解释在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分比。经验正常情况应该在 99%以上

checkpoint

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Checkpoint pages/sec'解释由要求刷新所有脏页的检查点或其他操作每秒刷新到磁盘的页数。经验 1. 显示执行 checkpoint;会发生checkpoint 2. alter database 添加或删除数据库文件;会发生checkpoint 3. 停止服务;会发生checkpoint 4. engine定期生成checkpoint,跟 recovery interval、恢复模式相关 5. 备份;会发生checkpoint 6. 在数据库中执行了最小日志记录操作,例如,在使用大容量日志恢复模式的数据库中执行大容量复制操作;会发生checkpoint 7 执行了需要关闭数据库的活动。例如,AUTO_CLOSE 设置为 ON 并且关闭了数据库的最后一个用户连接,或者执行了需要重新启动数据库的数据库选项更改;会发生checkpoint 8. 08R2 checkpoint是实例级别的配置,但进行的过程(实现方式)是数据库级别的,这个msdn没有详细说明但可以做实验证明,大概方法可以构造两个数据库和相应数据,不同的DB session手动执行checkpoint观察sys.dm_os_buffer_descriptors 9. 脏页的多少影响checkpoint开销大小 10. 08R2镜像端不支持checkpoint

pagelife

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager    ' AND counter_name = 'Page life expectancy'解释表示页面在缓存中的预期 "寿命",单位为秒。微软建议最少 300秒。如果在一个实例中经常低于 300秒,意味着数据保留的时间少于 5分钟就被移出内存。经验 1. 正常PLE应该是大于 300且为一条持续平稳上升的直线 2. PLE经常性的波动可能是内存压力的信号,具体再结合lazy_write,page_writes/page_reads等一起观察判定

sqlcompilations

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:SQL Statistics' AND counter_name = 'SQL Compilations/sec'解释每秒的 SQL 编译数。 表示编译代码路径被进入的次数。 包括 SQL Server 中语句级重新编译导致的编译。 当 SQL Server 用户活动稳定后,该值将达到稳定状态。经验编译截断主要是CPU开销,一般可以和Batch Requests/sec对照来看

logins

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:General Statistics' AND counter_name = 'Logins/sec'解释 General Statistics 对象提供计数器,用于监视服务器范围内的常规活动Logins/sec   每秒启动的登录数。 这不包括已入池连接。

transactions

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name LIKE 'MSSQL$MS%d:database%%' AND instance_name = '_Total' AND counter_name LIKE 'Transactions/sec%%'解释 Database 对象提供了计数器,来监视大容量复制操作、备份和还原吞吐量以及事务日志活动。_Total     有的计数器的instance_name中有值为_Total的实例,它是对该计数器所有实例的聚合值( SUM)。Transactions/sec       每秒为数据库启动的事务数经验理解SQLServer的Transactions和Batch Requests,一个Batch Requests可能有多个Transactions,Batch Requests更能说明系统负载

locktimeout

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Lock Timeouts/sec' AND instance_name = '_Total'解释Locks 对象提供了有关各种资源类型的 SQL Server 锁的信息 Lock Timeouts/sec    每秒超时的锁请求数,包括对 NOWAIT 锁的请求。

deadlock

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Number of Deadlocks/sec' AND instance_name = '_Total'解释 Number of Deadlocks/sec     每秒导致死锁的锁请求数。经验经常死锁可能会导致严重的问题,借助Profiler可以解,但在RDS场景下最好的处理方式是打开Flag 1222 通过日志分析

lockwaits

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Lock Waits/sec' AND instance_name = '_Total'解释 Lock Waits/sec   每秒要求调用者等待的锁请求数。

fullscans

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Access Methods' AND counter_name = 'Full Scans/sec'解释 Access Methods       对象提供用于监视如何访问数据库中的逻辑数据的计数器。 Full Scans/sec    每秒不受限制的完全扫描数。这些扫描可以是基表扫描,也可以是全文索引扫描。

pagesplits

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Access Methods ' AND counter_name = 'Page Splits/sec'解释Page Splits/sec   每秒由于索引页溢出而发生的页拆分数。经验页拆分会搬移数据,性能开销,和fillfactor参数有联系; 12相对于 08有优化,碰到大条记录拆分一次放不下可能会尝试生成一个新页存放,优化出现连续拆分的情况

lazy_writes

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Lazy writes/sec'解释Lazy writes/sec   每秒被缓冲区管理器的惰性编写器写入的缓冲区数。惰性编写器    一个系统进程,用于成批刷新脏的老化的缓冲区(包含更改的缓冲区,必须将这些更改写回磁盘,才能将缓冲区重用于其他页),并使它们可用于用户进程。当 SQL Server感觉到内存压力的时候,会将最久没有使用的数据页面和执行计划从缓 冲池中清理掉,做这个动作的就是Lazy Writer。经验Lazy writes有单独一个系统进程,刷脏页的过程和checkpoint类似同样会有性能影响,对比checkpoint可以理解为两者的行为类似但目的不 同,Lazy writes是保证内存有可用页,一般有内存压力的时候会频繁出现,Checkpoint聚合写、优化IO、维护数据一致性,可以结合PLE一起观察内存 问题

pagereads

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager ' AND counter_name = 'Page reads/sec'理解Page reads/sec  每秒发出的物理数据库页读取数。经验大量物理读写和IOPS升高是一致的;频繁持续的物理读写过高先找找是否有需要优化改写的 SQL或者考虑增加内存,当然内存是有成本的最好的方式还是通过rewrite queries/ add intelligent indexes处理;

pagewrite

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Page writes/sec'理解Page writes/sec  每秒执行的物理数据库页写入数。经验大量物理读写和IOPS升高是一致的;频繁持续的物理读写过高先找找是否有需要优化改写的 SQL或者考虑增加内存,当然内存是有成本的最好的方式还是通过rewrite queries/ add intelligent indexes处理;

qps

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:SQL Statistics' AND counter_name = 'Batch Requests/sec'理解 SQL Statistics      对象提供计数器来监视编译和发送到 SQL Server 实例的请求类型。通过监视查询编译和重新编译的次数以及 SQL Server 实例收到的批数,可了解 SQL Server 处理用户查询的速度,以及查询优化器处理查询的效率。Batch Requests/sec  每秒收到的 Transact- SQL 命令批数。经验这个Batch Requests跟MySQL的QPS不同,SQLServer一个Batch Requests可能包含多个Transactions

traffic_kb

命令 SELECT round( SUM(net_packet_size * 1.0 * num_reads / 1024), 0) AS read_kb, round( SUM(net_packet_size * 1.0 * num_writes / 1024), 0) AS write_kb FROM sys.dm_exec_connections WHERE session_id > 50理解dm_exec_connections     返回与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息。net_packet_size  用于信息和数据的网络包的大小。可为 Null 值。num_reads   此连接中已发生的读包次数。可为 Null 值。num_writes  此连接中已发生的写数据包次数。可为 Null 值。session_id    标识与此连接关联的会话。可为 Null 值。

db_io

命令 SELECT SUM(fs.num_of_reads + fs.num_of_writes) AS [mssql_db_log_io] FROM sys.dm_io_virtual_file_stats( NULL, NULL) AS fs INNER JOIN sys.master_files AS f ON fs.database_id = f.database_id AND fs.file_id = f.file_id INNER JOIN sys.databases AS d ON d.database_id = f.database_id AND d.name IN (%s) GROUP BY d.name ORDER BY d.name解释sys.dm_io_virtual_file_stats     返回数据和日志文件的 I/O 统计信息。num_of_reads     对文件发出的读取次数。num_of_writes    在该文件中写入的次数。sys.master_files  存储在 master 数据库中的每个数据库文件都在表中占用一行。database_id 应用此文件的数据库的 IDmaster database_id 始终为 1。file_id    数据库内文件的 ID。主 file_id 始终为 1sys.databases     实例中的每个数据库都对应一行 name     数据库名称

activesession

命令 select COUNT(*) from sys.dm_exec_sessionswhere login_name not in ( 'root', 'aurora', 'sa', 'eagleye') and login_name not like 's\_%' escape '\' and login_name not like '%mssqld' and login_name not like '%Administrator' and status not in ( 'Preconnect', 'Dormant', 'Sleeping') and session_id > 50解释比之前的session监控多了Sleeping和session_id> 50的过滤条件Sleeping      当前没有运行任何请求经验activesession过高一般业务都会出现卡慢,但这个值只是一个结果表现,具体导致原因还需要其它进一步排查

connectionreset

   命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%s:General Statistics' AND counter_name = 'Connection Resets/sec'解释 Connection Resets/sec    从连接池启动的登录总次数。                

------------------------------------------------------------------------------------

死锁的四个必要条件:

  • 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
  • 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
  • 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  • 循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源

1. 图形化查询:

sqlserver -->工具--> sql server profiler

2. 使用日志跟踪

以全局方式打开指定的跟踪标记

        DBCC TRACEON(1222,-1)

       DBCC TRACEON(1204,-1)

使用  EXEC master..xp_readerrorlog 查看日志。

3.使用sql分析查询死锁与阻塞脚本:

/*
功能说明: 数据库死锁与阻塞语句查询
*/
DECLARE @spid INT
DECLARE @blk INT
DECLARE @count INT
DECLARE @index INT
DECLARE @LOCK TINYINT

SET @LOCK=0

CREATE TABLE #temp_who_lock
(
 id   INT IDENTITY(1, 1),
 spid INT,
 blk  INT
)

--if @@error<>0 return @@error    
INSERT INTO #temp_who_lock
        (spid,
         blk)
SELECT 0,
   blocked
FROM   (SELECT *
    FROM   master..sysprocesses
    WHERE  blocked > 0)a
WHERE  NOT EXISTS(SELECT *
              FROM   master..sysprocesses
              WHERE  a.blocked = spid
                     AND blocked > 0)
UNION
SELECT spid,
   blocked
FROM   master..sysprocesses
WHERE  blocked > 0

--if @@error<>0 return @@error    
SELECT @count = Count(*),
   @index = 1
FROM   #temp_who_lock

--select @count,@index

--if @@error<>0 return @@error    
IF @count = 0
BEGIN
  SELECT '没有阻塞和死锁信息' 
--return 0    
END

WHILE @index <= @count
BEGIN
  IF EXISTS(SELECT 1
            FROM   #temp_who_lock a
            WHERE  id > @index
                   AND EXISTS(SELECT 1
                              FROM   #temp_who_lock
                              WHERE  id <= @index
                                     AND a.blk = spid))
    BEGIN
        SET @LOCK=1

        SELECT @spid = spid,
               @blk = blk
        FROM   #temp_who_lock
        WHERE  id = @index

        SELECT  '引起数据库死锁的是: ' + Cast(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ;

        SELECT @spid,
               @blk



        DBCC inputbuffer(@spid)


        DBCC inputbuffer(@blk)
    END

  SET @index=@index + 1
END

IF @LOCK = 0
BEGIN
  SET @index=1

  WHILE @index <= @count
    BEGIN
        SELECT @spid = spid,
               @blk = blk
        FROM   #temp_who_lock
        WHERE  id = @index

        IF @spid = 0
          SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' 
        ELSE
          SELECT '进程号SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '进程号SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下'

        PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk));
        if(@spid <> 0)
        BEGIN
           DBCC inputbuffer(@spid)   --
         END

        DBCC inputbuffer(@blk)   --引起阻塞语句

        SET @index=@index + 1
    END
END

DROP TABLE #temp_who_lock

--return 0    
--KILL 54

4. SQLServer 死锁的诊断和定位

---------------------------------------------------------------------------------------------------------

SqlServer内存瓶颈分析--SQLServer:Buffer Manager

SELECT TOP 312 * FROM  sys.dm_os_performance_counters
where object_name ='SQLServer:Buffer Manager' order by counter_name

1.Buffer cache hit ratio  平均值>=90%                                                                                                         

缓冲区是创建数据页面的缓冲页面池,这一般是SQL server内存池中最大的部分。这个计数器应该尽可能高。

低值表示只有少数的请求是在缓冲区,其他请求是在磁盘获取服务

这种情况发生可能是SQL server还在准备状态下,或缓冲区的增长需求超过最大可用内存,因此如果此值比较低,应该考虑为系统增加内存。

2.Checkpoint pages/sec    平均值<30     

美好一个检查点操作移到磁盘的页面数量,这些值应该相当低,高值意味着缓冲中更多的页面被标记为脏页面。

脏页面是在缓冲区中被修改的页面。一旦被修改,就标记为脏并在下一个检查点被写回磁盘。

如果这个计数器较高说明系统发生大量的写入操作,可能是I/O问题的征兆。                                                                                                

3.Lazy writes/sec     平均值<20            

 记录了缓冲区管理器的Lazy write进程每秒写入的缓冲区数量。这个进程会把时间较长的脏页面从缓冲区中删除,将内存释放

 数值过高说明I/O有问题或是内存问题。                                                                                                

4.Page life expectancy     平均值>300        

页面平均寿命,表示一个不被引用的页面在缓冲池中停留的时间。数值低意味着页面从缓冲区中被移走

降低了缓冲的效率并指出内存压力的可能。                                                                                                    

SELECT TOP 312 * FROM  sys.dm_os_performance_counters
where object_name ='SQLServer:Memory Manager' order by counter_name

1.Memory Grants Pending      平均值=0

值高说明内存短缺,需要将进度挂起等待内存空闲

2. Target Server Memory(KB)     接近物理内存大小

表示SQLServer希望消耗的动态内存总数。

3.Total Server Memory (KB  )    接近于Target Server Memory
当前分配给SQLerver的总内存。 如果低于Target Server Memory

那么可能是SQLserver内存需求很低,服务器最大内存设置的太低
 

解决方案:

优化应用程序工作负载

为SQLServer分配更多内存

增加系统内存

更新32位处理器为64位

启用3G进程空间

在32位SQLserver中使用4G以上内存

 

启用3G进程空间:

在Boot.ini文件中增加3GB开关

[boot loader]

timeout=30

default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINNT=

"Microsoft Windows Server 2008 Advanced Server"

/fastdetect /3GB

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章