zabbix 监控客户端进程Cpu && Mem

zabbix 监控客户端进程Cpu && Mem

有几台win10的机器,经常cpu过高导致服务不可用,但是不知道是哪个进程导致的。特地加个cpu监控进程的脚本,此外也会加linux系统的,详情请参考下面

进程Cpu

linux环境下

对于linux环境,对进程的cpu是非常简单的,zabbix3.0以上就对进程的cpu加入了监控,我们直接添加指标即可
我这里安装的5.0,可以参考官方文档,其他版本也请参考官方文档,官方yyds
linux环境指标

# 搜素这个指标,先看看用法,因为接下来我们要用
proc.cpu.util[<name>,<user>,<type>,<cmdline>,<mode>,<zone>]

打开zabbix,登陆后,点击:
配置》主机》监控项》创建监控项

  • 名称: 监控项的名称,图形、触发器什么的都可以基于这个创建和定制
  • 键值: 输入上面的proc.cpu.util[xxxxxxxx],xxx处自己根据官方文档调整<>的内容哈
  • 信息类型: 浮点型
  • 更新间隔: 你说了算,1m可以,30s也可以
  • 应用集: procpu 相当于新建一个procpu的应用集,后面找比较好找,一个类型的集合

添加完成后,我们去验证下,点击:
监测》最新记录》点击你刚加的机器》监控项 找到你新加的监控项,看看有没有数据就可以了

win10 windows环境下

zabbix6.0版本的时候我看的,它还不支持proc.cpu.util 这个指标,所以没办法像linux环境那么简单方便了
对windows监控的思路是添加一个脚本,让zabbix-agent执行脚本获取数据,再将数据发给 zabbix-server

ok,接下来搞个监控windows下各个进程占CPU的脚本

思路是这样的:
powershell下,执行Get-Process 可以获取到各个进程的状态,其中包含cpu的状态,cpu(s),但是这个cpu(s)的意思是自该程序启动后,共占用cpu的时间,是累积增加的一个数值,单位为秒,
我Get-Process读取获取当前状态,然后把获取的状态存储到aaa.txt这个文件里,下一次执行的时候,获取完状态,我看看本地有没有aaa.txt这个文件,如果有就读取aaa.txt,和我这次执行获取的内容比对,根据cpu的差值排序,以此计算出两次脚本执行期间,cpu累计之间的差值,由此来判断这段时间哪个应用的cpu占用较大。

下面是脚本 编辑一个 top_cpu.ps1 这样一个文件

function Get-ProcessCpuUsage {
    param (
        [int]$topN = 15
    )

    # 定义文件路径
    $filePath = "aaa.txt"

    # 如果 aaa.txt 文件存在,则读取内容
    if (Test-Path -Path $filePath) {
        $previousProcessData = Import-Csv -Path $filePath
    }
    else {
        # 获取当前的进程信息并保存到 aaa.txt 文件
        $currentProcessData = Get-Process | Select-Object Id, ProcessName, CPU, @{Name='TimeStamp';Expression={Get-Date}}
        $currentProcessData | Export-Csv -Path $filePath -NoTypeInformation
        $previousProcessData = $currentProcessData
    }

    # 获取当前的进程信息
    $currentProcessData = Get-Process | Select-Object Id, ProcessName, CPU, @{Name='TimeStamp';Expression={Get-Date}}

    # 计算CPU使用时间差
    $cpuUsages = foreach ($previousProcess in $previousProcessData) {
        $currentProcess = $currentProcessData | Where-Object { $_.Id -eq $previousProcess.Id }
        if ($currentProcess) {
            $cpuTimeDifference = $currentProcess.CPU - $previousProcess.CPU
            [pscustomobject]@{
                ProcessName = $previousProcess.ProcessName
                CPUTimeDifference = $cpuTimeDifference
            }
        }
    }

    # 按CPU使用时间差排序并取前N个
    $topCpuUsages = $cpuUsages | Sort-Object CPUTimeDifference -Descending | Select-Object -First $topN

    # 输出结果
    foreach ($cpuUsage in $topCpuUsages) {
        Write-Host "$($cpuUsage.ProcessName) used: $($cpuUsage.CPUTimeDifference) seconds of CPU time"
    }

    # 更新 aaa.txt 文件为当前的进程数据
    $currentProcessData | Export-Csv -Path $filePath -NoTypeInformation
}

# 调用函数获取前15个CPU使用时间最高的进程
Get-ProcessCpuUsage -topN 15

脚本编辑好了,我们在win10上运行它试试
点击电脑左下角搜索 powershell, 注意: 点击以管理员身份运行

# cd 到你这个脚本的路径下执行这个脚本
cd C:\Users\丽丽小可爱\Desktop>
.\top_cpu.ps1

如果运行报错禁止执行脚本,可以调整权限放开

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
# 后输入Y,允许后,再次执行脚本
.\top_cpu.ps1

脚本能正常运行验证完成后,把这个top_cpu.ps1 脚本放到zabbix-agent端配置文件的相同目录
我的zabbix-agent部署的时候是默认的,路径一般是在
C:\Program Files\Zabbix Agent 下面,我们进入这个目录去编辑zabbix-agent的配置文件,追加以下内容

# 编辑 zabbix_agentd.conf 配置文件

UserParameter=custom.cpu.top.processes,powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix Agent\top_cpu.ps1"

点击任务管理器(ctrl+alt+delete),点击服务,下来找到zabbix_agent 右键重启服务

接下来配置服务端:
打开zabbix,登陆后,点击:
配置》主机》监控项》创建监控项

  • 名称: 监控项的名称,图形、触发器什么的都可以基于这个创建和定制
  • 键值: 输入上面的custom.cpu.top.processes ,这是我们在zabbix-agent配置文件里配置的哈,就刚刚改的
  • 信息类型: 文本型
  • 更新间隔: 你说了算,1m可以,30s也可以
  • 应用集: procpu 相当于新建一个procpu的应用集,后面找比较好找,一个类型的集合

添加完成后,我们去验证下,点击:
监测》最新记录》点击你刚加的机器》监控项 找到你新加的监控项,看看有没有数据就可以了

Mem

待更新

posted @ 2024-06-13 21:00  liwenchao1995  阅读(10)  评论(0编辑  收藏  举报