文档文档

报告查询性能问题

使用这些指南与 InfluxData 工程师合作,以排除和解决查询性能问题。

优化您的查询

在报告查询性能问题之前,请参阅故障排除和优化指南,了解如何优化查询并减少计算和内存需求。

  1. 发送 InfluxData 输出工件
  2. 记录您的测试过程
  3. 记录您的环境
  4. 记录您的数据模式
  5. 建立查询性能下降条件
  6. 减少查询噪声
  7. 建立基线单查询性能
  8. 在多个负载规模下运行查询
  9. 收集调试信息
    1. Kubernetes 特定信息
    2. Clustered 特定信息
    3. 查询分析
      1. EXPLAIN
      2. EXPLAIN VERBOSE
      3. EXPLAIN ANALYZE
  10. 收集系统信息

请注意,随着我们的流程和工具的改进,本文档可能会因支持约定而异。

发送 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 工程师的分析提供有用的数据。

在多个负载规模下运行查询

如果在减少查询噪声建立基线单查询性能后问题没有重现,则系统地增加查询并发性以重现问题并确定问题发生的规模——例如,运行以下测试计划。

您可能需要根据需要扩大或缩小示例计划,以重现问题。

  1. 关闭间歇性或定期 InfluxDB 查询,并允许集群恢复。
  2. 运行查询 A 并允许集群恢复 1 分钟。
  3. 运行 5 个并发的查询 A 实例,并允许集群恢复 1 分钟。
  4. 运行 10 个并发的查询 A 实例,并允许集群恢复 1 分钟。
  5. 运行 20 个并发的查询 A 实例,并允许集群恢复 1 分钟。
  6. 运行 40 个并发的查询 A 实例,并允许集群恢复 1 分钟。
  7. 向 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_namepartition_keypartition_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;

此页面是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像现在一样使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开发布 Alpha 版

InfluxDB 3 开源版本现已可用于 Alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 Alpha 版本的一部分。

InfluxDB 3 Core 是我们新的开源产品。它是一个用于时间序列和事件数据的最新数据引擎。InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何开始使用的更多信息,请查看