Zabbix源码解析之windows性能计数器performance counter采值问题修正

Zabbix的cpu性能监控对windows的performance counter值的修正处理(以system.cpu.util为例)

问题描述:在使用perf_counter监控项时cpu使用率不定期突然飙高到100%

环境:zabbix agent 4.0+windows

问题分析:

zabbix自身会保持一个counter列表,其中的元素使用zbx_perf_counter_data_t结构体来存储数据,如下图所示,其中的value_array成员是一个循环列表,而rawValues数组用于存储从windows性能计数器获取的原始数据,sum和value_count分别为value_array中存储的值的合计以及个数。这一结构中的数据由zabbix collector进程负责写入和更新,并由agentd进程读取作为最终的cpu性能、硬盘性能等监控项的值。

 

一、Zabbix collector进程计算和更新counter中数据的过程如下:

l 首先,如下图所示,zabbix agent端的collector进程每隔1秒调用一次collect_perfstat函数(也可能同时调用zbx_procstat_collect函数);

l 然后,collect_perfstat函数负责从windows系统的performance counter中收集数据。如下图所示,collect_perfstat会调用zbx_PdhGetRawCounterValue函数和PdhCalculateCounterFromRawValue函数来获取并计算每一个counter的rawValues、sum、value_count成员的值。对于那些处于notsupported状态的counter,该函数会每隔10分钟进行一次检查,并激活或者添加counter。

 

二、Zabbix agentd进程会通过两类监控项来读取counter结构中的数据,一个是perf_counter,另一个是以system.cpu.util为代表的system类监控项,如下图所示。

perf_counter在执行时实际所使用的函数为PERF_COUNTER,该函数最终调用get_perf_counter_value_by_path函数进行实际计算。下图为其计算过程代码,具体步骤为:

  • 获取counter列表访问锁,从当前counter列表中查找到符合条件的counter,并扩展该counter的interval;
  • 然后计算该counter中的数据的平均值(使用compute_average_value函数)作为结果;
  • 如果没有找到符合条件的counter,则添加counter,并调用calculate_counter_value函数进行计算;
  • 释放counter列表锁,调用calculate_counter_value函数计算最近1秒的性能数据,并对value结果赋值。

system.cpu.util 在执行时实际所使用的函数为SYSTEM_CPU_UTIL,该函数最终调用get_perf_counter_value函数对监控项进行计算。get_perf_counter_value函数也会尝试从counter中获取数据然后计算平均值并返回。但是,与perf_counter不同的是,当从counter获取数据失败时(counter不存在,或者状态不是active),get_perf_counter_value函数会直接返回错误,而不会添加counter并重算。

总之,当我们采集cpu的一分钟平均使用率时,perf_counter监控项在特定情况下会以一秒钟的cpu使用率作为返回结果,而在一秒钟这样的短周期内cpu使用率很可能达到100%。而system.cpu.util不会使用一秒的cpu使用率作为返回结果,因此更加可靠。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zabbix Server是一个开的网络监控系统,其码是用C语言开发的。以下是对Zabbix Server码的简要解析: 1. 主要组件:Zabbix Server的码包含了多个主要组件,包括服务器引擎、数据库接口、配置文件解析器、监控项处理器、报警触发器等。 2. 数据库接口:Zabbix Server使用支持SQL的关系型数据库来存储监控数据和配置信息。码中实现了对不同数据库的接口,包括MySQL、PostgreSQL、Oracle等。 3. 配置文件解析器:Zabbix Server使用配置文件来定义监控项、触发器、报警等设置。码中包含了一个配置文件解析器,用于解析和加载配置文件中的信息。 4. 监控项处理器:Zabbix Server通过监控项来收集各种指标数据,如CPU使用率、内存使用量等。码中实现了对各种监控项类型的处理和数据收集。 5. 报警触发器:Zabbix Server可以根据定义的触发条件来触发报警动作,如发送邮件、短信等。码中包含了触发条件的处理逻辑和报警动作的实现。 6. 网络通信:Zabbix Server需要与各个被监控主机进行通信,收集监控数据。码中实现了基于TCP/IP协议的网络通信模块,用于与被监控主机建立连接和数据交换。 这些是对Zabbix Server码的简要解析,它们只是码中的一小部分内容。如果你对特定的功能或模块有更具体的问题,我可以提供更详细的解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值