zoukankan      html  css  js  c++  java
  • SQL Server 性能调优(性能基线)

    在写这篇东西的时候我也不是很清楚性能基线,到底要检查点什么,dmv要不要检查,perfmon要检测那先。

    所以我决定,对我发的《sql server 性能调优》文章内的 perfmondmv做一个总结。来建立自己的性能基线。



    io

    io中我们要注意哪些性能指标呢?

    1. physical disk\disk reads/sec   --这个应该很清楚 一看就知道 这个指标是指什么的

    2. physical disk\ disk writes/sec

    一打开文章就看到这2个值,而却有阀值,看到阀值很开心,因为不用你去收集值了。

    • Less than 10 ms = good performance

    • Between 10 ms and 20 ms = slow performance

    • Between 20 ms and 50 ms = poor performance

    • Greater than 50 ms = significant performance problem.

    接下来就是 sys.dm_os_wait_stats 中的几个wait type

    3.  PAGEIOLATCH_* 

     PAGEIOLATCH_* 系列的wait type 一共有

    PAGEIOLATCH_DT   -- 破坏,什么是破坏,就是把内存中数据页释放掉
    PAGEIOLATCH_EX   -- x
    锁,可以怎么理解,就是排他占用这个锁

    PAGEIOLATCH_KP   -- 保持,就是保持这个页不被破坏
    PAGEIOLATCH_NL   --
    没有定义,保留
    PAGEIOLATCH_SH   --
    在读,数据页的时候就分配这个

    PAGEIOLATCH_UP   -- 在更新的时候分配这个            

    根据onlinebook的解释:在任务等待 I/O 请求中缓冲区的闩锁时发生。闩锁请求处于“XX”模式。长时间的等待可能指示磁盘子系统出现问题。

    讲的直白一点就是系统在io,入读或写的时候分配的。等待io请求

    4. ASYNC_IO_COMPLETION

    根据onlinebook的解释:当某任务正在等待 I/O 完成时出现

    这个是等待异步io完成,那么和上面有没有关系呢?答案是没有,上面等待的是io读取出来,或者写入。这个是等待系统的异步io完成是不一样的概念。

    5. IO_COMPLETION

    根据onlinebook的解释:在等待 I/O 操作完成时出现。通常,该等待类型表示非数据页 I/O。数据页 I/O 完成等待显示为 PAGEIOLATCH_* waits

    这个就不解释了说的很明白了就是等待非数据页io完成

    6. WRITELOG

    根据onlinebook的解释:等待日志刷新完成时出现。导致日志刷新的常见操作是检查点和事务提交。

    这个也不多解释,就是写入日志时候等待的时间。



    cpu

    7.Processor/ %Privileged Time                          --内核级别的cpu使用率

    8.Processor/ %User Time                                   --用户几倍的cpu使用率

    9.Process (sqlservr.exe)/ %Processor Time    --某个进程的cpu使用率

    10.SQLServer:SQL Statistics/Auto-Param Attempts/sec    --试图运行自动参数化次数

    11. SQLServer:SQL Statistics/Failed Auto-params/sec       -- 自动参数化失败

    12. SQLServer:SQL Statistics/Batch Requests/sec             -- 批处理量

    13. SQLServer:SQL Statistics/SQL Compilations/sec          -- 编译次数

    14.  SQLServer:SQL Statistics/SQL Re-Compilations/sec    -- 反编译次数

    15.  SQLServer:Plan Cache/Cache hit Ratio                            -- 执行计划,cache命中率

    接下来还是 wait event

    16.signal_wait_time_ms --从发出信号到开始运行的时间差,时间花费在等待运行队列中,是单纯的cpu等待。

    下面代码量化的像是signal_wait_time_ms占的比重

    SELECT SUM(signal_wait_time_ms) AS TotalSignalWaitTime ,

    ( SUM(CAST(signal_wait_time_ms AS NUMERIC(20, 2)))

    / SUM(CAST(wait_time_ms AS NUMERIC(20, 2))) * 100 )

    AS PercentageSignalWaitsOfTotalTime

    FROM sys.dm_os_wait_stats

    在创建baseline 的时候 完全可以 按这个sql来获取值。

    17.SOS_SCHEDULER_YIELD等待

    onlinebook的解释:在任务自愿为要执行的其他任务生成计划程序时出现。在该等待期间任务正在等待其量程更新。

    完全看不懂,啥叫量程。

    直白的说就是:当查询自动放弃cpu,并且等待恢复执行,这个等待就叫做SOS_SCHEDULER_YIELD

    18.CXPACKET等待

    onlinebook:当尝试同步查询处理器交换迭代器时出现。如果针对该等待类型的争用成为问题时,可以考虑降低并行度。

    直白点就是:处理器之间的一种同步,一般出现在 并发查询,为啥?因为只有并发查询才用多个处理器。

    接下来是 sys.dm_os_schedulers 

    SELECT scheduler_id ,

    current_tasks_count ,

    runnable_tasks_count

    FROM sys.dm_os_schedulers

    WHERE scheduler_id < 255

    19.主要是查每个处理器上的任务数和运行的任务数。

     

    内存

    20.SQL Server :Buffer Manager

    又很多有用的计数器都是这 buffer manager 对象下面,可以帮助发现buffer pool滚筒的问题。

    21.buffer cache hit ratio

    buffer cache hit ratio一般情况下在oltp中要高于95%,在olap中要高于90%。可惜的是没有关于这个性能指标相关的解释,和这个值是如何影响预读机制的。如果这个指标的值有巨大的下降那么就说明有问题。这个不能说明内存压力和sql server 健康指数。

    22.page life expectancy

    page life expectancy是页生命周期,也就是一个数据页在内存中的时间。在以前sql server 2000 4g的内存已经很大了,sql server buffer pool的大小是1.6g,如果sql server 从磁盘上读取1.6g的数据也只要5分钟,但是今天64g的内存是主流,如果从磁盘一下子读取50g的内存,会严重的冲击io。当存在大量的查询扫描表,读入新的数据页,导致生命周期值下降也不是不正常的。这个值必须长期的监视来分析问题。

    23.Free Pages

    free pages是内存中空页的数量,不要接近于0。这个值说明查询能否在其他查询不是放内存的情况下,快速的分配内存的主要依据。如果free pages 很少,页生命周期很短,并且伴随着空页争用(free list stalls/sec)的情况那么很有可能导致内存压力。

    24.Free list stalls/sec

    Free list stalls/sec每秒空页等待的数量,如果一段时间内都在0以上那么说明可能存在内存压力。

    25.lazy write/sec

    lazy write/sec 就是每秒写入磁盘的次数。如果发生量很大并且生命周期很短,free page 很少,但是 free list stall/sec 量很大,那么就是发生内存压力了。



    SQL Server:memory Manager

    SQL Server:memory Manager对象内对内存的消费和内存管理的问题提供了很重要参考

    26.total server memory target server memory

    2个计数器代表了当前sql server 使用的总共内存和sql server 想要用的内存。如果 target server memory超过了total server memory,也是内存压力的重要标志。sql server 会减少内存的需求来接近服务的可用内存,或者通过最大服务器内存配置,所以当内存出现压力问题的时候不应该第一时间去查看这2个计数器

    28.memory grants outstanding

    该值是现实多少进程已经成功的获取了内存的授权。在一段时间内,业务高峰期,如果该值过低,那么标志可能存在内存压力,特别是 memory grants pending 也比较高的情况下。

    29. memory grants pending

    该值是有过少进程正在等待内存的授权。如果为非0,那么说明需要调整或者优化负载或者增加内存。

     

    结束语

    每个需要跟踪的东西我都简单的解释了一下。关于 wait event 是累计计数的,在计算的时候需要相减。

    这样跟踪个一天,设置好频率,就能得出性能基线了,可以做成图标,这样通过图形就更容易看出问题了。

     

  • 相关阅读:
    区别@ControllerAdvice 和@RestControllerAdvice
    Cannot determine embedded database driver class for database type NONE
    使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
    Markdown语法笔记
    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    Mysql 查看连接数,状态 最大并发数(赞)
    OncePerRequestFilter的作用
    java连接MySql数据库 zeroDateTimeBehavior
    Intellij IDEA 安装lombok及使用详解
    ps -ef |grep xxx 输出的具体含义
  • 原文地址:https://www.cnblogs.com/Amaranthus/p/2388264.html
Copyright © 2011-2022 走看看