监控-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总的负载 添 ...
随机推荐
- CORS跨域资源共享你该知道的事儿
"唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...
- Vue2.0父子组件之间和兄弟组件之间的数据交互
熟悉了Vue.js的同级组件之间通信,写此文章,以便记录. Vue是一个轻量级的渐进式框架,对于它的一些特性和优点,请在官网上进行查看,不再赘述. 使用NPM及相关命令行工具初始化的Vue工程,目录结 ...
- Java利用自定义注解、反射实现简单BaseDao
在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...
- 关于JDBC导入mysql的jar驱动的头痛
今天上午想写个小程序,需要调用数据库,查了书和各个博客. 最后卡在导入mysql驱动上了,花了1个多小时才让程序连上数据库. 这里有个小误区,你下载的是zip压缩文件,很多帖子写的都是让你导入驱动,但 ...
- Eclipse常用快捷键和调试方法
原文链接:http://my.oschina.net/u/1054538/blog/741561 常用快捷键 Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事 ...
- SSH:dataSource配置问题
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- throws Exception方法异常处理机制
public class T4 { private String sex; public String getSex() { return sex; } public void setSex(Stri ...
- jmeter返回的post data乱码
通过csv 跑出来的结果 解决方法: 在CSV Data Set Config中将File Encoding设置为GB2312将Allow quoted data 设置为true
- 简单易学的SSM(Spring+SpringMVC+MyBatis)整合
SSM(Spring+SpringMVC+MyBatis)的整合: 具体执行过程:1.用户在页面向后台发送一个请求 2.请求由DispatcherServlet 前端控制器拦截交给SpringMVC管 ...
- wifi pineapple 外接USB无线网卡桥接外网
0:选择USB网卡 在没有有线网络的情况下,可以外挂一个usb无线网卡来桥接上网,目前支持3070L.8187L芯片的网卡,反正linux系统都用这些芯片, 免的安装驱动, 我选择的是 WN-722N ...