我对AlwaysON性能监控的三板斧

延迟是AlwaysOn最大的敌人之一

延迟是AlwaysON的最大敌人之一。对AlwaysON而言,其首要目标就尽量减少(无法避免)主副本、辅助副本的数据延迟,实现主副本、辅助副本的“数据同步”。只有主副本、辅助副本的同步延迟越小越高,只读访问的实性性才会越高,数据库的RTO(Estimating Failover Time)和RPO(Estimating Potential Data Loss)也才会越小。

但延迟可能存在于AlwaysON同步的各个环节中,因此,在分析现延迟情况时,应该首先理解AlwaysON的同步过程,然后切分到每个过程中进行监控和分析。

AlwaysON同步的6大步骤

在我的上篇文章《AlwaysON的同步原理及同步模式》中,曾介绍过AlwaysON的同步过程。归结起来,主要包括如下六个步骤:

① log flush(primary)

② log capture(primary)

③ send(primary and secondary)

④ log receive and cache(secondary)

⑤ log hardened(secondary)

⑥ redo(secondary)

前两个步骤发生在主副本,最后三个步骤发生在辅助副本,中间的第三个步骤发生主副本和辅助副本之间。

另外,如果是同步提交模式,还需要增加一个步骤:辅助副本在步骤5之后,会发送一个(日志硬化)确认信息给主副本,然后才能进入redo阶段。

监控AlwaysOn的同步过程

Log Flush(Primary)

Log Flush就是将log buffer中的日志刷入到磁盘中。在SQL Server中,log buffer的大小固定为60KB,当发生事务提交时、checkpoint、或者buffer可用空间不足时,日志就会被flush磁盘中。

AlwaysON只有待主副本的日志刷入磁盘后才能继续后面的步骤(为了保护主副本的数据一致性)。因此,log flush的越快,AlwaysON后续步骤进入的就越早,延迟就越小,反之亦然。

那么,在这个阶段中,如何监控log flush的速度和性能呢?通常,我们使用如下两个性能计数器:

  • Avg. Disk sec/Write

这是一个磁盘的性能计数器,这个指标反映的是flush期间磁盘的写操作的平均响应时间,如果10ms以内,说明磁盘性能非常好,如果在10ms到20ms,说明性能较好,如果在20ms到50ms说明性能较差,如果在50ms以上,说明性能很差。

这个指标直接反映了每秒flush的日志大小,因在不同的时段、不同的业务中日志产生的大小可能不同,因此不能提供一个标准值用来衡量flush性能的好坏,不过,当这个值很大时,说明数据库操作(增、删、改)比较频繁,需要引起注意,结合后续步骤中的其他指标一起分析。

log capture(primary)

log capture发生在log flush之后,是AlwaysON中最重要的阶段(个人认为)。在这个阶段中,主副本上会为每个辅助副本维护一个发送队列,队列的内容就是从日志缓冲或者磁盘中capture的日志,而队列的大小则反映了主副本和辅助副本数据不同步的差量。

显然,在这个阶段最可能影响AlwaysON同步性能的两个关键因素就是:capture日志的来源(是磁盘还是内存)和队列的大小。

在上述两个因素中,我需要着重解释下capture日志的来源:是磁盘还是内存?我们自导,从内存中读取数据效率要远远高于从磁盘中读取,所以在AlwaysON中,SQL Server会尽可能多将日志缓冲到内存中。但缓冲的大小是有限的,如果日志量太大、缓冲的大小不足,则不得不读取磁盘。

下面我们来熟悉下如何监控日志的来源和发送队列的大小:

监控日志的来源:

日志到底是读取自内存还是磁盘,通过如下性能计数器可窥见一斑:

  • SQL Server:Databases:Log Pool Requests/sec和SQL Server:Memory Manager:Log Pool Memory (KB)

解释:前者表示每秒中从内存中请求日志块的数量;后者表示log pool memory的大小;

说明:对于这两个值,我们希望越高越好,则说明越多的日志可以从内存中读取到。

  • SQL Server:Databases:Log Pool Disk Reads/sec和SQL Server:Databases:Log Pool Cache Misses/sec

解释:两个性能计数器其实都表示内存中找不到要读取的日志,必须从磁盘中读取;

说明:如果两个值越高,说明内存性能不足,SQL Server没法缓冲更多的日志。

监控日志发送队列:

在主副本上执行如下语句即可:

SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.database_id as database_id,

dr_state.log_send_queue_size, is_ag_replica_local = CASE

WHEN ar_state.is_local = 1 THEN N‘LOCAL‘

