最近在我们的zabbix 服务器上发现zabbix unreachable poller processes more than 75 busy的报警,
然后就看了一下zabbix的内部进程监控发现如下:
unreachable poller processes 一直在处于busy的状态,那这个具体代表什么意思呢,查看官方文档
zabbix internal process
unreachable poller - poller for unreachable devices 用于轮询不可到达到的设备;
什么时候会出现这种情况:
1.通过Zabbix agent采集数据的设备处于moniting的状态但是此时机器死机或其他原因导致zabbix agent死掉server获取不到数据,此时unreachable poller就会升高。
2.通过Zabbix agent采集数据的设备处于moniting的状态但是server向agent获取数据时时间过长,经常超过server甚至的timeout时间,此时unreachable poller就会升高。
目前我个人发现unreachable poller升高基本都是以上两种原因导致的。
虽然Zabbix的监控警报各种有,但Kaijia使用碰到最多的几个莫过于内存耗尽,网络不通,IO太慢还有这个“Zabbix poller processes more than 75% busy”了。一开始的时候因为这个即不影响使用也持续一会儿就自行解决就没有多在意。然后随着数据库的增大,Zabbix消耗的内存可是越来越多,Poller processes(轮询)开始天天Busy了,最终Kaijia不得不把Zabbix挪到了另外一台服务器上。
但这并没有彻底解决问题,警报仍然三天两头来几个。之后Kaijia开启了Zabbix警报的邮件功能,于是开始频繁收到这类邮件,于是Kaijia决定解决这个问题。Google了一下资料,没有找到很权威的答案,造成轮询忙的问题有很多中,支撑Zabbix的MySQL卡住了,Zabbix服务器的IO卡住了都有可能,Zabbix进程分配到内存不足都有可能。一个简单的方法是增加Zabbix Server启动时初始化的进程数量,这样直接增加了轮询的负载量,从比例上来讲忙的情况就少了。
增加初始化进程的方法非常简单,编辑Zabbix Server的配置文件/etc/zabbix/zabbix_server.conf,找到配置StartPollers的段落:
### Option: StartPollers
# Number of pre-forked instances of pollers.
#
# Mandatory: no
# Range: 0-1000
# Default:
# StartPollers=50
取消StartPollers=一行的注释或者直接在后面增加:
StartPollers=100
将StartPollers改成多少取决于服务器的性能和监控的数量,将StartPollers设置成100之后就再没有遇到过警报。如果内存足够的话可以设置更高。设置完成之后运行:
service zabbix-server restart
重启Zabbix。当然另外一种从整体上降低Zabbix服务器负载的方法就是定期重启Zabbix,这种方法可以用Cron实现,运行:
crontab -e
在调出的Cron编辑器中增加一个计划:
@daily service zabbix-server restart > /dev/null 2>&1
这个计划会每天自动重启Zabbix服务以结束僵尸进程并清理内存等。目前这样配置Zabbix后还没有再次遇到过“Zabbix poller processes more than 75% busy”的问题。
重启之后又有新问题出现
[file:dbconfig.c,line:94] __zbx_mem_realloc(): out of memory (requested 3356
错误原因:内存溢出
打开zabbix_server.conf 找到 Option: CacheSize
把原来的 # CacheSize=8M 前面的#注释去掉,将8M修改为1024,这个1024根据服务器性能修改
/etc/zabbix/zabbix_server.conf
## Option: CacheSize
# Size of configuration cache, in bytes.
# Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-8G
# Default:
CacheSize=1024M
重启 出现问题:
connection to database 'zabbix' failed: [1040] Too many connections
数据库连接数达到最大
为什么修改这个?因为我zabbix-server日志报错,提示connection to database ‘zabbix’ failed: [1040] Too many connections错误,mariadb正常。想到应该是mysql最大连接数问题。
实时查看mariadb数据库连接数命令(Threads):
[root@localhost ~]# mysqladmin -uroot -p status
Enter password:
Uptime: 1888 Threads: 615 Questions: 211118 Slow queries: 1 Opens: 189 Flush tables: 2 Open tables: 215 Queries per second avg: 111.820
1、查看默认最大连接数,默认是151
[root@localhost zabbix]# /usr/bin/mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14872
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
2、修改/etc/my.cnf配置文件
在[mysqld]新添加一行:
[root@localhost zabbix]# vi /etc/my.cnf
max_connections=1000
重启mariadb服务,并验证最大连接数(没显示我们修改的):
[root@localhost zabbix]# systemctl restart mariadb.service
[root@localhost zabbix]# /usr/bin/mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 446
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 214 |
+-----------------+-------+
1 row in set (0.00 sec)
3、配置/usr/lib/systemd/system/mariadb.service来调大打开文件数目。
[root@localhost zabbix]# vi /usr/lib/systemd/system/mariadb.service
在[Service]新加这两行:
LimitNOFILE=10000
LimitNPROC=10000
4、重新加载系统服务,并重启mariadb服务
[root@localhost zabbix]# systemctl --system daemon-reload
[root@localhost zabbix]# systemctl restart mariadb.service
5、重新验证下,是否为1000
MariaDB [(none)]> show variables like 'max_connections';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 5
Current database: *** NONE ***
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1000 |
+-----------------+-------+
1 row in set (0.00 sec)
重启还是不行
按照下表的参数设置,错误消除!!
Zabbix服务端的常用参数如下:(参数取值根据服务器配置)
参数 | 必填 | 范围 | 默认值 | 描述 |
---|---|---|---|---|
CacheSize | no | 128K-8G | 8M | 缓存大小, 单位字节.用于存储主机、监控项、触发器数据的共享内存大小.服务器分配有4G设置为:CacheSize=256M |
CacheUpdateFrequency | no | 1-3600 | 60 | Zabbix 缓存更新频率, 单位秒.60秒感觉太快了设置为:CacheUpdateFrequency=180 |
DebugLevel | no | 0-5 | 3 | 指定调试等级:0 - Zabxxi进程起停的基本信息1 - 重要信息2 - 错误信息3 - 警告信息4 - 调试 (产生大量信息)5 - 扩展调试 (产生更多信息) |
HistoryCacheSize | no | 128K-2G | 16M | 历史缓存数据大小, 单位字节.存储历史数据.设置为:HistoryCacheSize=64M |
HistoryIndexCacheSize | no | 128K-2G 4M | 历史索引缓存大小, 单位字节. | 用于索引历史缓存中历史数据的共享内存大小.缓存一个item大概需要索引的大小为100字节.item代表一个监控项,按照100000个监控项来算:100000*100/1024/1024=9.6M设置为:HistoryIndexCacheSize=10M |
HousekeepingFrequency | no | 0-24 | 1 | Zabbix 执行 housekeeping 的频率 (单位小时).从数据库中删除过期的信息.注意: 为了防止 housekeeper 过载 (例如, 当历史和趋势周期大大减小时), 对于每一个item,不会在一个housek周期内删除超过4倍HousekeepingFrequency 的过时信息. 因此, 如果 HousekeepingFrequency 是 1, 一个周期内不会删除超过4小时的过时信息 (starting from the oldest entry) . |
StartPollersUnreachable | no | 0-1000 | 1 | 不可达主机 (包括IPMI 和 Java)的轮询器实例数量。设置为:StartPollersUnreachable=20 占总数20%足够 |
StartPollers | no | 0-1000 | 5 | 轮询器实例数量。根据具体情况设置大小设置为:StartPollers=30 |
StartDiscoverers | no | 0-250 | 1 | 自动发现子进程实例个数。设置为:StartDiscoverers=5 |
StartTrappers | no | 0-1000 | 5 | trappers进程实例数量。Trappers接受来自Zabbix发送者、主动agents和主动proxies的传入连接。至少要运行一个trapper进程来显示前端的服务器可用性和视图队列。设置为:StartTrappers=15 |
StartVMwareCollectors | no | 0-250 | 0 | vmware 采集器的子进程实例个数,如果有虚拟机的话,记得开启。 |
Timeout | no | 1-30 | 3 | agent, SNMP 设备或外部检查的超时时长(单位秒)。设置为:Timeout=6 |
TrendCacheSize | no | 128K-2G | 4M | 趋势缓存的大小,单位字节。用于存储趋势数据的共享内存大小。设置为:128M |
ValueCacheSize | no | 0,128K-64G | 8M | 历史数据缓存大小, 单位bytes.缓存item历史数据请求的共享内存大小.0即禁止缓存 (不建议).当缓存大小超过共享内存时,每5分钟会向服务器日志写入一条警告信息.设置为:ValueCacheSize=128M |
二、zabbix监控状态情况
Zabbix自带模版监控各工作进程的状态,根据数据收集过程中的性能做分析,适合调整配置参数。
图一为Cache Size=8M的时候,可用为70%
设置为:CacheSize=256M
设置为:HistoryCacheSize=64M
设置为:HistoryIndexCacheSize=10M
图2为调整CacheSize后,三个触发器可用都在90%以上。
2、 Zabbix data gathering process busy %
图3为调整前的配置信息
设置为:StartPollers=30
设置为:StartPollersUnreachable=20
设置为:StartDiscoverers=5
图4为调整后的配置信息,三个触发器占用最大都没有超过50%
4、Zabbix internal process busy %
其中Zabbix busy history syncer processes:写入数据库的同步程序占缓存的百分比在重启服务时占用飙升一会,其他基本正常。
5、Preprocessing为预处理:
使用这个功能可以对item收到的数据行处理,处理之后再存入数据库或展示出来,提高监控的效率,降低了系统负荷,减少网络流量
3.4版本的新功能,如果要用到其他程序上去,需要自己创建item,配合使用。
6、Zabbix服务器性能状态:
其中左侧纵坐标代表通过zabbix服务器每秒处理的值,图形中用绿色表示;
右侧纵坐标代表需要处理写入数据库的列队值,图形中用红色表示。等待列队逐渐增多,说明性能越来越差。
三、Zabbix报错信息处理
1、Zabbix poller processes more than 75% busy:
2、 icmp pinger processes more than 75% busy
3、zabbix unreachable poller processes more than 75 busy
4、zabbix的WEB界面刷新卡死
5、数据库连接超出
这类报错比较多,首先检查zabbix-server配置信息
StartPollers、StartDiscoverers、StartPingers、StartPollersUnreachable等等,根据上面的【Zabbix服务端的常用参数】核对下。
然后在检查:
根据服务器性能状态、队列、数据库配置信息