报告查询性能问题
使用这些指南与 InfluxData 工程师合作,以排除和解决查询性能问题。
优化您的查询
在报告查询性能问题之前,请参阅故障排除和优化指南,了解如何优化查询并减少计算和内存需求。
请注意,随着我们的流程和工具的改进,本文档可能会因支持约定而异。
发送 InfluxData 输出工件
当您遵循这些指南时,请将所有生成的输出工件打包成以下形式
输出
test-artifact-name.tar.gz
将所有生成的工件发送给 InfluxData 工程师进行分析。
记录您的测试过程
目前,InfluxDB Clustered 没有提供您可以在集群中运行的标准化性能测试套件。请记录您的测试过程,以便 InfluxData 工程师可以复制它——包括以下内容
- 您在进行性能测试时采取的步骤。
- 您的测试运行的时间戳,以便将测试与日志相关联。
记录您的环境
提供尽可能多的关于您的环境的详细信息,您的组织允许的范围内,包括以下内容
- 您的 Kubernetes 集群
- 它运行的云提供商或指示它是“本地部署”
- 它运行的硬件
- 正在使用的磁盘类型和大小——例如:硬盘、SSD、NVMe 等。
- 在每种类型的 InfluxDB pod 上设置的 CPU 和内存资源
- 每个 InfluxDB StatefulSet 和 Deployment 中的 pod 数量
- 使用的对象存储类型以及它的托管方式
- Catalog(PostgreSQL 兼容数据库)的托管方式
- 指示对象存储或 Catalog 是否被多个 InfluxDB Clustered 产品共享
- 如果是,请描述您的设置的网络级拓扑
如果可能,请提供合成数据集
如果您可以使用合成数据集重现性能问题,并且您的流程和环境有良好的文档记录,InfluxData 工程师可能能够重现该问题,缩短反馈周期,并更快地解决该问题。
记录您的数据模式
记录您的数据模式,以帮助 InfluxData 工程师更好地了解重现您问题的条件。
建立查询性能下降条件
调查查询性能最有效的方法是充分了解您没有看到预期性能的条件。考虑以下情况
- 这种情况总是发生,还是只是有时发生?
- 如果只是有时发生,是在一天中的固定时间还是在固定的时间段内?
- 单个查询执行会重现该问题,还是只在同时运行多个查询时才会出现?
- 您是如何执行查询的?例如
influxctl
- 客户端库
- 其他环境或工具
减少查询噪声
在没有定期或间歇性查询的环境中进行测试,以测量没有额外查询噪声的基线系统性能。
当使用不同的查询运行多个测试时,允许系统在测试之间恢复。在收到查询结果后,至少等待一分钟再执行下一个查询。
建立基线单查询性能
执行一些隔离的单查询测试以测量基线性能。这种方法可能并不总是重现您的问题,但可以为 InfluxData 工程师的分析提供有用的数据。
在多个负载规模下运行查询
如果在减少查询噪声和建立基线单查询性能后问题没有重现,则系统地增加查询并发性以重现问题并确定问题发生的规模——例如,运行以下测试计划。
您可能需要根据需要扩大或缩小示例计划,以重现问题。
- 关闭间歇性或定期 InfluxDB 查询,并允许集群恢复。
- 运行查询 A 并允许集群恢复 1 分钟。
- 运行 5 个并发的查询 A 实例,并允许集群恢复 1 分钟。
- 运行 10 个并发的查询 A 实例,并允许集群恢复 1 分钟。
- 运行 20 个并发的查询 A 实例,并允许集群恢复 1 分钟。
- 运行 40 个并发的查询 A 实例,并允许集群恢复 1 分钟。
- 向 InfluxData 提供与每次测试运行相关的调试信息。
您的测试结果以及来自 Kubernetes 环境的相关调试信息可以帮助建议配置更改,以在您的使用规模扩大时提高查询性能。
收集调试信息
在针对您的 InfluxDB 集群测试有问题的查询后不久,收集以下调试信息。
Kubernetes 特定信息
输出
${DATETIME}-cluster-info.tar.gz
DATETIME="$(date -Iminutes)"
kubectl cluster-info dump --namespace influxdb --output-directory "${DATETIME}-cluster-info/"
tar -czf "${DATETIME}-cluster-info.tar.gz" "${DATETIME}-cluster-info/"
Clustered 特定信息
输出
app-instance.yml
:提供您的AppInstance
清单的副本。
查询分析
使用 EXPLAIN
命令输出长时间运行的查询的查询计划信息。
输出 (InfluxQL)
explain.csv
explain-verbose.csv
explain-analyze.csv
输出 (SQL)
explain.txt
explain-verbose.txt
explain-analyze.txt
在以下示例中,替换以下内容
DATABASE_NAME
:要查询的数据库的名称DATABASE_TOKEN
:具有对查询数据库的读取权限的数据库令牌YOUR_QUERY
:您的长时间运行的查询(格式化为单行,并使用转义的双引号 (\"
))
EXPLAIN
influxctl \
--config config.toml \
query \
--database DATABASE_NAME \
--format table \
--token DATABASE_TOKEN \
"EXPLAIN YOUR_QUERY;" > explain.txt
curl --get "https://cluster-host.com/query" \
--output "./explain.csv" \
--header "Authorization: Bearer DATABASE_TOKEN" \
--header "Accept: application/csv" \
--data-urlencode "db=DATABASE_NAME" \
--data-urlencode "q=EXPLAIN YOUR_QUERY"
EXPLAIN VERBOSE
influxctl \
--config config.toml \
query \
--database DATABASE_NAME \
--format table \
--token DATABASE_TOKEN \
"EXPLAIN VERBOSE YOUR_QUERY;" > explain-verbose.txt
curl --get "https://cluster-host.com/query" \
--output "./explain-verbose.csv" \
--header "Authorization: Bearer DATABASE_TOKEN" \
--header "Accept: application/csv" \
--data-urlencode "db=DATABASE_NAME" \
--data-urlencode "q=EXPLAIN VERBOSE YOUR_QUERY"
EXPLAIN ANALYZE
influxctl \
--config config.toml \
query \
--database DATABASE_NAME \
--format table \
--token DATABASE_TOKEN \
"EXPLAIN ANALYZE YOUR_QUERY;" > explain-analyze.txt
curl --get "https://cluster-host.com/query" \
--output "./explain-analyze.csv" \
--header "Authorization: Bearer DATABASE_TOKEN" \
--header "Accept: application/csv" \
--data-urlencode "db=DATABASE_NAME" \
--data-urlencode "q=EXPLAIN ANALYZE YOUR_QUERY"
收集系统信息
可能影响集群性能
查询 InfluxDB 3 系统表可能会影响 InfluxDB 集群的写入和查询性能。使用过滤器优化查询以减少对集群的影响。
系统表可能会更改
系统表不是 InfluxDB 稳定 API 的一部分,可能会随着新版本的发布而更改。提供的模式信息和查询示例在 2024 年 9 月 20 日 之前有效。如果您检测到模式更改或无法正常工作的查询示例,请提交问题。
如果特定表的查询速度很慢,请运行以下系统查询以收集信息进行故障排除
要优化系统查询,请使用 table_name
、partition_key
和 partition_id
过滤器。在您的查询中,替换以下内容
TABLE_NAME
:要检索分区的表PARTITION_ID
:分区 ID (int64)PARTITION_KEY
:从表的分区模板派生的分区键。默认格式为%Y-%m-%d
(例如,2024-01-01
)。
收集表信息
SELECT *
FROM system.tables
WHERE table_name = 'TABLE_NAME';
收集表的压缩信息
查询 system.compactor
表以收集压缩信息——例如,运行以下查询之一
SELECT *
FROM system.compactor
WHERE
table_name = 'TABLE_NAME'
AND partition_key = 'PARTITION_KEY';
SELECT *
FROM system.compactor
WHERE
table_name = 'TABLE_NAME'
AND partition_id = 'PARTITION_ID';
收集多个表的分区信息
如果相同的查询在多个表上速度都很慢,也请运行以下查询以收集所有表的大小和分区数
SELECT table_name,
COUNT(*) as partition_count,
MAX(last_new_file_created_at) as last_new_file_created_at,
SUM(total_size_mb) as total_size_mb
FROM system.partitions
WHERE table_name IN ('foo', 'bar', 'baz')
GROUP BY table_name;
此页面是否对您有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您对 InfluxDB Clustered 和本文档提出反馈和错误报告。要获得支持,请使用以下资源
拥有年度或支持合同的客户可以联系 InfluxData 支持。