今天留意到一封报警邮件。内容如下:
ZABBIX-监控系统:
------------------------------------
报警内容: CPU utilization is too high
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: CPU idle time:45.92 %
------------------------------------
报警时间:2016.02.14-15:45:10
这个问题发生的时间很短,持续没多长时间就自动恢复了,但是还是引起了我的注意。
登录到环境之后,查看系统的整体负载情况。发现在问题时间段里,确实CPU使用率较高。
03:20:01 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle
03:30:01 PM       all      0.37      0.00      0.22      0.17      0.00     99.25
03:40:01 PM       all     18.03      0.00      0.19      0.18      0.00     81.60
03:50:01 PM       all     50.94      0.00      0.13      0.17      0.00     48.75
04:00:01 PM       all     75.45      0.00      0.15      0.15      0.00     24.24
04:10:01 PM       all     64.55      0.00      2.23      0.25      0.00     32.97
04:20:01 PM       all     57.27      0.00      0.91      0.28      0.00     41.54
对于这种情况,首先通过crontab排除了例行的维护任务,从而可以初步推断系统级没有特定的任务。
这个负载很可能来自于数据库层面,那么对于数据库层面的分析如下。
这个数据库实例的DB time,抖动不够明显。
BEGIN_SNAP   END_SNAP SNAPDATE             DURATION_MINS     DBTIME
---------- ---------- -------------------- ------------- ----------
     18981      18982 14 Feb 2016 11:00               60          4
     18982      18983 14 Feb 2016 12:00               60          4
     18983      18984 14 Feb 2016 13:00               60          4
     18984      18985 14 Feb 2016 14:00               60         14
     18985      18986 14 Feb 2016 15:00               60          8
     18986      18987 14 Feb 2016 16:00               60         32
     18987      18988 14 Feb 2016 17:00               59          6
     18988      18988 14 Feb 2016 18:00               60          0
但是逻辑读在下午的时间段里,确实出现了一个较大的抖动。

所以可以基本断定这个问题来自数据库层面,而且很可能来自sql语句。
当然了我也确实比较懒,对于这种问题,懒得生成awr了,直接用一个脚本来挖掘问题时间段内的快照数据。
$ sh showsnapsql.sh 18987
Current Instance
~~~~~~~~~~~~~~~~
      DBID DB_NAME                       INST_NUM INST_NAME
---------- --------------------------- ---------- ------------------------------------------------
1825607545 TESTDB                                1 testdb
   SNAP_ID SQL_ID                                  EXECUTIONS_DELTA ELAPSED_TI PER_TOTAL
---------- --------------------------------------- ---------------- ---------- ----------
     18987 c1mddahtwj7y1                                       1051 1388s      83%
     18987 cr32qwhysqkn9                                      65364 112s       6%
     18987 fgwt4xab7fhgt                                     138553 40s        2%
     18987 7kt7x4s5ps0hu                                        836 38s        2%
     18987 520mkxqpf15q8                                     410907 16s        1%
第一条语句毫无疑问是值得注意的部分。语句情况如下:
SQL_FULLTEXT
----------------------------------------------------------------------------------------------------
UPDATE TEST_DEAL_INFO SET FLAG='0',SMS_SEND_TIME=SYSDATE WHERE ID=:1
但是查看执行计划,发现走了全表扫描。
---------------------------------------------------------------------------------------
| Id  | Operation          | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |                  |       |       | 70961 (100)|          |
|   1 |  UPDATE            | TEST_DEAL_INFO   |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DEAL_INFO   |     1 |    10 | 70961   (1)| 00:14:12 |
---------------------------------------------------------------------------------------
那么这个问题就很明显了。需要一个相关的索引,在简单分析相关的语句之后,发现根据表的字段情况和使用的sql情况,目前只需要在id列添加索引即可。
当然简单添加之后,问题就会引刃而解。
不过在解决之后简单看了下这个环境还是不经意发现了一些问题,既然添加了索引,对应的表空间情况如下:
Tablespace     Total MB    Free MB     Used MB  
----------------------- ---------- ----------- -
MEG_DATA            100         98           2  
MEG_INDEX           100         98           2  
RECALL_DATA      77,774     28,928      48,846  
RECALL_INDEX     98,444     28,889      69,555  
SYSAUX            1,120         75       1,045  
SYSTEM              770          2         768  
TEMP             15,187     15,187           0  
UNDOTBS1          3,810      3,770          40  
USERS               154          8         145
有没有发现什么问题? 问题之一就是这个表空间的使用率有些奇怪,怎么索引所在的表空间使用率比数据还高了。如果是按照这种情况下,会有大量的索引存在,过多的索引,本身对于表的数据维护代价就比较高,而且这种索引比较多的情况很可能都是单键值索引,是否可以考虑复合索引。
带着疑问查看了一下索引的使用情况,奇怪的是没有发现什么问题,但是数据有一部分对不上,最后使用下面的语句来定位,发现了另外一个问题。
SQL> select owner,segment_type,sum(bytes/1024/1024) size_MB from dba_segments where tablespace_name='RECALL_INDEX' group by owner,segment_type;
OWNER                SEGMENT_TYPE            SIZE_MB
-------------------- -------------------- ----------
SYS                  INDEX                48021.4375
TEST               INDEX                21528.3125
这个索引表空间是由SYS和TEST两个用户共同使用,SYS竟然使用了近48G的空间,这个确实有些奇怪。为什么呢?
进一步分析发现,有一个表存在两个索引。每个索引大概是24G左右,表里本身就含有大量的历史数据。
INDEX_NAME             TABLE_NAME
----------------------------- -------------------------
RFR_CN_MASTER_INDEX    TEST_TIMELY_FOX
FRF_LOGIN_TIME_INDEX   TEST_TIMELY_FOX
而且表的段大小是15G左右,但是索引大小已经远大于数据段了,所以这部分索引需要考虑重建。
而且可以进一步和开发的同学确实,是否需要保留很早以前的索引。
在这个基础上,其实也可以进一步分析,写个脚本找出这类问题数据段,索引段来。

