python 带有 zabbix 的脚本导致 setroubleshootd 高 CPU 使用率
python script with zabbix causing setroubleshootd high CPU usage
我将 Zabbix 与自定义低级发现结合使用,该发现使用 Python 发现 REST/API 端点。当轮询开启时,CPU 利用率会飙升。所有 CPU 用法都是由 setroubleshootd 引起的,如顶部所示:
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" 是 shorthand 的脚本。该脚本是一个调用我的 python 脚本的 bash 文件。调用看起来像这样:
#!/usr/bin/env bash
/usr/bin/python /etc/zabbix/externalscripts/discovery.py
当 zabbix 调用脚本时,它会传递唯一的过滤器,如服务器 ID 或网卡 ID,作为参数之一。 python 脚本使用请求打开一个 https 会话,如果令牌文件存在,则利用不记名令牌。如果令牌文件不存在,它会创建它。
该脚本工作正常并完成了它应该做的所有事情,但 setroubleshoot 正在重新启动一系列问题,特别是围绕文件夹访问。大量的 setroubleshootd 响应导致 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
但是由于文件名是随机的,所以错误仍然存在。我已经尝试卸载 setroubleshootd,selinux 只是重新安装它。不幸的是,我需要 运行 强制模式,因此不能选择允许或禁用。
我试过改变,这样我就不会 运行 宁 bash 脚本,zabbix 直接调用 python 脚本,或者声明 shebang /usr/bin/python ,但传递参数似乎无法正常工作。我收到一条错误消息,指出 $1 $2... 是未知参数。
此时不知所措。它是 运行ning,但我真的很想降低 CPU 的使用率,因为 4 个内核的 60% 对于 30-40 个 HTTPS 调用是不合理的。
外部脚本必须在您的超时值内完成,这听起来太大了。您可以将其转换为 zabbix_sender 并通过 cron 安排它。那就只是一个有性能问题的脚本。
我最终为此编写了一个 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 与自定义低级发现结合使用,该发现使用 Python 发现 REST/API 端点。当轮询开启时,CPU 利用率会飙升。所有 CPU 用法都是由 setroubleshootd 引起的,如顶部所示:
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" 是 shorthand 的脚本。该脚本是一个调用我的 python 脚本的 bash 文件。调用看起来像这样:
#!/usr/bin/env bash
/usr/bin/python /etc/zabbix/externalscripts/discovery.py
当 zabbix 调用脚本时,它会传递唯一的过滤器,如服务器 ID 或网卡 ID,作为参数之一。 python 脚本使用请求打开一个 https 会话,如果令牌文件存在,则利用不记名令牌。如果令牌文件不存在,它会创建它。
该脚本工作正常并完成了它应该做的所有事情,但 setroubleshoot 正在重新启动一系列问题,特别是围绕文件夹访问。大量的 setroubleshootd 响应导致 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
但是由于文件名是随机的,所以错误仍然存在。我已经尝试卸载 setroubleshootd,selinux 只是重新安装它。不幸的是,我需要 运行 强制模式,因此不能选择允许或禁用。
我试过改变,这样我就不会 运行 宁 bash 脚本,zabbix 直接调用 python 脚本,或者声明 shebang /usr/bin/python ,但传递参数似乎无法正常工作。我收到一条错误消息,指出 $1 $2... 是未知参数。
此时不知所措。它是 运行ning,但我真的很想降低 CPU 的使用率,因为 4 个内核的 60% 对于 30-40 个 HTTPS 调用是不合理的。
外部脚本必须在您的超时值内完成,这听起来太大了。您可以将其转换为 zabbix_sender 并通过 cron 安排它。那就只是一个有性能问题的脚本。
我最终为此编写了一个 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
希望这对 运行 解决此问题的其他人有所帮助。