Zabbix 中内置了很多监控参数(Key),我们可以通过在客户端配置文件中定义key,获取监控对象中的系统、CPU、网络、内存、文件系统等信息。下面就详细介绍一下这些监控参数的意义。


1. 举例

假如我的需求是:监控某台Web服务器的80端口的并发连接数,并设置图形。

先分析该需求,可以分为两步。第一步是要创建自定义监控项,第二步是要针对该监控项设置成图形。监控项目有一个核心元素就是数据源,有了数据源才可以创建监控项。

  • 首先在zabbix-agent端上编辑自定义脚本:
[root@localhost ~]# vim /usr/local/sbin/estab.sh                    #写入下面内容
#!/bin/bash
## 获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED                    # netstat -an 可查看系统TCP连接数;ESTABLISHED表示正在连接中的状态,另外80后面多个空格是为了精确,避免包含8080端口

  • 保存后,需要修改脚本权限(让zabbix用户也能执行):
[root@localhost ~]# chmod 777 /usr/local/sbin/estab.sh

  • 还需要编辑zabbix-agent的配置文件,定义监控项的key:
[root@localhost ~]# vim /etc/zabbix/zabbix_agentd.conf                   #增加下面两行
UnsafeUserParameters=1                          #表示使用自定义脚本
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh                      #自定义监控项的key为my.estab.count,后面的[*]里面写脚本参数,没有可以省略,脚本为 /usr/local/sbin/estab.sh

  • 保存配置文件后重启zabbix-agent服务:
[root@localhost ~]# systemctl restart zabbix-agent

  • 然后到服务端做个验证,查看刚刚配置是否正确,在服务端执行命令:
[root@localhost fonts]# zabbix_get -s 192.168.33.129 -p 10050 -k 'my.estab.count'
0                 #因为129服务器上没有任何80端口的访问,所以为0,只要能够获取到客户端的数据,就说明刚刚配置没有问题

  • 然后第二步就是在zabbix 的web界面去创建监控项并设置成图形,这里不是重点,不做过多赘述(参考:https://blog.csdn.net/miss1181248983/article/details/81220983 )

2. 测试获取监控参数内容的方法

上面例子中,我们就自定义了key——my.estab.count,通过设置key来获得我们想要监控的信息。

在Zabbix Server上使用zabbix_get命令可以从监控对象获取监控参数的具体内容。

  • zabbix_get命令的具体使用方法:
zabbix_get -s 目标服务器IP -p 端口(10050) -k {key}

  • 示例:
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.5 -p 10050 -k system.uname                      # key为 system.uname 
Linux ubuntu 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 15:35:06 UTC 2015 x86_64


3. 监控参数的实际意义

3.1 操作系统信息(OS)

# 系统启动的时间点(Host boot time)
system.boottime

# 系统已运行时长(System uptime)
system.uptime

# 系统时间(Host local time)
system.localtime

# 主机名(Host name)
system.hostname

# 内核参数,可打开的最大文件数(Maximum number of opened files)
kernel.maxfiles

# 内核参数,支持的最大进程数(Maximum number of processes)
kernel.maxproc

# 目前登录到系统中的用户数量(Number of logged in users)
system.users.num

# 获取系统信息(System information)
system.uname


3.2 网卡信息(Network interfaces)

# 网卡流速,流入方向
net.if.in

# 获取指定网卡(br0)的流入流量的流速值(Incoming network traffic on br0)
net.if.in[br0]

# 网卡流速,流出方向
net.if.out

# 获取指定网卡(br0)的流出流量的流速值(Outgoing network traffic on br0)
net.if.out[br0]


3.3 进程信息(Processes)

# 进程数量(Number of processes)
proc.num

# 目前系统中的进程总数(Number of processes)
proc.num[]

#目前正在运行(处于运行态)的进程总数(Number of running processes)
proc.num[run]


3.4 处理器信息(CPU)

# CPU的进程上下文切换(Context switches)
system.cpu.switches

# CPU中断数量(Interrupts per second)
system.cpu.intr

# CPU的负载值,进程队列的平均长度(Processor load)
system.cpu.load

# CPU每分钟的负载值,按照核数做平均值(Processor load (1 min average per core))
system.cpu.load[percpu,avg1]

# CPU每5分钟的负载值,按照核数做平均值(Processor load (5 min average per core))
system.cpu.load[percpu,avg5]

# CPU每15分钟的负载值,按照核数做平均值(Processor load (15 min average per core))
system.cpu.load[percpu,avg15]

CPU的负载值可以使用uptime命令查看,但是Zabbix所获得到CPU负载值与uptime所显示的结果并不同,它的结果是uptime所显示的负载值除以主机的CPU核数。

测试结果如下:

bigdata@bigdata:/tmp$ uptime
 14:08:59 up 21 days, 19 min,  2 users,  load average: 0.04, 0.05, 0.05
bigdata@bigdata:/tmp$ cat /proc/cpuinfo|grep processor|wc -l
4

通过zabbix_get获取负载值
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.38 -p 10050 -k system.cpu.load[percpu,avg1]
0.010000
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.38 -p 10050 -k system.cpu.load[percpu,avg5]
0.012500
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.38 -p 10050 -k system.cpu.load[percpu,avg15]
0.012500

# CPU的使用率
system.cpu.util

# CPU的空闲时间,百分比形式(CPU idle time)
system.cpu.util[,idle]

# CPU的用户态运行时间,百分比形式(CPU user time)
system.cpu.util[,user]

# CPU的系统态运行时间,百分比形式(CPU system time)
system.cpu.util[,system]

# CPU的io等待时间,百分比形式(CPU iowait time)
system.cpu.util[,iowait]

# CPU的中断时间,百分比形式(CPU interrupt time)
system.cpu.util[,interrupt]

# CPU的nice时间,百分比形式(CPU nice time)
system.cpu.util[,nice]

# CPU的软中断时间,百分比形式(CPU softirq time)
system.cpu.util[,softirq]

# CPU的偷盗的时间,百分比形式(CPU steal time)
system.cpu.util[,steal]

系统态运行时间较高说明进程进行系统调用的次数比较多。一般的程序,如果系统态运行时间占用过高,就需要优化程序,减少系统调用。

io等待时间的比例过高,则表明硬盘的IO性能差,如果是读写文件比较频繁,读写效率要求比较高,可以考虑更换硬盘,或者使用多磁盘做Raid的方案。


3.5 内存信息(Memory)

# 系统中swap分区的使用情况
system.swap.size

# swap分区的总容量(Total swap space)
system.swap.size[,total]

#swap分区尚可使用的容量(Free swap space)
system.swap.size[,free]

# swap分区尚可使用的容量,百分比形式(Free swap space in %)
system.swap.size[,pfree]

# 获取物理内存的使用情况
vm.memory.size

# 物理内存总量(Total memory)
vm.memory.size[total]

#物理内存目前可用的容量(Available memory)
vm.memory.size[available]

虚拟内存是由物理内存(即购买的内存条)和swap分区组成。物理内存占用过高之后,会将部分很久不用的数据转储到swap分区中。由此可见,在正常情况下,物理内存使用量并不高的情况下,不会占用swap分区。如果出现物理内存使用量过高,开始使用swap分区,或者swap分区使用过高的情况,就需要考虑购买并添加物理内存了。

内存的信息可以使用free命令查看,其中

bigdata@bigdata:/tmp$ free -b
             total       used       free     shared    buffers     cached
Mem:    16784355328 16692240384   92114944  108625920   15360000 14823591936
-/+ buffers/cache: 1853288448 14931066880
Swap:   10691276800    9728000 10681548800

通过zabbix_get获取内存使用信息
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.38 -p 10050 -k vm.memory.size[available]
14989234176
hadoop@ubuntu:~$ zabbix_get -s 192.168.0.38 -p 10050 -k system.swap.size[,free]
10681548800


3.6 文件系统信息(Filesystems)

# 文件系统中的inode的使用情况
vfs.fs.inode

# 文件系统的指定分区中尚未使用的inode数量,百分比形式(Free inodes on / (percentage))
vfs.fs.inode[/,pfree]

文件系统的inode表示可以创建的文件的最大数量。在需要创建很多文件的系统中需要密切关注这个值。如果文件系统的容量没有用完,但是inode的数量已经消耗完了,也再也不能创建文件了。

# 文件系统中的使用容量详情
vfs.fs.size

# 文件系统中指定分区(目录)中未使用的容量数值(Free disk space on /)
vfs.fs.size[/,free]

# 文件系统中指定分区(目录)中未使用的容量,百分比形式(Free disk space on / (percentage))
vfs.fs.size[/,pfree]

# 文件系统中指定分区(目录)中已使用的容量(Used disk space on /)
vfs.fs.size[/,used]

# 文件系统中指定分区(目录)的总容量(Total disk space on /)
vfs.fs.size[/,total]


3.7 Web应用信息(WebApp)

Web应用信息的参数,默认没有配置在任何模板中,需要设置了web scenario之后才能够看到。

# Web页面下载速度
web.test.in

# 指定方案中所有步骤的页面平均下载速度(Download speed for scenario "baidu.test".)
web.test.in[baidu.test,bps]

# 指定方案中指定步骤的页面下载速度(Download speed for step "baidu" of scenario "baidu.test".)
web.test.in[baidu.test,baidu,bps]

# Web应用测试是否失败(Failed step of scenario)
web.test.fail

# 指定方案是否测试失败(Failed step of scenario "baidu.test".)
web.test.fail[baidu.test]

# Web应用测试错误详情(Last error message of scenario)
web.test.error

# 指定方案中各个步骤中最后出现的错误详情(Last error message of scenario "baidu.test".)
web.test.error[baidu.test]

# Web应用响应状态码(Last error message of scenario)
web.test.rspcode

# 指定方案中指定步骤的页面响应状态码(Response code for step "baidu" of scenario "baidu.test".)
web.test.rspcode[baidu.test,baidu]

# Web应用响应时间(Response time.)
web.test.time

# 指定方案中指定步骤的页面响应时间(Response time for step "baidu" of scenario "baidu.test".)
web.test.time[baidu.test,baidu,resp]

检测Webapp的性能,页面测试是否出现错误,测试错误详情,页面的响应时间,通过页面大小和响应时间计算页面的下载速度等。


3.8 安全信息(Security)

# 求指定文件的校验和(Checksum)
vfs.file.cksum

# 求/etc/passwd的校验和(Checksum of /etc/passwd)
vfs.file.cksum[/etc/passwd]


3.9 Agent信息(Agent ping)

# Agent的在线状态(Agent ping)
agent.ping

# Zabbix Agent的hostname(Host name of zabbix_agentd running)
agent.hostname

# Agent的软件版本号(Version of zabbix_agent(d) running)
agent.version

以上介绍了Zabbix中与系统相关的监控参数,基本覆盖了获取系统信息、影响系统稳定的各种参数,各个参数之间的相互影响需要在使用过程中细细体会。