版权声明:本文为博主原创文章,转载请注明出处:https://twocups.cn/index.php/2021/06/28/40/
写在前面
这一章比较特殊,因为它不是 Zabbix 的安装和部署教程,而是我的一次启动 zabbix-server 失败的排错经历记录。这个错误我在网上找了好了,都没有直接的解决方法。只有一个提问和我的情况很像,但是下面没有回答。所以我自己记录一下我这次 zabbix-server 启动失败的情况以及解决方法,希望能帮到遇到同样情况的人。如果不感兴趣,可以直接跳过这章。
配置文件填写错误
在我准备将 Zabbix 连接到 elasticsearch,从而修改配置文件 /etc/zabbix/zabbix_server.conf 的时候,不小心将
elasticsearch 地址中的“localhost”拼成了“localhsot”。之后我重启 zabbix-server 及其相关组件的时候自然是失败了。
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
毕竟这次重启 zabbix-server 修改的地方不多,所以我很快就发现自己拼错了。当我将拼错的地方修改好,并再次重启 zabbix-server 的时候,却卡住了。shell 也没有报错,就是卡住了,什么都没显示。那么我决定先看看哪里出错了。
systemctl status zabbix-server.service -l
报错:
● zabbix-server.service - Zabbix Server
Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; enabled; vendor preset: disabled)
Active: deactivating (stop-sigterm) since Wed 2021-06-16 16:01:21 CST; 33min ago
Process: 25082 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 18684 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS)
Main PID: 18688 (zabbix_server)
CGroup: /system.slice/zabbix-server.service
├─18688 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
├─18699 /usr/sbin/zabbix_server: configuration syncer #1 [terminated
├─18712 /usr/sbin/zabbix_server: housekeeper #1 [terminated]
├─18713 /usr/sbin/zabbix_server: timer #1 [terminated]
├─18715 /usr/sbin/zabbix_server: http poller #1 [terminated]
├─18717 /usr/sbin/zabbix_server: discoverer #1 [terminated]
├─18718 /usr/sbin/zabbix_server: history syncer #1 [processed 0 values, 0 triggers in 0.000027 sec, syncing history
├─18719 /usr/sbin/zabbix_server: history syncer #2 [processed 0 values, 0 triggers in 0.000016 sec, syncing history
├─18722 /usr/sbin/zabbix_server: history syncer #3 [processed 0 values, 0 triggers in 0.000013 sec, syncing history
├─18723 /usr/sbin/zabbix_server: history syncer #4 [processed 0 values, 0 triggers in 0.000016 sec, syncing history
├─18725 /usr/sbin/zabbix_server: escalator #1 [terminated]
├─18727 /usr/sbin/zabbix_server: proxy poller #1 [terminated]
├─18728 /usr/sbin/zabbix_server: self-monitoring #1 [terminated]
├─18729 /usr/sbin/zabbix_server: task manager #1 [terminated]
├─18731 /usr/sbin/zabbix_server: poller #1 [terminated]
├─18732 /usr/sbin/zabbix_server: poller #2 [terminated]
├─18733 /usr/sbin/zabbix_server: poller #3 [terminated]
├─18735 /usr/sbin/zabbix_server: poller #4 [terminated]
├─18736 /usr/sbin/zabbix_server: poller #5 [terminated]
├─18737 /usr/sbin/zabbix_server: unreachable poller #1 [terminated
├─18738 /usr/sbin/zabbix_server: trapper #1 [terminated]
├─18739 /usr/sbin/zabbix_server: trapper #2 [terminated]
├─18740 /usr/sbin/zabbix_server: trapper #3 [terminated]
├─18741 /usr/sbin/zabbix_server: trapper #4 [terminated]
├─18742 /usr/sbin/zabbix_server: trapper #5 [terminated]
├─18743 /usr/sbin/zabbix_server: icmp pinger #1 [terminated]
├─18744 /usr/sbin/zabbix_server: alert manager #1 [terminated]
├─18745 /usr/sbin/zabbix_server: alerter #1 started
├─18746 /usr/sbin/zabbix_server: alerter #2 started
├─18747 /usr/sbin/zabbix_server: alerter #3 started
├─18749 /usr/sbin/zabbix_server: preprocessing manager #1 [terminated
├─18750 /usr/sbin/zabbix_server: preprocessing worker #1 started
├─18751 /usr/sbin/zabbix_server: preprocessing worker #2 started
├─18752 /usr/sbin/zabbix_server: preprocessing worker #3 started
├─18753 /usr/sbin/zabbix_server: lld manager #1 [terminated]
├─18754 /usr/sbin/zabbix_server: lld worker #1 started
├─18755 /usr/sbin/zabbix_server: lld worker #2 started
└─18756 /usr/sbin/zabbix_server: alert syncer #1 [terminated]
Jun 16 15:57:12 * systemd[1]: Starting Zabbix Server...
Jun 16 15:57:12 * systemd[1]: zabbix-server.service: Supervising process 18688 which is not our child. We'll most likely not notice when it exits.
Jun 16 15:57:12 * systemd[1]: Started Zabbix Server.
Jun 16 16:01:21 * systemd[1]: Stopping Zabbix Server...
我尝试用 kill 指令关闭进程18688,但是没有用,它仍然存在。于是,我查了下这个18688进程。
cat /proc/18688/status
显示:
Name: zabbix_server
NStgid: 18688
NSpid: 18688
NSsid: 18685
State: S (sleeping)
Tgid: 18688
Pid: 18688
PPid: 1
TracerPid: 0
Uid: 991 991 991 991
Gid: 988 988 988 988
FDSize: 64
Groups: 988
VmPeak: 160968 kB
VmSize: 160964 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 3952 kB
VmRSS: 3952 kB
VmData: 1084 kB
VmStk: 132 kB
VmExe: 3304 kB
VmLib: 19520 kB
VmPTE: 248 kB
VmSwap: 0 kB
Threads: 1
SigQ: 9/319773
SigPnd: 0000000000000000
ShdPnd: 0000000000004000
SigBlk: 0000000000014000
SigIgn: 0000000000001000
SigCgt: 0000000180016ecf
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: ff
Cpus_allowed_list: 0-7
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 75
nonvoluntary_ctxt_switches: 3
我们从端口信息可以看到,父进程(PPid)是1,那么它大概率已经是僵尸进程了。
于是我又看了一下 Zabbix 的日志。
cat /var/log/zabbix/zabbix_server.log | tail -n 5
显示:
18722:20210616:164806.736 cannot send data to elasticsearch: Could not resolve host: localhsot; Name or service not known
18719:20210616:164806.742 cannot send data to elasticsearch: Could not resolve host: localhsot; Name or service not known
18719:20210616:164806.742 cannot send data to elasticsearch: Could not resolve host: localhsot; Name or service not known
18718:20210616:164806.746 cannot send data to elasticsearch: Could not resolve host: localhsot; Name or service not known
18718:20210616:164806.746 cannot send data to elasticsearch: Could not resolve host: localhsot; Name or service not known
我又刷新了几次,时间信息一直在变,说明这个错误一直在发生,也就是说 zabbix-server 一直在尝试将数据发送到 elastcisearch,但一直失败。失败的原因很明显,日志里 能看的出来,就是因为我之前“localhost”拼错了。但我在最开始启动失败一次之后就改回来了,所以不应该到现在还在用拼错的“localhsot”去向 elasticsearch 请求。难道是 zabbix-server 没有意识到配置文件被修改了,需要刷新一下?但是重启本身就是一种刷新,所以一定是什么其他地方出错了。
于是,我想先把不停向 elasticsearch 进行的请求先停了。回头看上面的 zabbix-server 状态信息,明显能看的出来是有四条进程在向 elasticsearch 请求同步历史数据的。
├─18718 /usr/sbin/zabbix_server: history syncer #1 [processed 0 values, 0 triggers in 0.000027 sec, syncing history
├─18719 /usr/sbin/zabbix_server: history syncer #2 [processed 0 values, 0 triggers in 0.000016 sec, syncing history
├─18722 /usr/sbin/zabbix_server: history syncer #3 [processed 0 values, 0 triggers in 0.000013 sec, syncing history
├─18723 /usr/sbin/zabbix_server: history syncer #4 [processed 0 values, 0 triggers in 0.000016 sec, syncing history
于是我想通过 kill 指令结束这四条进程,但是结束不掉。我又去看了这四条进程的状态,果然都是僵尸进程。于是我将这四条进程连同 zabbix-server 的主进程全部用“kill -9”强制结束了。但是还是无法重启 zabbix-server。
这时候,我怀疑可能不单单是 Zabbix 层面的问题了,于是我去查看了系统日志。
cat /var/log/messages
最终发现系统中的程序 Control Groups(简称 cgroups,是一个基于内核的进程级资源隔离工具)一直在重启但是失败。而报错的原因是由于“Device or resource busy”而导致有一块内存无法挂载。
于是,我打算清理一下cgroups,结果又报错了,理由还是一样的。
cgclear
报错:
cgclear failed with Device or resource busy
所以,我打算将那块挂载不上的内存先取下来。
umount /内存地址
报错:
/内存地址 Device or resource busy
于是,我想看看到底是谁在占用这块内存。
fuser -cu /内存地址
找到以后,先问问周围有没有人在用这个进程,确认之后我将这个进程结束了,然后就可以顺利取下这个之前被占用的内存。之后,我清理了 cgroups,并且重启了 cgconfig 服务。(别忘了事后自己把内存挂载回去)
umount /内存地址
cgclear
service cgconfig restart
之后,cgroups 就正常了。这时我再去启动 zabbix-server, 也能正常运行了。
总结分析
这次的排错还是蛮有代表性的,因为不是单一的原因,而是一系列的错误阴差阳粗地碰到了一起而导致了 zabbix-server 无法正常启动,甚至连报错都没有。这次错误最开始的原因其实不是 zabbix-server 的配置文件出错,而是有一个进程占用了一块内存区域,导致了进程级资源管理工具 Control Groups 卡住了,所以我重新启动 zabbix-server 的时候才发生了一系列不正常的情况。我之前在网上查资料的时候,没有发现有人找到类似的错误原因,所以写了这篇博客,希望能帮到以后遇到同样情况的人。