带有Zabbix的Python脚本导致SeTrouble高CPU使用率



我正在利用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 进行调度。 那么它只是一个有性能问题的脚本。

最新更新