闲话Linux下的系统监控 2014-09-25 18:13:58

分类: LINUX

1. 引言

我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的。但是这不是打开机器电源然后放任不管就可以得到的(如果你就是这种情景,说明你人品太好了)。所以我们要监视系统的运行状况,发现问题及时处理。

要做到系统的监控,大的方向有几种方法:

1)派人盯着

2)自己写个脚本进行监视

3)使用已有的监控软件

关于第1种方法请不要笑话。在业务的关键时点可能需要安排人员守在旁边,万一发生问题可以及时处理,数据库服务公司还为此开展一项专门的业务,叫"DBA值守"。不过DBA一般也不会蛮干,也会使用第2种和第3种方法。

第2种方法适用面较窄,且有重复发明轮子的嫌疑。

所以下面我们来讨论第3种方法(相信有人已经烦了要扔鸡蛋了。好吧,我承认写下前两种方法纯粹为了娱乐)。

2. 概述

先概括一下需求吧。系统的监控,无非是下面几个任务。

1)监视服务的中断

   监视服务的中断或者提前发现异常(如磁盘空闲容量过低)

2)报警

   发现问题后,通过邮件等形式通知相关人员及时处理。

3)记录性能数据

   记录CPU,MEM,IO,Network以及数据库相关的统计信息,便于发现和调查性能问题。

4)趋势分析

   图形化显示现在的和历史的性能数据

目前能用于系统监控的开源软件很多,并且它们的侧重点往往不同,需要根据需求做选择。下面介绍几个常用的,并且以个人视角做个简单评价。

3. 性能数据的存储

性能数据有些明显的特征

1)时间相关

2)只有插入和查询操作

3) 旧的历史数据可以被废弃

针对这些特征,很多监控软件使用专门时系数据工具RRDTool存储数据,比如Cacti,Ganglia,SmokePing。另一些这使用通用的关系数据库,比如nagios,zabbix。更有使用Hbase的OpenTSDB。为了更好的理解现有的很多监控软件,有必要先介绍一下RRDTool。

3.1 RRDTool

RRDtool不是一个监控软件,而是一个能对时系数据进行高性能记录检索和图形展现的开源库。不少监控软件都使用了RRDtool,所以有必要了解一下RRDtool。

RRDtool之所以叫RRD(Round Robin Database) Tool,是因其存储数据的方式而得名。可以讲其想象成一个固定大小的环形存储空间,每插入一条记录,当前位置指针向前移动一下,指针移动一圈后覆盖之前的数据。这种结构使得RRD的大小不会扩张,因此也就不需要维护,特别适合性能数据采集的场景。

RRDtool的功能有两个,一是作为时系数据的存储引擎,二是将存储的时系数据按不同要求绘制成png图片。看看下面的例子。

0)安装RRDtool

# yum install rrdtool

1)创建一个RRD

rrdtool create test.rrd             \
            --start 920804400          \
            DS:speed:COUNTER:600:U:U   \
            RRA:AVERAGE:0.5:1:24       \
            RRA:AVERAGE:0.5:6:10

2)插入数据

rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363
 rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373
 rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399
 rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415
 rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423

3)查询数据

[root@zabbix ~]# rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200
                          speed


 920804700: -nan
 920805000: 4.0000000000e-02
 920805300: 2.0000000000e-02
 920805600: 0.0000000000e+00
 920805900: 0.0000000000e+00
 920806200: 3.3333333333e-02
 920806500: 3.3333333333e-02
 920806800: 3.3333333333e-02
 920807100: 2.0000000000e-02
 920807400: 2.0000000000e-02
 920807700: 2.0000000000e-02
 920808000: 1.3333333333e-02
 920808300: 1.6666666667e-02
 920808600: 6.6666666667e-03
 920808900: 3.3333333333e-03
 920809200: -nan
 920809500: -nan

4)绘图

rrdtool graph speed.png                                 \
         --start 920804400 --end 920808000               \
         DEF:myspeed=test.rrd:speed:AVERAGE              \
         LINE2:myspeed#FF0000

speed.png:

Java对接海康SDK实现云台控制 linux海康 云台控制_服务器

上面只是演示RRDtool有什么样的功能,所有用到的各种参数不解释,有兴趣的话可以参考:

http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html

4. 性能数据的采集

RRDtool或RDB可以解决性能数据的存储问题,但这些性能数据从哪收集呢?数据采集的方法很自由,常用的方法大概可以归纳为以下几种:

1)代理(agent)

  一个专门收集性能数据的东西,一般是运行于被监控机器上的某个Deamon。代理采集数据然后传给监控服务器,那么代理又是如何得到数据的呢?无非是调用OS API,执行某个命令或者脚本。因为一般可以定制代理调用的脚本,所以代理采集数据的能力也是可以自由定制的。

2)远程协议

用于管理的共通协议SNMP,IMPI。或者常用的服务协议,http,ftp,ftp等。或是可以远程执行命令的协议telnet和ssh。只要设置好相应的参数就可以透过网络实施远程监视了。

3)定制脚本

有些管理系统上可以配置用于监控的定制脚本。有了定制脚本就可以自由扩展监控对象了。

下面介绍监控相关的共通协议SNMP和IMPI。

