Skip to content

InfluxDB influx-stress 工具

安装方法

从源代码编译

bash
# 克隆仓库
git clone https://github.com/influxdata/influx-stress
cd influx-stress

# 编译二进制文件
go build -o influx-stress

# 移动到系统路径
sudo mv influx-stress /usr/local/bin/

下载预编译二进制文件

bash
# 下载最新版本
wget https://github.com/influxdata/influx-stress/releases/latest/download/influx-stress_linux_amd64.tar.gz

# 解压并安装
tar xzf influx-stress_linux_amd64.tar.gz
sudo mv influx-stress /usr/local/bin/

基本使用

语法格式

bash
influx-stress [flags]

常用参数

参数描述示例
-h, --help显示帮助信息
-v, --version显示版本信息
-hostInfluxDB 主机地址-host http://localhost:8086
-portInfluxDB HTTP 端口-port 8086
-db目标数据库名称-db test_db
-u用户名-u admin
-p密码-p password
-format输出格式-format influxdb
-consistency写入一致性级别-consistency all
-precision时间精度-precision s
-batch-size批量写入大小-batch-size 1000
-workers并发写入工作线程数-workers 10
-points每个系列写入的数据点数-points 100000
-series生成的时间序列数量-series 100
-time写入持续时间-time 30s
-pps每秒写入点数限制-pps 10000

测试场景

基本写入测试

bash
# 测试基本写入性能
influx-stress -host http://localhost:8086 -db test_db -workers 10 -batch-size 1000 -series 100 -points 10000

持续写入测试

bash
# 持续写入 5 分钟
influx-stress -host http://localhost:8086 -db test_db -workers 20 -batch-size 2000 -series 200 -time 5m

高并发写入测试

bash
# 高并发写入测试
influx-stress -host http://localhost:8086 -db test_db -workers 50 -batch-size 5000 -series 500 -points 50000

限制速率写入测试

bash
# 限制每秒写入 20000 点
influx-stress -host http://localhost:8086 -db test_db -workers 20 -batch-size 2000 -series 200 -points 100000 -pps 20000

自定义测试数据

使用模板文件

influx-stress 支持使用模板文件定义自定义数据格式:

bash
# 使用模板文件
influx-stress -host http://localhost:8086 -db test_db -template my_template.toml

模板文件示例(my_template.toml):

toml
[[measurement]]
name = "cpu"

  [measurement.tags]
  host = ["server01", "server02", "server03"]
  region = ["us-west", "us-east", "eu-central"]
  dc = ["dc1", "dc2"]

  [[measurement.fields]]
  name = "usage_idle"
  type = "float"
  min = 0.0
  max = 100.0

  [[measurement.fields]]
  name = "usage_system"
  type = "float"
  min = 0.0
  max = 100.0

  [[measurement.fields]]
  name = "usage_user"
  type = "float"
  min = 0.0
  max = 100.0

自定义数据生成

通过命令行参数自定义数据:

bash
# 自定义测量值和字段
influx-stress -host http://localhost:8086 -db test_db -measurement cpu -tags "host=server01,region=us-west" -fields "usage_idle=50.0,usage_system=20.0,usage_user=30.0" -series 100 -points 10000

性能监控

在运行 influx-stress 测试时,建议同时监控 InfluxDB 的性能指标:

系统资源监控

bash
# 使用 top 监控 CPU 和内存
top

# 使用 iostat 监控磁盘 I/O
iostat -x 1

# 使用 netstat 监控网络流量
netstat -i 1

InfluxDB 内部监控

bash
# 查看 InfluxDB 写入统计
influx -execute "SHOW STATS" -database _internal | grep write

# 查看 InfluxDB 内存使用情况
influx -execute "SHOW STATS" -database _internal | grep mem

# 查看 InfluxDB 磁盘使用情况
influx -execute "SHOW STATS" -database _internal | grep disk

测试结果分析

influx-stress 测试完成后,会输出详细的测试结果:

2023-01-01T00:00:00Z Starting stress test
2023-01-01T00:00:30Z Test completed

