监控-CPU使用率
原始脚本来自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使用率的更多相关文章
- SQLServer2008-2012资源及性能监控—CPU使用率监控具体解释
前言: CPU是server中最重要的资源.在数据库server中,CPU的使用情况应该时刻监控以便SQLServer一直处于最佳状态. 本文将会使用可靠性和性能监视器来获取CPU相关的使用统计信息 ...
- VMSTAT监控CPU使用率,内存使用,虚拟内存交换情况
Linux性能监控分析命令(一)—vmstat命令详解 一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints ve ...
- 使用windows性能计数器监控cpu使用率
https://blog.csdn.net/yabingshi_tech/article/details/26672355 2. http://blog.51cto.com/qixue/1702557 ...
- 监控CPU使用率并发送报警邮件
#!/bin/bash DATE=$(date +%F" "%H:%M) #只支持centos6 IP=$(ifconfig eth0 | awk -F '[ :]+' '/ine ...
- Zabbix通过SNMP监控多核CPU使用率时, 计算CPU平均使用率
环境:没有Agent,只能通过SNMP监控时,需要获取多核CPU的平均使用率. ZABBIX的使用SNMP监控CPU使用率时,由于设备都是多核CPU,监控的都是单独某一核心的使用率,但单独某一核使用率 ...
- zabbix添加cpu使用率图形监控
zabbix版本: 3.2.5 zabbix 自带的windows模板中没有监控cpu使用率的,可以在模板里自己添加 1. 配置 ---> 模板---> Template OS Windo ...
- zabbix监控主机CPU使用率
zaibix默认模板针对CPU只有监控负载(load)没有监控CPU使用率 选择配置-模板-Template OS Windows-监控项 创建监控项 创建监控图形 查看图像结果
- collectd 检测cpu使用率
环境配置 1. install epel https://www.cyberciti.biz/faq/installing-rhel-epel-repo-on-centos-redhat-7-x/ 2 ...
- zabbix监控单核cpu使用率和多核cpu总负载
zabbix自带的基础监控的模板中只有对单核cpu负载1分钟.5分钟.15分钟的监控. 添加对总的cpu负载的监控 key:system.cpu.load[all,avg1] 1分钟cpu总的负载 添 ...
随机推荐
- js中高度与宽度的获取
JS获取各种宽度.高度的简单介绍: scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获 ...
- Struts2学习笔记(十一)——文件上传
1.单文件上传 单文件上传步骤: 1)创建上传jsp页面 文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 a ...
- 读Zepto源码之Ajax模块
Ajax 模块也是经常会用到的模块,Ajax 模块中包含了 jsonp 的现实,和 XMLHttpRequest 的封装. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...
- Linux基础教程
Linux基础教程之<Linux就该这么学>之学习笔记第一篇... ========================= 一.Basic Linux Commands 基本的Linux ...
- 【Linux】用yum安装JDK(转)
1.查看yum库中都有哪些jdk版本(暂时只发现了openjdk) [root@localhost ~]# yum search java|grep jdk ldapjdk-javadoc.x86_6 ...
- 关于RESTful接口api的设计
你封装api的话,你对同城,你相当于客户端,你只顺应他的签权机制:别人调你的话,你有一套签权机制,别人就是客户端,只顺应你的签权:这样就统一了,容易扩展,以后你接了几套签权,别人对你还是一套,你们就是 ...
- Microsoft .Net Remoting系列专题之二
Microsoft .Net Remoting系列专题之二 一.远程对象的激活 在Remoting中有三种激活方式,一般的实现是通过RemotingServices类的静态方法来完成.工作过程事实上是 ...
- js封装成插件
由于项目原因,工作一年多还没用js写过插件,项目太成熟,平时基本都是在使用已经封装好的功能插件.感觉自己好low......这两天想自己抽空写一个canvas画统计图与折现图的插件,所以就去网上学习了 ...
- 实时监听文本框输入 oninput、onchange与onpropertychange事件的用法和区别
前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...
- crontab 各参数详解及如何查看日志记录
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt145 crontab各参数说明: crontab [-u user] [fi ...