如何获取内存使用率百分比?基于Collectd与InfluxDB 1.5.1的采集场景
计算InfluxDB中Collectd采集的Web服务器内存使用率百分比
嗨,我来帮你搞定这个内存使用率计算的问题!根据你提供的Collectd采集的内存序列,我们可以通过InfluxQL查询直接算出内存使用率的百分比,下面是具体的步骤和查询语句:
先明确计算逻辑
内存使用率的核心计算方式是:
内存使用率% = (总内存 - 空闲内存 - 缓存内存 - 缓冲内存) / 总内存 × 100
这里要注意,Collectd的memory插件通常会采集type_instance=total(总内存)这个指标,你的序列里没列全,假设已经正常采集到这个指标了(如果还没的话,要确保Collectd配置里开启了该指标的采集)。
对应的InfluxQL查询语句
因为你的采集间隔是60秒,我们可以按相同的时间粒度聚合计算,查询语句如下:
SELECT 100 - ((mean("value") WHERE "type_instance" = 'free') + (mean("value") WHERE "type_instance" = 'cached') + (mean("value") WHERE "type_instance" = 'buffered')) / (mean("value") WHERE "type_instance" = 'total') * 100 AS "memory_usage_percent" FROM "memory_value" WHERE "host" = 'webserver' AND "type" = 'memory' -- 可按需添加时间范围,比如过去24小时:AND time >= now() - 24h GROUP BY time(60s)
对查询的解释
- 使用
mean("value")是为了确保每个60秒时间窗口内只有一个聚合值,避免采集过程中出现重复数据点干扰结果 - 分子部分是空闲、缓存、缓冲内存的总和,用总内存减去这个值,得到的是实际被应用占用的内存(因为缓存和缓冲内存是可以被系统回收复用的,这也是多数监控工具计算“实际使用率”的标准方式)
- 如果你的Collectd采集了
type_instance=used指标,也可以简化成(mean("value") WHERE "type_instance" = 'used') / (mean("value") WHERE "type_instance" = 'total') * 100 AS "memory_usage_percent",但要注意:Collectd的used可能包含了缓存和缓冲内存,这个结果和上面的计算会有差异,你可以根据自己的需求选择。
小提示
如果某些时间点某个指标缺失,可以在查询里加上fill(0)来处理空值,比如在GROUP BY time(60s)后面加上fill(0),不过正常采集的情况下一般不需要这个操作。
内容的提问来源于stack exchange,提问作者nbari
相关产品推荐
相关产品推荐

