原始脚本来自TG,自己对部分脚本做了调整,分享出来仅供参考,请勿整篇Copy!


使用以下语句获取【CPU使用率】

USE [DBA_Monitor]
GO
/****** 对象: StoredProcedure [dbo].[DBA_Pro_Get_CpuUseInfo] 脚本日期: 02/07/2017 16:26:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/******************************************************************
【概要说明】
<作 者> DBA
<创建时间> 2015/01/24 10:27
<中文名称> 获取SQLServer进程CPU使用率
<功能说明> 采集当前SQL实例下面的SQLServer进程CPU使用率
<调用方式> 作业方式定时调用为主;错误处理后,维护人员手工调用为辅
<执行说明> 先决条件:正确的传递实例编号参数@InstanceID
  注意事项:暂无
<调用示例> exec DBA_Pro_Get_ErrorLog 100233,'UestMail@163.com'
【修订记录】
-------------------------------------------------------------------
<2015/01/24 10:27> <DBA>: 创建
******************************************************************/
ALTER proc [dbo].[DBA_Pro_Get_CpuUseInfo]
@InstanceID int,
@Recipients VARCHAR(200)=null
as
BEGIN
SET NOCOUNT ON IF (@InstanceID<100000 or @InstanceID>999999)
begin
print '数据库实例编号参数错误!'
return
end BEGIN TRY
--抓取SQL进程内使用CPU的情况
DECLARE @ts_now bigint
SELECT @ts_now=cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info --获取最近10分钟的CPU使用率信息
SELECT TOP(10)
SQLProcessUtilization AS [SQLServerProcessCPUUtilization],
SystemIdle AS [SystemIdleProcess],
(100 - SystemIdle - SQLProcessUtilization) AS [OtherProcessCPUUtilization],
DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime]
into #CPU_Temp
FROM
(
SELECT
record.value('(./Record/@id)[1]', 'int') AS record_id,
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle],
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization], [timestamp]
FROM
(
SELECT [timestamp], CONVERT(xml, record) AS [record]
FROM
sys.dm_os_ring_buffers
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE N'%<SystemHealth>%'
) AS x
) AS y
ORDER BY record_id DESC --获取sqlserver进程CPU使用率大于40%的总次数和实际最大值
declare @CpuTooHighNums int --总次数
declare @CpuTooHighValue int --最大值 select @CpuTooHighNums=IsNull(count(1),0),@CpuTooHighValue=IsNull(max(SQLServerProcessCPUUtilization),0)
from
#CPU_Temp
where SQLServerProcessCPUUtilization>40 insert into Info_CpuUseLog (InstanceID,SystemIdleProcess,SQLServerProcessCPUUtilization,OtherProcessCPUUtilization,EventTime)
select @InstanceID,SystemIdleProcess,SQLServerProcessCPUUtilization,OtherProcessCPUUtilization,EventTime
from #CPU_Temp
WHERE SQLServerProcessCPUUtilization>0
order by EventTime /*--如果最近10分钟内sqlserver进程CPU使用率超过40%的次数>=5,发邮件预警
IF (@CpuTooHighNums>=5)
begin
declare @bodyTemp01 varchar(1000)
declare @subject varchar(64)
declare @ip varchar(15)
declare @HostName varchar(64) select @bodyTemp01= '最近10分钟,有'+Cast(@CpuTooHighNums as varchar(10))+'次SQLServer进程CPU使用率高于:40%;最高为:'+Cast(@CpuTooHighValue as varchar(10))+'%'
select @IP=Reverse(left(Reverse(IntranetIP),charindex('.',Reverse(IntranetIP))-1)) FROM Info_Hardware where ServerID=left(@InstanceID,4)
select @HostName=HostName From dbo.Info_Instance where InstanceID=@InstanceID IF @ip IS NOT NULL
set @subject='['+@ip+'][重要] CPU使用率预警'
ELSE
set @subject='[重要] CPU使用率预警' DECLARE @tableHTML NVARCHAR(MAX);
SET @tableHTML =
N'<style>td{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}th{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}</style>
<H2>'+@HostName+'数据库CPU使用率预警</H2>'+@bodyTemp01+'<br />
报表时间:'+Convert(varchar(19),getdate(),121)+
N'<table width = "100%" table border="0" cellspacing="0" cellpadding="0" style="BORDER-LEFT: black 1px solid;BORDER-TOP: black 1px solid">
<tr><th>序号</th><th>SQLServer进程CPU使用率%</th><th>其他进程CPU使用率%</th><th>系统空闲百分比%</th><th>取样时间</th></tr>' +
CAST ( ( SELECT td = ROW_NUMBER() OVER (ORDER BY EventTime desc),'',
td = SQLServerProcessCPUUtilization,'',
td = OtherProcessCPUUtilization,'',
td = SystemIdleProcess,'',
td = convert(varchar(19),EventTime,121),''
FROM #CPU_Temp
order by EventTime desc
FOR XML PATH('tr')
) AS NVARCHAR(MAX) ) +
N'</table>'
+'<br />邮件发送条件:
<br />1、最近10分钟SQLServer进程CPU使用率超过40%的次数>=5';
--select @tableHTML; EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'LKProfile',
@recipients = @Recipients,
@subject = @subject,
@body = @tableHTML,
@body_format = 'HTML';
end*/
if object_id('tempdb..#cpu_temp')is not null
drop table #CPU_Temp
END TRY
BEGIN CATCH
insert into ExecErrorLog(InstanceID,Error_Procname,Error_Numbers,Error_Messages,Error_Serverity,Error_States,Error_Lines)
SELECT @InstanceID,ERROR_PROCEDURE(),ERROR_NUMBER(),ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_LINE()
END CATCH
END

