目录

  需求

  实现

  原理

  前端配置

  后端配置

    shell实现

    python实现

    C实现


需求:

采集主机的-/+ buffers/cache  free的数据


实现:

  采集/proc/meminfo中的数据,通过shell 、 python、 c分别来实现user parameters和Loadable modules监控方式


原理:

  首先我们先来了解linux的内存参数

  我们在centos 5 和 centos 6上输入 free -k,会返回下面的输出:

  

  在centos 7 上输入 free -k 返回结果:

  

  上面输出的数据可以从
/proc/.meminfo中匹配到对应的数据:

  

  Centos 7 里有一个MemAvailable参数用来替代-/+ buffers/cache:

    MemAvailable:  
59666176 kB

  对比下free输出和/proc/meminfo的信息:

free output

coresponding /proc/meminfo fields

Mem: total

MemTotal

Mem: used

MemTotal -
MemFree

Mem: free

MemFree

Mem: shared (can be
ignored nowadays. It has no meaning.)

N/A

Mem: buffers

Buffers

Mem: cached

Cached

-/+
buffers/cache: used

MemTotal -
(MemFree + Buffers + Cached)

-/+
buffers/cache: free

MemFree +
Buffers + Cached

Swap: total

SwapTotal

Swap: used

SwapTotal -
SwapFree

Swap: free

SwapFree

  Centos7中的信息对比:

free output

coresponding /proc/meminfo fields

Mem: total

MemTotal

Mem: used

MemTotal -
MemFree - Buffers - Cached - Slab

Mem: free

MemFree

Mem: shared

Shmem

Mem: buff/cache

Buffers + Cached
+ Slab

Mem:available

MemAvailable

Swap: total

SwapTotal

Swap: used

SwapTotal -
SwapFree

Swap: free

SwapFree

  经常会用到的参数:

    centos 5 \6 \7

      MemTotal: 内存总量

      MemFree: 系统没有使用的物理内存

      Buffers: buffer cache中的内存

      Cached: pagecache中的内存

      SwapCached: 存储在主内存中的内存,同时也在swapfile中,节省I/O

    centos 7

      MemAvailable: 不需要交换就可以启动新应用程序的内存 (等同于 -/+ buffers/cache: free)


前端配置

  我们在zabbix上新建一个监控项,点击configuration->Templates->你的系统模板->Items->Create
Item

  


后端配置

  使用shell和python来实现需要更改配置文件的Include选项,路径指向zabbix_agentd.conf.d

  Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf

  修改配置后请重启zabbix_agentd服务

shell实现:

  我们在/usr/local/etc/zabbix_agentd.conf.d/路径下新建一个memory.conf的文件,写入下面的内容:

  UserParameter=buffers.cache.memory,echo
$((`grep -E 'MemFree|Buffers|Cached' /proc/meminfo  | head -3 | awk '{print $2}' | paste -sd+ |
bc` /1024 ))

测试:

  # zabbix_agentd
-t buffers.cache.memory

  buffers.cache.memory                          [t|62525]

python实现:

  在memory.conf里面增加一行配置:

  UserParameter=buffers.cache.memory_python,python
get_memory.py

  脚本:

#!/usr/bin/python
import re def get_memory():
i = 0
key_num = re.compile('\d+')
with open('/proc/meminfo', 'r') as f:
for line in f:
if line.startswith('MemFree') or line.startswith('Buffers') or line.startswith('Cached'):
num = key_num.findall(line)
i += int(num[0])
return i if __name__ == '__main__':
print(get_memory())

  给权限:

    chmod 700 get_memory.py

    chown zabbix: get_memory.py

  测试:
    # zabbix_agentd
-t buffers.cache.memory_python

    buffers.cache.memory_python                   [t|62534]

C实现:

/*

模块应该需要将内部函数定义为静态的,并使用与Zabbix内部不同的命名模式

避免和(zbx_*)和可加载模块API函数(zbx_module_*)冲突

/*

static int      BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result);

/*

*key代表item里的key

*FLAG为CF_HAVEPARAMS或0(取决于项是否接受参数),

*FUNCTION是实现功能的具体函数

*test_param 是zabbix_agentd 使用-p启动时候用到的参数列表

/*

static ZBX_METRIC keys[] =

/*      KEY                     FLAG            FUNCTION        TEST PARAMETERS */

{

        {"buffers.cache.memory",        ,      BUFFER_FREE,    NULL},

        {NULL}

};

/*

 *获取buffer_free的数值:MemFree+Buffers+Cached

 * */

static int      BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result)

{

        int             ret = SYSINFO_RET_FAIL;

        char            line[MAX_STRING_LEN];

        zbx_uint64_t    buffer_free = ;

        zbx_uint64_t    value = ;

        FILE            *f;

        ZBX_UNUSED(request);

        if (NULL == (f = fopen("/proc/meminfo", "r")))

        {

                SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot open /proc/meminfo: %s", zbx_strerror(errno)));

                return SYSINFO_RET_FAIL;

        }

        while (NULL != fgets(line, sizeof(line), f))

        {

                if (( == strncmp(line, "MemFree:", )) || ( == strncmp(line, "Buffers:", )) || ( == strncmp(line, "Cached:", ))) //匹配三个指定的line

                {

                        if ( == sscanf(line, "%*s " ZBX_FS_UI64, &value)) //跳过第一个字符串,读取第二个字符串

                        {

                                buffer_free += value;//汇总求和

                        }

                }

        }

        SET_UI64_RESULT(result, buffer_free/);//K转换为M

        ret = SYSINFO_RET_OK;

        zbx_fclose(f);

        if (SYSINFO_RET_FAIL == ret)

                SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot find a line with \"haha\" in /proc/meminfo."));

        return ret;

}

