我正在利用Zabbix进行自定义低级发现,该发现使用Python发现REST/API端点。当轮询处于打开状态时,CPU 利用率会飙升。所有 CPU 使用率都是由故障排除引起的,如顶部所示:
top - 13:51:56 up 15:33, 1 user, load average: 1.52, 1.43, 1.37
Tasks: 127 total, 3 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 35.8 us, 6.7 sy, 0.0 ni, 57.3 id, 0.1 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 8010508 total, 6211020 free, 397104 used, 1402384 buff/cache
KiB Swap: 1679356 total, 1679356 free, 0 used. 6852016 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7986 setroub+ 20 0 424072 130856 11548 R 77.4 1.6 7:12.16
Zabbix调用代理并请求执行"UserParameter",这是脚本的简写。该脚本是一个调用我的python脚本的bash文件。调用如下所示:
#!/usr/bin/env bash
/usr/bin/python /etc/zabbix/externalscripts/discovery.py $1 $2 $3 $4 $5
当zabbix调用脚本时,它会将唯一的过滤器(如服务器ID或网卡ID)作为参数之一传递。python 脚本使用请求打开 https 会话,如果令牌文件存在,则利用持有者令牌。如果令牌文件不存在,则会创建它。
该脚本运行良好,可以执行它应该执行的所有操作,但是Sefail正在重新启动一系列问题,特别是在文件夹访问方面。大量的故障排除响应导致CPU发疯。下面是错误的示例:
python: SELinux is preventing /usr/bin/python2.7 from create access on the file 7WMXFl.
文件名是随机的,每次执行都会更改。我尝试使用 selinux 工具添加异常,例如:
ausearch -c 'python' --raw | audit2allow -M my-python
但由于文件名是随机的,因此错误仍然存在。我试过卸载 setroubleed,selinux 只是重新安装它。不幸的是,我需要运行强制模式,因此下降到允许或禁用不是选项。
我尝试进行更改,以便我不运行bash脚本,zabbix直接调用python脚本,或声明shebang/usr/bin/python,但是传递参数似乎无法正常工作。我收到一个错误,指出 $1 $2...是未知的参数。
此时不知所措。它正在运行,但我真的很想降低 CPU 使用率,因为 60-4 个内核的 30% 对于 30-40 个 HTTPS 调用是不合理的。
我最终为此编写了一个SEModule,它允许zabbix用户对创建和管理这些文件的/tmp文件夹进行写入访问。CPU 使用率从 75% 下降到 2%。#NailedIt
$>sudo ausearch -m avc | grep zabbix | grep denied | audit2allow -m zabbixallow > my_script.te
$>checkmodule -M -m -o zabbixallow.mod my_script.te
$>semodule_package -o zabbixallow.pp -m zabbixallow.mod
$>sudo semodule -i zabbixallow.pp
希望这对其他人有所帮助,如果他们遇到这个问题。
外部脚本必须在超时值内完成,这听起来太大了。 您可以将其转换为zabbix_sender并通过 cron 进行调度。 那么它只是一个有性能问题的脚本。