如果一个服务器上有多个实例,不知道得出来的数据是服务器整体的,还是单个实例的数据。
数据库服务器收集本地数据,然后使用SSIS汇集监控数据,目标服务器使用以下语句发送【数据库CPU使用率预警】邮件

USE [DBA_Monitor]
GO
/****** 对象: StoredProcedure [dbo].[RPT_CpuUseLog] 脚本日期: 02/07/2017 16:29:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*-----------------------------------------------
功 能:邮件数据库CPU使用率
最新修改:2016/11/22
调用示例: exec RPT_CpuUseLog 'UestMail@163.com'
-----------------------------------------------*/
ALTER Proc [dbo].[RPT_CpuUseLog]
@Recipients VARCHAR(200)
AS
BEGIN
SET NOCOUNT ON
declare @StartTime datetime
declare @Subject varchar(64)
--数据获取后,只需取ETLTime最近几分钟的数据,对应的是自上次后的所有数据
set @StartTime=dateadd(mi,-10,getdate())
set @Subject='[ALL][重要] 数据库CPU使用率预警' select InstanceID,count(*) HighNums,max(SQLServerProcessCPUUtilization) HighValue
,min(EventTime) MinTime,max(EventTime) MaxTime
into #MailLog
from Info_CpuUseLog
where ETLTime>=@StartTime
and SQLServerProcessCPUUtilization>40
group by InstanceID
having count(*)>=5 select InstanceID,min(EventTime) MinTime,max(EventTime) MaxTime
into #RangTime
from Info_CpuUseLog
where ETLTime>=@StartTime
group by InstanceID if exists(select top 1 1 FROM #MailLog)
begin
DECLARE @tableHTML NVARCHAR(MAX);
SET @tableHTML =
N'<style>td{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}th{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}</style>
<H2>数据库CPU使用率预警</H2>
报表时间:'+Convert(varchar(19),getdate(),121)+
N'<table width = "100%" table border="0" cellspacing="0" cellpadding="0" style="BORDER-LEFT: black 1px solid;BORDER-TOP: black 1px solid">
<tr><th>序号</th><th>主机名(IP)</th><th>取样区间</th><th>累计超过次数</th><th>最高CPU使用率%</th><th>首次超过时间</th><th>末次超过时间</th></tr>' +
CAST ( ( SELECT td = ROW_NUMBER() OVER (ORDER BY a.InstanceID),'',
td = b.HostName+'('+b.ShortIP+')','',
td = convert(varchar(19),c.MinTime,121)+'~'+convert(varchar(19),c.MaxTime,121),'',
td = a.HighNums,'',
td = a.HighValue,'',
td = convert(varchar(19),a.MinTime,121),'',
td = convert(varchar(19),a.MaxTime,121),''
FROM #MailLog a
inner join Info_Server b
on left(a.InstanceID,4)=b.ServerID
inner join #RangTime c
on a.InstanceID=c.InstanceID
ORDER BY a.InstanceID
FOR XML PATH('tr')
) AS NVARCHAR(MAX) ) +
N'</table>说明:最近60分钟SQLServer进程CPU使用率超过40%的汇总数据<br /><br />';
--print @tableHTML;
end if exists(select top 1 1 FROM #MailLog)
begin
DECLARE @tableHTML1 NVARCHAR(MAX);
SET @tableHTML1 =
N'<style>td{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}th{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}</style>
报表时间:'+Convert(varchar(19),getdate(),121)+
N'<table width = "100%" table border="0" cellspacing="0" cellpadding="0" style="BORDER-LEFT: black 1px solid;BORDER-TOP: black 1px solid">
<tr><th>序号</th><th>主机名(IP)</th><th>SQLServer进程CPU使用率%</th><th>其他进程CPU使用率%</th><th>系统空闲百分比%</th><th>取样时间</th></tr>' +
CAST ( ( SELECT td = ROW_NUMBER() OVER (ORDER BY c.InstanceID,c.EventTime desc),'',
td = b.HostName+'('+b.ShortIP+')','',
td = SQLServerProcessCPUUtilization,'',
td = OtherProcessCPUUtilization,'',
td = SystemIdleProcess,'',
td = convert(varchar(19),EventTime,121),''
FROM #MailLog a
inner join Info_Server b
on left(a.InstanceID,4)=b.ServerID
inner join Info_CpuUseLog c
on a.InstanceID=c.InstanceID
where c.EventTime>=dateadd(mi,-5,a.MinTime)
and c.EventTime<=dateadd(mi,5,a.MaxTime)
order by c.InstanceID,c.EventTime desc
FOR XML PATH('tr')
) AS NVARCHAR(MAX) ) +
N'</table>'
+'<br />邮件发送条件:
<br />1、最近60分钟SQLServer进程CPU使用率超过40%的次数>=5
<br />2、明细数据返回首、末次超过时间±5分钟范围内的CPU使用率';
--print @tableHTML1;
end IF (@tableHTML is null and @tableHTML1 is null)
return
SET @tableHTML=ISNULL(@tableHTML,'')+ISNULL(@tableHTML1,'') EXEC msdb.dbo.sp_send_dbmail
@profile_name= 'LKProfile',
@recipients= @Recipients,
@subject = @Subject,
@body = @tableHTML,
@body_format = 'HTML'; if object_id('tempdb..#MailLog')is not null
drop table #MailLog
if object_id('tempdb..#RangTime')is not null
drop table #RangTime
END

单独的邮件扩展了原始收集CPU信息中的邮件部分。首先是汇总数据,显示取样区间、超过阈值的次数、最高CPU使用率、首末次超过时间。然后取首末次超过时间±5分钟范围内的CPU使用率明细数据

每10分钟获取最近10分钟的CPU使用率信息,仅保存sqlserver进程CPU使用率>0的记录。邮件每1小时从CPU使用率信息表筛选记录,邮件中的取样区间,由于sqlserver进程CPU使用率=0,显示时间区间可能不是完整的一小时。

监控-CPU使用率的更多相关文章

  1. SQLServer2008-2012资源及性能监控—CPU使用率监控具体解释

    前言: CPU是server中最重要的资源.在数据库server中,CPU的使用情况应该时刻监控以便SQLServer一直处于最佳状态. 本文将会使用可靠性和性能监视器来获取CPU相关的使用统计信息 ...

  2. VMSTAT监控CPU使用率,内存使用,虚拟内存交换情况

    Linux性能监控分析命令(一)—vmstat命令详解 一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints ve ...

  3. 使用windows性能计数器监控cpu使用率

    https://blog.csdn.net/yabingshi_tech/article/details/26672355 2. http://blog.51cto.com/qixue/1702557 ...

  4. 监控CPU使用率并发送报警邮件

    #!/bin/bash DATE=$(date +%F" "%H:%M) #只支持centos6 IP=$(ifconfig eth0 | awk -F '[ :]+' '/ine ...

  5. Zabbix通过SNMP监控多核CPU使用率时, 计算CPU平均使用率

    环境:没有Agent,只能通过SNMP监控时,需要获取多核CPU的平均使用率. ZABBIX的使用SNMP监控CPU使用率时,由于设备都是多核CPU,监控的都是单独某一核心的使用率,但单独某一核使用率 ...

  6. zabbix添加cpu使用率图形监控

    zabbix版本: 3.2.5 zabbix 自带的windows模板中没有监控cpu使用率的,可以在模板里自己添加 1. 配置 ---> 模板---> Template OS Windo ...

  7. zabbix监控主机CPU使用率

    zaibix默认模板针对CPU只有监控负载(load)没有监控CPU使用率 选择配置-模板-Template OS Windows-监控项 创建监控项 创建监控图形 查看图像结果

  8. collectd 检测cpu使用率

    环境配置 1. install epel https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/ 2 ...

  9. zabbix监控单核cpu使用率和多核cpu总负载

    zabbix自带的基础监控的模板中只有对单核cpu负载1分钟.5分钟.15分钟的监控. 添加对总的cpu负载的监控 key:system.cpu.load[all,avg1] 1分钟cpu总的负载 添 ...

随机推荐

  1. 微信app支付android客户端以及.net服务端实现

    由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app ...

  2. 使用adb shell启动特定activity

    使用adb shell启动特定activity Android笔记 使用adb shell可以直接运行某个activity,避免调试过程中修改Manifest文件. 1.在AndroidManifes ...

  3. jq 动态添加.active 实现导航效果

    代码思路: 页面4: 页面5: 代码思路: 通过jq获取你打开页面的链接  window.location.pathname: 在HTML中给自己的li加入一个ID id的命名与网址链接中的href相 ...

  4. 使用CefSharp 在C#用户控件中嵌入Chrome浏览器使用方法

    CEF(Chromium Embedded Framework, 嵌入式Chromium框架)是C/C++开发的库 目前 Google Chrome(Google浏览器),Chromium浏览器,Op ...

  5. 走近RDD

    RDD(Resilient Distributed Datasets)弹性分布式数据集.RDD可以看成是一个简单的"数组",对其进行操作也只需要调用有限的"数组" ...

  6. 如何快速把 Vue 项目升级到 webpack3

    由于 webpack3升级后,新增了 Scope Hositing(作用域提升) 功能,据说是对 js的性能提升很大.因此,我们做了一个测试对比,就是 webpack3和 webpack1/2 的性能 ...

  7. 10分钟搞懂Tensorflow 逻辑回归实现手写识别

    1. Tensorflow 逻辑回归实现手写识别 1.1. 逻辑回归原理 1.1.1. 逻辑回归 1.1.2. 损失函数 1.2. 实例:手写识别系统 1.1. 逻辑回归原理 1.1.1. 逻辑回归 ...

  8. 第1阶段——u-boot分析之make 100ask24x0_config指令(1)

    本文学习目标:         掌握"make 100ask24x0_config"指令在Makefile和mkconfig文件中是怎么实现配置芯片选型 1.执行make 100a ...

  9. Project 6:上楼梯问题

    问题简述:梯有N阶,上楼可以一步上一阶,也可以一步上二阶.编写一个程序,计算共有多少中不同的走法. 样例输入: 5 样例输出: 8 #include <stdio.h> int count ...

  10. vue中组件的四种方法总结

    希望对大家有用 全局组件的第一种写法 html: <div id = "app"> <show></show></div> js: ...