You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Grafana偶现‘无数据点’但InfluxDB存在数据的问题排查求助

排查Grafana图表"No data points"且InfluxDB并行查询慢的问题

针对你遇到的长时间范围查询时Grafana频繁显示"No data points"、但直接查询InfluxDB速度快、并行查询卡顿的问题,我整理了以下针对性的排查步骤:

1. 检查Grafana数据源的查询超时设置

虽然你提到日志没显示超时,但Grafana对InfluxDB的默认查询超时(通常30秒)可能在长范围+并行查询场景下被触发,且未必会留下明确日志:

  • 进入Grafana的Configuration > Data Sources,找到你的InfluxDB数据源
  • 查看Query timeout参数,尝试调大(比如改为60秒),再测试30天时间范围的查询是否恢复正常

2. 分析InfluxDB查询的执行效率(重点看索引与扫描范围)

单个查询快但并行慢,大概率是大数据量下的查询执行开销被放大了,用EXPLAIN ANALYZE深挖细节:

  • 把Grafana里的查询替换成具体参数,比如:
    EXPLAIN ANALYZE SELECT percentile("usage_system", 95) FROM "cpu" WHERE "host" =~ /^your-test-host$/ AND time >= now() - 30d GROUP BY time(1m), "host"
    
  • 重点关注这几个指标:
    • number of shards scanned:如果扫描分片数过多(比如超过5个),说明分片时间设置不合理
    • number of points read:如果远大于最终返回点数,大概率是没用到索引——务必确认host是Tag而非Field!InfluxDB的Tag有索引,Field没有,若host是Field,正则匹配会触发全表扫描,数据量大时直接拖慢查询
    • execution time:对比单个查询和模拟多并行查询时的执行时间差异

3. 排查InfluxDB的并发查询限制

InfluxDB默认有并发查询上限(max-concurrent-queries默认20),当仪表盘多图表同时发起查询时,会触发排队,导致Grafana端等待超时:

  • 查看InfluxDB日志,搜索max concurrent queries reached关键词
  • 实时监控活跃查询数:执行SHOW STATS,查看queries.active的值,在加载仪表盘时观察是否达到配置上限
  • 若确实达到上限,可临时调大max-concurrent-queries参数(建议不超过服务器CPU核心数的2倍),测试是否改善

4. 调整Grafana的查询并行策略

Grafana默认并行发送所有图表的查询,会瞬间压满InfluxDB的查询队列:

  • 进入仪表盘的Settings > Performance,开启Query throttling
  • 调整Max concurrent queries为较小值(比如5),让查询低并行或串行执行,看是否能避免"No data"情况
  • 也可尝试开启Query caching,让重复查询直接使用缓存结果,减少对InfluxDB的压力

5. 优化InfluxDB的分片与数据存储

长时间范围查询慢,分片设置不合理是常见诱因:

  • 执行SHOW SHARD GROUPS,查看30天数据对应的分片数量,若超过3个,说明分片时间太短(默认7天),可修改数据保留策略的分片时间为30天:
    ALTER RETENTION POLICY "autogen" ON "your-db" DURATION 365d SHARD DURATION 30d DEFAULT
    
  • 检查TSM文件压缩情况:执行SHOW DIAGNOSTICS,查看tsm1部分的compression_ratio,若比值低于2,说明数据压缩效果差,会影响读取速度

6. 监控服务器资源瓶颈

并行查询时的资源消耗会被放大,需确认服务器是否存在硬件瓶颈:

  • 查询时用top看CPU使用率,若InfluxDB进程CPU跑满,说明计算资源不足(percentile分位计算属于CPU密集型操作)
  • iostat -x 1查看磁盘IO的%util,若接近100%,说明磁盘读写是瓶颈(机械硬盘尤其明显,可考虑更换为SSD)
  • free -m查看内存,InfluxDB的cache-max-memory-size默认是内存的一半,若剩余内存不足,会导致缓存失效,频繁读磁盘

7. 验证Grafana的自动时间间隔参数

你的查询用了$__interval,这个参数会根据时间范围自动调整分组间隔,但长范围下可能导致分组过多:

  • 手动替换$__interval为固定值(比如10m),执行查询看速度是否提升
  • 若提升明显,可在Grafana仪表盘设置里调整Min interval参数,限制最小分组间隔,避免长范围下生成过多分组

内容的提问来源于stack exchange,提问作者jma

火山引擎 最新活动