一条看似平常的报警邮件所做的分析相关推荐

  1. 中维报警邮件服务器,主打智能分析,中维世纪智能先锋系列产品来了!

    原标题:主打智能分析,中维世纪智能先锋系列产品来了! 中维世纪智能先锋系列产品主打"智能分析",包含JVS-C-BP1H2M-AG.JVS-C-BP1H2M-PG(支持POE).J ...

  2. nagios监控三部曲之——为什么nagios不能发送报警邮件(2)

    最近我写了关于naigos监控的安装与配置的技术文档,公司运维按照我的文档部署naigos,发现不能发送报警邮件,经过我的检查,发现问题如下: 1.hosts里的配置 [root@nagios ~]# ...

  3. python插件做nagios发报警邮件二

    接上文 python插件做nagios发报警邮件 http://www.nginxs.com/linux/371.html,由于python 传入的参数,python 会自动加 \ ,经过代码测试,代 ...

  4. 【Zabbix】配置 腾讯企业邮箱 发送报警邮件

    Zabbix 配置 腾讯企业邮箱 发送报警邮件

  5. zabbix配置发送报警邮件

    配置邮件分为两种情况: 第一种:使用远端邮件服务器发送报警邮件 Linux系统版本:CentOS6.5-64 下载mailx: http://nchc.dl.sourceforge.net/proje ...

  6. python发邮件11002_【python发送zabbix报警邮件,SSL版本】mailman.py

    [python发送zabbix报警邮件,SSL版本]mailman.py#!/usr/local/bin/python3 # # via  @ 20150210 # SSL only ''' 用法: ...

  7. SCOM 2016 配置报警邮件 (下)

    接上文,上文中我们介绍到了配置 SCOM 2016 的邮件警报通知,我们已经成功创建了订阅者. 接下来,我们就来讲一下如何把这个订阅者和这个通知通道连接起来,这个时候,就需要我们创建 "订阅 ...

  8. nodejs PM2监控及报警邮件发送(二)

    前言 用过nodejs都知道PM2,这章主要讲讲PM2监控程序及报警邮件 用pm2 启动app后,app挂掉自动拉起,但是维护人员不知道啊,所以需要其他方式通过(如邮件) 1:环境 centos7 n ...

  9. Linux下监控磁盘使用量并在超过阀值后自动发送报警邮件

    参考博客:http://www.heminjie.com/system/linux/1923.html 最近Linux服务器磁盘使用量经常到100%,直到影响到正常服务出现故障才会去注意,做不到防患于 ...

最新文章

  1. 去除菜单项的加速键--‘’符号
  2. 关于Spring boot使用心得
  3. 为什么DL模型能够正确分类?SCOUTER(ICCV21')从“正”“反”方面说服你。
  4. Adaboost 算法的原理与推导
  5. [歌曲]心愿(by 四个女生)
  6. Weblogic 启动慢解决方法
  7. 架构师之路 — 数据库设计 — 关系型数据库应用程序设计
  8. 新手玩家一定要学会配枪,使命召唤手游,对枪械是非常专业的
  9. oracle删除实体,oracle 按条件删除、查询表
  10. linux 进程间读写锁,Linux系统编程—进程间同步
  11. 蒙特卡罗模拟法 —— matlab
  12. 简单十步让你全面理解SQL
  13. SAP BC430 课程中文自学笔记
  14. 单元测试工具Numega BoundsChecker
  15. 交换机下接路由器lan还是wan_路由器LAN-WAN级联,增强无线信号,扩大覆盖范围...
  16. 小米 note3 android,小米NOTE3 MIUI9.6稳定版 开启全面屏手势和屏蔽经典物理按键全攻略...
  17. 阿里云直播服务拉流地址播放不出来
  18. python找零_用python实现零钱找零的三种方法
  19. 惟实励新·笃行致远,艾特网能2022年度合作伙伴大会成功举办
  20. 【安装+配置】Mac服务端svn

热门文章

  1. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
  2. 计算机网络入门指南之计算机网络体系结构
  3. 微信小程序 获取用户信息并保存登录状态
  4. Mysqli面向对象操作数据库
  5. Android学习–Android app 语言切换功能
  6. WPF LibraryBar去背景色
  7. .Net 2.0中使用扩展方法
  8. C# 中对象与JSON字符串相互转换的三种方法
  9. QgridLayout例子,在qlayout添加button实例(添加窗体过程类似)
  10. dotNetCharting使用总结