报告查询性能问题
使用这些指南与InfluxData工程师一起排查和解决查询性能问题。
优化您的查询
在报告查询性能问题之前,请参阅故障排除和优化指南,以了解如何优化查询并减少计算和内存需求。
请注意,本文件可能会随着我们的流程和工具的改进而在每次支持交互中发生变化。
发送 InfluxData 输出工件
在遵循这些准则的同时,将所有生成的输出工件打包成以下形式:
输出:
test-artifact-name.tar.gz
将所有生成的工件发送给InfluxData工程师进行分析。
记录你的测试过程
目前,InfluxDB 集群不提供可在您的集群中运行的标准化性能测试套件。 请记录您的测试过程,以便 InfluxData 工程师可以复制它——包括以下内容:
- 性能测试时您采取的步骤。
- 您的测试运行的时间戳,用于将测试与日志关联。
记录您的环境
根据您所在组织的允许,尽可能详细地提供有关您的环境的信息,包括以下内容:
- 您的 Kubernetes 集群
- 云服务提供商或指示其为“本地运行”
- 它运行的硬件
- 正在使用的磁盘类型和大小 - 例如:硬盘、固态硬盘、NVMe 等。
- 为每种类型的InfluxDB pod设置的CPU和内存资源
- 每个 InfluxDB StatefulSet 和 Deployment 中的 pod 数量
- 使用的对象存储类型及其托管方式
- 目录(PostgreSQL兼容数据库)是如何托管的
- 指示对象存储或目录是否被多个 InfluxDB 集群产品共享
- 如果是,请描述您的设置的网络级拓扑
如果可能,请提供一个合成数据集
如果您能够使用合成数据集重现性能问题,并且您的过程和环境得到了良好的记录,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/"
集群特定信息
输出:
app-instance.yml: 提供你的AppInstance清单的副本。
查询分析
使用 EXPLAIN 命令
输出长时间运行的查询的查询计划信息。
输出 (InfluxQL):
explain.csvexplain-verbose.csvexplain-analyze.csv
输出 (SQL):
explain.txtexplain-verbose.txtexplain-analyze.txt
在下面的示例中,替换以下内容:
DATABASE_NAME: 要查询的数据库名称DATABASE_TOKEN: 具有查询数据库读取权限的数据库令牌YOUR_QUERY: 您的长期运行查询(格式为使用转义双引号的单行 (\"))
解释
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"
详细解释
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"
解释分析
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;