Summary:
  Total points written: 10000000
  Total time: 30.00 seconds
  Points per second: 333333
  Batches per second: 333
  Failed writes: 0
  Write errors: 0

关键指标

  • Points per second (PPS): 每秒写入的数据点数,反映写入吞吐量
  • Batches per second: 每秒处理的批次数,反映批处理效率
  • Failed writes: 失败的写入次数,反映写入可靠性
  • Write errors: 写入错误数,反映系统稳定性

最佳实践

测试环境准备

  1. 使用生产级硬件: 测试环境应与生产环境使用相同或相似的硬件配置
  2. 关闭不必要的服务: 测试期间关闭非必要的系统服务,避免资源竞争
  3. 预热数据库: 测试前先进行短时间的预热,确保系统进入稳定状态
  4. 多次测试取平均值: 同一测试场景应运行多次,取平均值作为最终结果

测试参数选择

  1. 逐步增加负载: 从低负载开始,逐步增加并发数和数据量,观察系统性能变化
  2. 合理设置批量大小: 根据实际生产场景调整批量大小,通常建议在 1000-5000 之间
  3. 模拟真实数据分布: 尽量模拟生产环境的数据分布和标签 cardinality
  4. 测试不同时间精度: 根据实际使用场景测试不同时间精度(s, ms, us, ns)的性能

结果解读

  1. 线性扩展测试: 测试不同并发数下的性能,判断系统是否能线性扩展
  2. 瓶颈识别: 结合系统监控数据,识别 CPU、内存、磁盘 I/O 或网络瓶颈
  3. 配置优化验证: 测试不同配置参数下的性能,验证优化效果
  4. 容量规划: 根据测试结果,评估系统的最大承载能力,为容量规划提供依据

常见问题

测试结果波动较大

原因: 系统资源竞争、网络波动、磁盘缓存等因素影响

解决方案:

  • 确保测试环境稳定,关闭不必要的服务
  • 延长测试时间,减少随机波动影响
  • 多次测试取平均值
  • 使用固定的测试参数和环境

写入性能突然下降

原因: 磁盘 I/O 瓶颈、内存不足、写入队列满等

解决方案:

  • 监控系统资源使用情况,识别瓶颈
  • 调整批量大小和并发数
  • 优化 InfluxDB 配置参数
  • 考虑使用更快的存储设备

测试结果与生产环境不符

原因: 测试数据分布与生产数据差异较大

解决方案:

  • 尽量模拟生产环境的数据分布和标签 cardinality
  • 使用真实的生产数据模型进行测试
  • 考虑生产环境的查询负载对写入性能的影响

常见问题(FAQ)

Q1: influx-stress 支持 InfluxDB 2.x 版本吗?

A1: influx-stress 主要针对 InfluxDB 1.x 版本设计,虽然可以通过兼容模式连接 InfluxDB 2.x,但建议使用 InfluxDB 2.x 自带的 influx write 命令或其他测试工具。

Q2: 如何模拟高 cardinality 场景?

A2: 使用 -series 参数生成大量时间序列,或使用模板文件定义高基数标签组合,例如:

bash
influx-stress -host http://localhost:8086 -db test_db -workers 20 -batch-size 2000 -series 10000 -points 100

Q3: 如何限制测试过程中的资源使用?

A3: 可以使用 -workers 参数限制并发数,使用 -pps 参数限制每秒写入点数,或使用系统工具如 cgroups 限制 CPU 和内存使用。

Q4: 测试结果中的 "Failed writes" 是什么原因导致的?

A4: 失败的写入可能由多种原因导致,包括:

  • 网络连接问题
  • InfluxDB 服务不可用
  • 写入速率超过系统承载能力
  • 数据格式错误
  • 权限问题

建议检查 InfluxDB 日志,查找具体的错误原因。

Q5: 如何将测试结果导出到文件?

A5: 可以使用重定向命令将输出保存到文件:

bash
influx-stress -host http://localhost:8086 -db test_db -workers 10 -batch-size 1000 -series 100 -points 10000 > test_results.txt