ELSE ‘REMOTE‘

END ,

ag_replica_role = CASE

WHEN ar_state.role_desc IS NULL THEN N‘DISCONNECTED‘

ELSE ar_state.role_desc

END

FROM (( sys.availability_groups AS ag JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id )

JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id)

JOIN sys.dm_hadr_database_replica_states dr_state on

ag.group_id = dr_state.group_id and dr_state.replica_id = ar_state.replica_id;

log_send_queue_size表示主数据库中尚未发送到辅助数据库的日志记录量 (KB),也就是上文说的发送队列,如果某个辅助副本的发送队列持续增加,说明此副本与主副本同步的数据差量就越大。

在上例中,server1是主副本,server2是辅助副本。主副本的log_send_queue_size始终为null,server2的log_send_queue_size为154067KB。显然,此时server2明显落后于主副本。

send(primary and secondary)

send阶段是 AlwaysON同步过程中最简单的一个步骤(个人认为)。在这个阶段中,我们主要关注网络性能就好了,因为主副本必须借助网络才能把发送队列的日志传输到到对应的辅助副本。如果网络不好,AlwaysON就会产生延迟,更有甚者,如果是在同步提交模式下,还会导致主副本的事务迟迟不能提交。

对网络的监控主要通过如下两个性能计数器即可:

  • Network Interface:bytes sent/sec

解释:网卡每秒发送的字节数;

说明:对于这个指标我们不能孤立来看,需结合发送队列的大小,当发送队列很大,但此性能指标持续比较低时,有可能是网络有问题(当然,如果是同步模式,需要考虑辅助副本log harden的速度才能决定是否一定跟网络有关)。

  • Network Interface:output Queue Length

解释:网卡的发送队列大小;

说明:一般来说,网卡的队列大于2时,说明网络存在拥堵,可能出现了网络问题。

Log Receive and cache(sencondary)

log receive and cache发生在辅助副本上,表示辅助副本接受来自主副本发送的日志块、并缓冲起来的过程。

这个阶段其实跟网络速度和内存大小有关,两者在上文中均有介绍,这里不做过多阐述,只跟大家介绍下这个阶段中AlwaysON专有性能计数器。

解释:每秒接受的日志大小(单位为KB);

说明:接受的速度越快,说明网络性能和内存性能均越好。

Log Hardened(sencondary)

介绍log hardened时不得不谈一谈第一个步骤的log flush,两者其实是一个东西,只是表述不一样。因为它们无论是工作原理还是对事务提交的影响都非常类似,因此对log hardened的监控,直接参考步骤一就好了。

redo(secondary)

redo的对象是辅助副本中已经固化的日志(该日志可能是内存中副本,也可能来自磁盘上),是AlwaysON中“实现”数据同步的步骤,其他步骤都是为此做铺垫,即便是上个步骤的日志固化,它也只能保证主副本和辅助副本的数据一致,而真正的数据同步必须等待辅助副本的redo完成。

在这个阶段中,有两个因素决定了数据延迟的大小:redo的日志大小和redo的速度。下面我们从这两个角度来了解下redo阶段的性能监控:

监控redo日志大小

SELECT ag.name AS ag_name, ar.replica_server_name AS ag_replica_server, dr_state.database_id as database_id,

dr_state.redo_queue_size, is_ag_replica_local = CASE

WHEN ar_state.is_local = 1 THEN N‘LOCAL‘

ELSE ‘REMOTE‘

END ,

ag_replica_role = CASE

WHEN ar_state.role_desc IS NULL THEN N‘DISCONNECTED‘

ELSE ar_state.role_desc

END

FROM (( sys.availability_groups AS ag JOIN sys.availability_replicas AS ar ON ag.group_id = ar.group_id )

JOIN sys.dm_hadr_availability_replica_states AS ar_state ON ar.replica_id = ar_state.replica_id)

JOIN sys.dm_hadr_database_replica_states dr_state on

ag.group_id = dr_state.group_id and dr_state.replica_id = ar_state.replica_id;

监控redo的速度

redo的速度通过如下性能计数器即可:

解释:辅助副本每秒完成redo的字节数;

说明:在分析此指标时,必须结合redo的日志大小,将两者的结果相除可得到一个大致的同步延迟时间。

结尾

我们知道AlwaysON是SQL Server 2012才开始引入的技术,目前笔者做的案例还不是很多,本文所表述的内容都是基于我有限的实践经验总结而来,如有不妥之处还请批评指正。

时间: 2024-08-28 07:34:57

我对AlwaysON性能监控的三板斧的相关文章

