zabbix监控某进程内存占用率解决方案

   

Linux

  • 方案一:使用zabbix自带的proc.mem函数

创建监控项,注意这里获取到的值是进程使用掉的虚拟内存量 (Kbytes) ,实际上来说, linux, AIX, FreeBSD 和 Solaris 都支持memtype参数,具体想要获得哪种内存参数可以查看zabbix的文档,讲的很详细。

创建触发器,这里是占用超过总内存30%告警,当然也可以设定内存量达到某一个特定值告警:

效果如下:

  • 方案二 : 通过Shell脚本使用ps命令执行结果监测

1、查看ps命令输出

# ps -aux|grep BT-Panel
root      1182  1.4  2.2 207848 44960 ?        Sl   08:57   0:02 /usr/bin/python /www/server/panel/BT-Panel
root      3309  0.0  0.0  13136  1028 pts/0    S+   09:00   0:00 grep --color=auto BT-Panel

2、编写shell脚本,获取其中的内存占用率,注意一点,这里输出的是进程所占用的物理内存百分比

# cat btmem.sh 
ps -aux|grep BT-Panel|awk -F: 'NR==1{print FILENAME, $0}'|awk -F " " '{print $5}'

3、 依据前面的文章《zabbix使用自定义脚本监控外网ip》,将脚本加入进zabbix的监控体系中去。

效果如下:

  • 方案三: python的psutil包

与windows系统类似,不在赘述。

Windows

由于windows不支持 proc.mem 函数,只能通过脚本的方式来完成对内存的监控

  • 方案一 : python的psutil包

psutil包是一个跨平台的系统监控python包,本方法同样适用Linux、Aix等能够运行python程序的系统。

1、 安装 python 、psutil

首先从python下载安装python3,在cmd中使用python -m pip install psutil 安装psutil包。

2 编写python脚本,检查应用程序内存占用率,如果你要检测某个进程的内存占用率,你可以这样写:

# -*- coding: UTF-8 -*-
import sys
import time
import psutil

def get_proc_by_id(pid):
    return psutil.Process(pid)

def get_proc_by_name(pname):
    """ get process by name
    return the first process if there are more than one
    """
    for proc in psutil.process_iter():
        try:
            if proc.name().lower() == pname.lower():
                return proc.pid  # return if found one
        except psutil.AccessDenied:
            pass
        except psutil.NoSuchProcess:
            pass
    return None

if '__main__' == __name__:
p = psutil.Process(get_proc_by_name("Chrome.exe"))#这里修改进程的名字
mem_percent = p.memory_percent()
print(str(mem_percent))

现代windows程序一般都会有一堆进程,不要慌,你可以这样写,把所有找到的叫这个名字的进程内存占用率相加。

# -*- coding: UTF-8 -*-
import sys
import time
import psutil

def get_proc_by_id(pid):
    return psutil.Process(pid)

def get_proc_by_name(pname):
    """ get process by name
    return the first process if there are more than one
    """
    counter = 0
    for proc in psutil.process_iter():
        try:
            if proc.name().lower() == pname.lower():
                p = psutil.Process(proc.pid)
                mem_percent = p.memory_percent()
                counter = counter + mem_percent
        except psutil.AccessDenied:
            pass
        except psutil.NoSuchProcess:
            pass
    return counter

if '__main__' == __name__:
        llo=get_proc_by_name("Chrome.exe")#这里修改进程的名字
        print(llo)

3 依据前面的文章《zabbix使用自定义脚本监控外网ip》,将脚本加入进zabbix的监控体系中去。

效果如下:

只要将数据取出来,对数据的一系列操作就能够顺利进行了。

发表评论