外观
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 | 显示版本信息 | |
-host | InfluxDB 主机地址 | -host http://localhost:8086 |
-port | InfluxDB 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 1InfluxDB 内部监控
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: 写入错误数,反映系统稳定性
最佳实践
测试环境准备
- 使用生产级硬件: 测试环境应与生产环境使用相同或相似的硬件配置
- 关闭不必要的服务: 测试期间关闭非必要的系统服务,避免资源竞争
- 预热数据库: 测试前先进行短时间的预热,确保系统进入稳定状态
- 多次测试取平均值: 同一测试场景应运行多次,取平均值作为最终结果
测试参数选择
- 逐步增加负载: 从低负载开始,逐步增加并发数和数据量,观察系统性能变化
- 合理设置批量大小: 根据实际生产场景调整批量大小,通常建议在 1000-5000 之间
- 模拟真实数据分布: 尽量模拟生产环境的数据分布和标签 cardinality
- 测试不同时间精度: 根据实际使用场景测试不同时间精度(s, ms, us, ns)的性能
结果解读
- 线性扩展测试: 测试不同并发数下的性能,判断系统是否能线性扩展
- 瓶颈识别: 结合系统监控数据,识别 CPU、内存、磁盘 I/O 或网络瓶颈
- 配置优化验证: 测试不同配置参数下的性能,验证优化效果
- 容量规划: 根据测试结果,评估系统的最大承载能力,为容量规划提供依据
常见问题
测试结果波动较大
原因: 系统资源竞争、网络波动、磁盘缓存等因素影响
解决方案:
- 确保测试环境稳定,关闭不必要的服务
- 延长测试时间,减少随机波动影响
- 多次测试取平均值
- 使用固定的测试参数和环境
写入性能突然下降
原因: 磁盘 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 100Q3: 如何限制测试过程中的资源使用?
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