/*

*如果成功获得项值,函数应该返回SYSINFO_RET_OK。否则,应该返回SYSINFO_RET_FAIL

*/

  编译:

    gcc -fPIC -shared -o buffer_free.so buffer_free .c -I ../../../include/

    这里的include在zabbix的源码编译安装文件里可以找到

  给权限

    chmod 700 buffer_free.so

    chown zabbix: buffer_free.so

  更改zabbix_agentd.conf的配置,增加:

    LoadModule= buffer_free.so

  重启zabbix_agentd服务,上面的shell和python在实际的监控应用中也是需要重启服务的,使用zabbix_agentd -t 只是测试,不需要重启服务

    service Zabbix_agentd restart

  测试:

    # zabbix_agentd -t buffers.cache.memory

    buffers.cache.memory                          [u|1250]

zabbix user parameters和Loadable modules的使用方法介绍的更多相关文章

  1. zabbix 自带监控项报性能问题解决方法

    类似报警信息为:Zabbix discoverer processes more than 75% busy 解决方法:修改zabbix_server配置 原因:每个discovery任务在一定时间内 ...

  2. zabbix API基本使用方法介绍

    前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...

  3. zabbix 监控 图形化界面文字乱码解决方法

    zabbix安装后之后,很多小伙伴第一时间都是去设置中文界面,发现页面.菜单等可以正常显示中文,但是 唯有图形显示方块,无法正常显示汉字,按照百度教程,上传windows字体,修改配置文件的2处字体配 ...

  4. zabbix中Templates的jmx相关key调试方法

    1.下载 cmdline jmxclient 如果你有一个完美的模版,你可能可以忽略此步.但是大多数情况下你没有.况且 zabbix 默认的 tomcat 模版也不能很好的工作.这时候有一个工具来调试 ...

  5. Zabbix 4.4管理界面中文乱码解决方法

    1.zabbix 4.4 安装配置过程可参考官方文档: 文档链接地址:https://www.zabbix.com/download?zabbix=4.4&os_distribution=ce ...

  6. Laravel 获取 Route Parameters (路由参数) 的 5 种方法

      Laravel 获取路由参数的方式有很多,并且有个小坑,汇总如下.   假设我们设置了一个路由参数:   现在我们访问 http://test.dev/1/2   在 TestController ...

  7. zabbix告警时间和恢复时间相同的解决方法

    出现原因:在动作,恢复操作中,恢复时间成了{EVENT.DATE} {EVENT.TIME},所以和告警时间相同. 解决方法:将{EVENT.DATE}{EVENT.TIME}改成{EVENT.DAT ...

  8. 关于 cannot create Parameters: [] 报错问题的解决方法

    其实在Sort类中添加无参构造就可以解决 我自己写的是Sort类,其它情况得视你们自己写的类决定 至于为什么也不是很清楚

  9. grub paramiter & menu.list

    在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...

随机推荐

  1. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  2. Python进阶量化交易场外篇3——最大回撤评价策略风险

    新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...

  3. 全局最小割StoerWagner算法详解

    前言 StoerWagner算法是一个找出无向图全局最小割的算法,本文需要读者有一定的图论基础. 本文大部分内容与词汇来自参考文献(英文,需***),用兴趣的可以去读一下文献. 概念 无向图的割:有无 ...

  4. 第二阶段冲刺——seven

    个人任务: 马佳慧:设计界面背景,统一风格. 王金萱:整体运行测试上传到公网上的程序. 季方:修改优化已上传的代码. 司宇航:整体调试程序继续优化. 站立会议: 任务看板和燃尽图:

  5. Beta版项目总结

    1.设想与目标 我们的产品名是理财猫,为了解决当今大学生花钱不知道节制以及不知道花的钱都去哪了的痛苦,提醒他们该记录这一天的消费情况,我们有独特的办法那就是将记账软件和闹钟结合起来,每天定时的提醒用户 ...

  6. RYU 的选择以及安装

    RYU 的选择以及安装 由于近期的项目需求,不得已得了解一下控制器内部发现拓扑原理,由于某某应用中的控制器介绍中使用的RYU,所以打算把RYU装一下试试.出乎意料的是,RYU竟是我之前装过最最轻便的控 ...

  7. Ubuntu安装eclipse,并创建桌面快捷方式

    系统:Ubuntu 16.04 JDK版本:1.8.0_121 Ubuntu下安装JDK配置环境变量可见我的这篇文章   http://www.cnblogs.com/AloneZ/p/Ubuntu1 ...

  8. Xdebug原理

    前言: 前面一篇博文记录了Xdebug的安装配置.配置使用起来相对简单易懂,那么Xdebug的实现原理又是如何呢?所以就找了些资料来理解下其中的原理. 内容: Xdebug工作原理 1,IDE(如Ph ...

  9. python文本替换

    file_data = '' str1 = ' str2 = ' with open(loginfofile, 'r+') as f: #打开文件,r+模式,读取 for line in f: if ...

  10. Mybatis 从入门到精通一:mybatis的入门

    1.Mybatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation(阿帕奇软件基金会) 迁移到了google ...