原始脚本来自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. php Yii2图片的url自动加localhost

    解决方法:在地址前加http://,这样url就是绝对地址,不加的话是相对地址,游览器会自动转换,即加localhost

  2. java private修饰的类和变量

    private主要用来修饰变量和方法,一般不会用来修饰类,除非是内部类. 1.new对象 被private修饰的变量和方法,只能在自己对象内部使用,其他对象即使是new你这个对象也是获取不到被priv ...

  3. Python使用MySQL数据库(新)

    之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 然而,2016年开始,我从Python2切换到了Python3 ...

  4. Myeclipse 自定义java代码快捷键

    1.首先在MyEclipse菜单栏找到"windows"下拉菜单中找到首选项(英文Prefenerces),弹出首选项界面.   2.打开java -->editor---& ...

  5. CountDownLatch和CyclicBarrier 特点比较

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79   并发编程中的CountDownLatch和CyclicBarri ...

  6. 为何webpack打包后的文件要放在服务器上才能运行

    为何会有此问: 在刚开始使用vue-cli时还不知道打包后的文件要在服务中才能运行,直接点开后发现页面白板,请教大神后得知要起一个服务才能运行起来,当时我脑子中的逻辑是这样的: 因为:js代码是由浏览 ...

  7. NHibernate教程(9)一1对n关联映射

    本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...

  8. ★不容错过的PPT教程!

    IT工程师必须学会的计算机基础应用之一--PPT! 28项大神级PPT制作技术,学会后让你变成PPT高手哦!更多实用教程,请关注@IT工程师 !

  9. JUnit之TestCase和TestSuite详解

    首先介绍下TestCase以及TestSuite.    TestCase:字面意思,测试用例.为一个或多个方法提供测试方法.一般是一个test    TestSuite:测试集合,即一组测试.一个t ...

  10. python--简易购物车实现

    目标要求: 1.用户输入购物预算 2.打印商品清单,由用户选择,预算够则购买,不够则提示 3.输入q,退出程序 4.购物结束,显示购买的东西和余额 实现: 1.用列表存储商品及价格信息 2.建立空列表 ...