当前位置: 首页 > news >正文

分析InfluxDB中读取时CPU飙升

问题复现

环境

  • influxdb 1.8
  • 单节点,8C 32G
  • 基于docker compose部署,通过grafana + telegraf监控influxdb性能cpu和负载指标
    • docker compose安装参考其他资料

模拟查询

通过Python脚本,查询influx数据

import requests, threadingdef query():while True:requests.get("http://localhost:8086/query", params={"db": "telegraf","q": "SELECT mean(usage_system) FROM cpu WHERE time > now() - 1h GROUP BY time(1s)"})for _ in range(50):threading.Thread(target=query).start()
  • 当使用脚本运行的过程中,CPU飙升到80%
  • 在停止脚步后,CPU恢复正常
    image

问题分析

InfluxDB 的查询引擎是 CPU 密集型的

InfluxDB 在执行聚合、过滤、分组等查询时,会:

  • 从 TSM 文件读取大量数据块;
  • 解压、反序列化;
  • 在内存中计算聚合;
  • 再返回结果。

当并发查询量大时,多个查询任务会争夺 CPU 核心,导致:

  • 查询线程大量占用 CPU;
  • 后台写入(tsm compaction、wal flush)得不到 CPU 时间;
  • 写入延迟、超时,甚至 write failed: timeout。

查询与写入共享资源(CPU、IO、内存)

InfluxDB 的写入路径包括:

  • 接收数据(HTTP/TCP)
  • 写 WAL(Write Ahead Log)
  • 刷新到 TSM 文件

当查询压力大时:

  • IO 瓶颈被查询占用;
  • 缓存写不进去,积压在内存;
  • 后台 flush 线程被延迟。

解决方案

自建读写分离:

  • 一主(负责写入)
  • 多从(通过 influx-relay 或 replication)负责查询;
  • 查询走从节点,主节点仅负责写入。

InfluxRelay 实现写入复制

InfluxRelay 是由 InfluxData 官方早期提供的一个轻量级代理,用于:

  • 接收写入请求;
  • 同步转发到多个后端 InfluxDB 实例。

✅ 优点:

  • 简单、易实现;
  • 数据强一致;
  • 可水平扩展查询节点。

⚠️ 缺点:

  • 所有节点存储冗余;
  • relay 不会自动重试部分失败;
  • 没有真正的异步复制或延迟写保护。

使用中间缓存层(Telegraf + Kafka + 多 InfluxDB)

  1. 所有写入先进入 Kafka;
  2. Telegraf Consumer 从 Kafka 读取并写入多个 InfluxDB;
  3. 主 InfluxDB 负责写;
  4. 从 InfluxDB 用于查询。

其他资料

docker环境安装

# 切换到清华源
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo# 清理缓存并安装
sudo yum clean all
sudo yum makecache# 安装
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin# 配置docker源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1panel.live",
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://mirror.ccs.tencentyun.com"
]
}
EOF# 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker

环境部署

docker-compose.yaml文件

version: "3.8"services:influxdb:image: influxdb:1.8container_name: influxdb_singlerestart: alwaysports:- "8086:8086"environment:- INFLUXDB_DB=telegraf- INFLUXDB_HTTP_AUTH_ENABLED=falsevolumes:- ./data/influxdb:/var/lib/influxdbtelegraf:image: telegraf:1.29container_name: telegrafdepends_on:- influxdbvolumes:- ./telegraf_single.conf:/etc/telegraf/telegraf.conf:ro- /var/run/docker.sock:/var/run/docker.sockgrafana:image: grafana/grafana:10.4.2container_name: grafanadepends_on:- influxdbports:- "3000:3000"

telegraf_single.conf文件

[agent]interval = "5s"          # 采集间隔round_interval = true    # 对齐采集时间到间隔边界metric_batch_size = 1000 # 批量发送的指标数量metric_buffer_limit = 10000 # 指标缓冲区大小collection_jitter = "0s" # 采集抖动时间flush_interval = "10s"   # 刷新(写入)间隔flush_jitter = "0s"      # 刷新抖动时间utc = true[[outputs.influxdb]]urls = ["http://influxdb:8086"]  # InfluxDB 容器地址(同一网络可用服务名)database = "telegraf"            # 目标数据库名retention_policy = ""            # 保留策略(默认即可)write_consistency = "any"        # 写入一致性级别timeout = "5s"                   # 超时时间username = ""                    # 你的配置中未启用认证,留空password = ""                    # 同上# 输入插件(保持你的配置,确保启用)
[[inputs.cpu]]percpu = truetotalcpu = truecollect_cpu_time = falsereport_active = false[[inputs.mem]][[inputs.disk]]mount_points = ["/"]  # 监控根目录磁盘[[inputs.net]]interfaces = ["eth0", "lo"]  # 监控常用网络接口
[[inputs.system]]

grafana配置

新建dashboard,面板sql

  • 配置host变量(用于后面多host监控)
SHOW TAG VALUES FROM cpu WITH KEY = host
  • 配置可视化
-- CPU
SELECT mean(usage_user) AS User_Usage, mean(usage_system) AS System_Usage, mean(usage_idle) AS Idle
FROM cpu
WHERE ("host" =~ /^$host$/ AND cpu='cpu-total') AND $timeFilter
GROUP BY time($__interval), host-- LOAD
SELECT mean(load1) AS Load_1m, mean(load5) AS Load_5m, mean(load15) AS Load_15m 
FROM system 
WHERE "host" =~ /^$host$/ AND $timeFilter 
GROUP BY time($__interval), host
http://www.gsyq.cn/news/19184.html

相关文章:

  • 高二停课周记(信息学竞赛) Week1
  • 2025/10/11
  • 十年运维工程师总结
  • 运动控制教学——5分钟学会Dijkstra与A*搜索算法!(附仿真视频及代码) - 教程
  • CNN 发展历程
  • 实验报告5(链栈基本操作,数制转换,匹配算法,伴舞问题)
  • 企业推行OKR中层领导关注的10个关键问题及解决方案
  • P11229 [CSP-J 2024] 小木棍题解
  • 初识pytorch:数据标准化及数据增强的transforms
  • 前端实验(二)模板语法 - 实践
  • Num3:Prompt工程 - 指南
  • 国庆期间做题记录
  • 02020508 EF Core高级08-表达式树、Expression和委托的关系、查看表达式树结构、AST、手动创建表示树、工厂方法
  • commons-net - 详解
  • 02020505 EF Core高级05-实体的5种状态、EntityEntry、AsNoTracking、实体状态跟踪
  • linux防火墙操作命令
  • 机器学习社会影响与导航系统研究
  • 251011
  • 实用指南:漏标(Missing Mark)问题深度解析
  • SSL/TLS加密算法:守护网络通信的安全框架
  • 理解WPF Stylet中Command=“{s:Action 方法名}“的设计与实现 - 实践
  • laya自定义滚动条
  • SigOJ提交语言帮助文档 - lkjy
  • 优维科技一面
  • 深入解析:FreeRTOS内存分配与STM32内存布局详解
  • 2025婚纱照拍摄推荐,南通造物摄影有限公司专业团队打造梦幻
  • 2025精密弹簧优质厂家推荐:蓝侨盈科技,精准弹性解决方案!
  • 有限空间作业安全无死角!AI 视觉守护人员与操作合规
  • 2025抖音推广服务商最新推荐榜:精准引流与高效转化的营销利
  • 4K Wallpaper mac v2.7.dmg 安装教程(Mac电脑详细安装步骤4K壁纸Mac下载安装)