Go pprof性能监控

Go net/http/pprof包提供了一个在WEB项目中使用的性能监控的工具, 使用时只需要引用包: _"net/http/pprof" 然后就可以在浏览器中访问地址: http://localhost:port/debug/pprof/来查看性能信息. 最简单的示例: package main import ( "net/http" _ "net/http/pprof" ) func main() { http.ListenAndServe

服务性能监控指标

Apache性能监控支持以下指标: Apache吞吐率 Apache并发连接数 Apache并发连接数详细统计,包括读取请求.持久连接.发送响应内容.关闭连接.等待连接 Lighttpd性能监控支持以下指标: Lighttpd吞吐率 Lighttpd并发连接数 Lighttpd并发连接数详细统计,包括建立连接.读取请求.读取POST数据.处理请求.发送响应内容.关闭连接 Nginx性能监控支持以下指标: Nginx吞吐率 Nginx并发连接数 Nginx并发连接数详细统计,包括读取请求.处理请求

vmstat和iostat命令进行Linux性能监控

这是我们正在进行的Linux命令和性能监控系列的一部分.vmstat和iostat两个命令都适用于所有主要的类unix系统(Linux/unix/FreeBSD/Solaris). 如果vmstat和iostat命令在你的系统中不可用,请安装sysstat软件包.vmstat,sar和iostat命令都包含在sysstat(系统监控工具)软件包中.iostat命令生成CPU和所有设备的统计信息.你可以从这个连接中下载源代码包编译安装sysstat,但是我们建议通过YUM命令进行安装. 在Linu

MongoDB运行状态、性能监控,分析

转自http://tech.lezi.com/archives/290 MongoDB运行状态.性能监控,分析 Posted by neilxp on 十月 26, 2011Leave a comment (2)Go to comments 这篇文章的目的是让你知道怎么了解你正在运行的Mongdb是否健康. mongostat详解 mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者有其他问题的

windows 性能监控

标 题: windows 性能监控之VC编译snmp作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4003599.html 欢迎转帖 请保持文本完整并注明出处 windows性能监控可以使用如下几种方法: 一.自己C++调用APi .获取诸如 1.进程的空闲及计算时间对比计算CPU占用率 2.磁盘空闲率 3.遍历进程各种信息 4注册表查询安装软件等.这个之前在 <ProcessHacker学习笔记> http://www.cnblogs.com/i

5. SQL Server数据库性能监控 - 当前请求

对于在线运行的系统,当前数据库性能监控,通常监视以下几点: (1) 是否有阻塞 (Blocking); (2) 是否有等待 (Waiting),阻塞就是锁 (Lock) 等待; (3) 是否运行时间过长(Long running): (4) 是否有死锁 (Deadlock): sys.dm_exec_query_stats之类,等一些统计性的信息,通常不作为实时告警内容,而是在性能优化时,作为参考. 一. 阻塞/等待/长时间运行 1. SQL Server 2005 及以后版本检查 SELECT

第八章 JVM性能监控与故障处理工具(2)

注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处理工具 Jconsole visualVM 2.Jconsole 进入"E:\Java\jdk1.6\bin",双击"jconsole.exe",弹出如下框: 说明:这里列出了所有的JVM进程,一个Jconsole进程,一个eclipse(PID:4684),这相当于j

Linux 性能监控 —— 磁盘 I/O

零. 前言 如果从磁盘(disk)中读取/写入数据, CPU 就会处于空闲状态, 大大浪费了这段等待时间 CPU 的计算能力. 所以SSD. 缓存. 内存. 寄存器之类的设计就是为了减少 CPU 的等待时间, 释放计算能力. 可以看出业界对磁盘 I/O 的重视, 以及磁盘 I/O 对系统的影响之大. 一.  如何查看磁盘 I/O 在 Linux 平台或者 BSD 平台下, 借助 top 命令可以清楚看到磁盘 I/O 情况. 二. 如何衡量磁盘 I/O 存在瓶颈 磁盘 I/O 是否存在瓶颈取决于当

[转载]前端数据之美 -- 七天打造前端性能监控系统

开始行动 本文中的性能主要指 web 页面加载性能,对性能还不了解?不用担心,接下来的“每一天”跟我一起进入前端性能的世界. Day 1 为什么要监控性能? “If you cannot measure it, you cannot improve it” ———— William Thomson 这是一个最基本的问题,为什么要关注和监控前端性能?对于公司来说,性能在一定程度上与利益直接相关.国外有很多这方面的调研数据: 性能 收益 Google 延迟 400ms 搜索量下降 0.59% Bin