4.1 SNMP

  SNMP全称是Simple Network Management Protocol,SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台。被管理的系统上运行一个叫做代理者(agent)的软件元件,通过SNMP向管理系统报告。代理者和管理系统之间通信的方式有两种,一种是管理系统向代理者询问一个具体的参数值(比如:你产生了多少ICMP不可达差错),另一种是代理者向管理系统主动报告有某些重要事情发生(比如:一个网口掉线了)。

关于代理者和管理系统之间的交互,SNMP定义了5种报文

1)get-request:从代理处提取一个或多个参数值

2)get-next-request:从代理处提取一个或多个参数的下一个参数值

3)set-request:设置代理的一个或多个参数值

4)get-response:返回的一个或多个参数值。它是1)~3)的响应。

5)trap:代理主动发出报文,通知管理系统某些事情发生。

在SNMP体系中由代理提供,由管理系统查询和设置的信息集合称之为MIB(管理信息库)。MIB中的信息通过OID(对象标示符识别),比如:1.3.6.1.2.1.1.1.0。关于OID的定义可参照相关RFC。比如:

http://www.ietf.org/rfc/rfc1907.txt

标准中也有给 厂商 预留的OID(1.3.6.1.4.1),这样厂商可以在此OID下面进行扩展。

很多网络设备都内置SNMP代理,这样外面的监控服务器可以通过SNMP协议获取信息。对于普通的服务器,可以通过安装一个snmp代理软件提供snmp信息。比如:

安装和运行snmp代理

[root@zabbix ~]# yum install net-snmp 
 [root@zabbix ~]# /etc/init.d/snmpd start

通过SNMP查看系统描述

[root@zabbix ~]# snmpget -v2c -c public localhost 1.3.6.1.2.1.1.1.0 
 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64

或者

[root@zabbix ~]# snmpget -v2c -c public localhost iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 
 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64

或者

[root@zabbix ~]# snmpget -v2c -c public localhost sysDescr.0  
 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64

参考:

http://avery-leo.iteye.com/blog/379076

4.2 IPMI

IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准。用户可以利用 IPMI 监视服务器的物理特征,如温度、电压、电扇工作状态、电源供应以及机箱入侵等。Ipmi 最大的优势在于它是独立于 CPU BIOS 和 OS 的,所以用户无论在开机还是关机的状态下,只要接通电源就可以实现对服务器的监控。

要使用IPMI,服务器硬件本身必须提供对ipmi的支持。大多数厂商的服务器都支持IPMI,但并不是所有服务器都支持,所以应该先通过产品手册或在BIOS中确定服务器是否支持ipmi。如果你用的PC机或者虚拟机那肯定没戏了。

通过ipmitool,可以本地或远程经由impi获取机器信息或控制机器。比如:

# ipmitool -I lan -H 服务器地址 -U root -P 密码 power status

# ipmitool -I lan -H 服务器地址 -U root -P 密码 power reset  (硬重启) 

参考:

http://qa.blog.163.com/blog/static/1901470022013690328217/

5 几款通用的监控软件

有了前面的介绍,就很容把一些常用开源监控软件规个类了。

1)MRTG

SNMP数据采集+包含 PNG图片的html输出工具。数据存储使用自己的log格式,也可以采用rrdtool。 M R T G不是完整的监控系统,当成工具让perl或其他脚本来调用还可以。

http://oss.oetiker.ch/mrtg/

2)Cacti

rrd t ool的Web前端,通过 SNMP数据采集,也可以定制采集数据的脚本。支持模板定义,图形功能很强,但不能报警,常被拿来和nagios配合使用。

http://www.cacti.net/

3)nagios

数据采集支持主动代理,被动代理,各种网络协议(snmp,HTTP、FTP、SSH等),支持分布式部署,告警功能强大,特色功能是支持对主机的冗余监控,是功能很全面的一款监控软件,但 na gi os易用性比较差,图形展示能力很弱。

http://nagios.sourceforge.net/docs/nagioscore/4/en/about.html#whatis 

  • Monitoring of network services (SMTP, POP3, HTTP, NNTP, PING, etc.)
  • Monitoring of host resources (processor load, disk usage, etc.)
  • Simple plugin design that allows users to easily develop their own service checks
  • Parallelized service checks
  • Ability to define network host hierarchy using "parent" hosts, allowing detection of and distinction between hosts that are down and those that are unreachable
  • Contact notifications when service or host problems occur and get resolved (via email, pager, or user-defined method)
  • Ability to define event handlers to be run during service or host events for proactive problem resolution
  • Automatic log file rotation
  • Support for implementing redundant monitoring hosts
  • Optional web interface for viewing current network status, notification and problem history, log file, etc.

4)zabbix

zab bix和 na gi os一样是功能全面的 监控软件。但是比 na gi os更加好用,图形能力更强,所以面临nagios和zabbix二选一的时候建议zabbix。

  • zabbix的数据采集支持Zabbix agent,ICMP,SNMP,IPMI,http,ssh,定制脚本等
  • 发现问题自动告警
  • 数据展示盒配置设置全部统一的WEB GUI管理
  • 支持分布式部署
  • 支持模板和自动发现功能可以轻松的在大规模环境下部署

http://www.zabbix.com/

5)其他

其他也有几款,比如以性能和大规模监控为卖点的Ganglia和OpenTSDB,但是个人认为通常大多数的场景, zab bix完全够用了。