报告查询性能问题
这些指南旨在促进InfluxData工程师与您的协作。它们允许工程师及时分析您在遵循我们的故障排除和优化查询指南后未能解决的任何性能问题。
请注意,由于我们的流程和工具改进,此文档可能从一次支持交流到下一次发生更改。
发送InfluxData输出工件
在遵循这些指南时,以下形式打包所有生成的输出工件
输出
test-artifact-name.tar.gz
将所有生成的工件发送给InfluxData工程师进行分析。
记录您的测试过程
目前尚无标准化的性能测试套件,您可以在自己的环境中运行,因此请记录您的流程,以便进行复制。包括以下内容
- 性能测试时采取的步骤。
- 您执行的测试的时间戳,以便可以将它们与相关的日志相关联。
记录您的环境
提供尽可能多的有关您的环境的信息,包括以下内容
- 您的kubernetes集群
- 它在哪个云提供商上运行或指明它是“本地”
- 它在什么硬件上运行
- 正在使用的磁盘的类型和大小——例如:硬盘、SSD、NVMe等。
- 为每种类型的InfluxDB pod设置的CPU和内存资源
- 每个InfluxDB StatefulSet和Deployment中的Pod数量
- 使用的对象存储类型及其托管方式
- 目录(与PostgreSQL兼容的数据库)的托管方式
- 如果对象存储或目录由多个InfluxDB Clustered产品共享,则指示
- 如果是这样,描述您的设置的网络级拓扑结构
如果可能,提供合成数据集
如果您可以使用合成数据集重现性能问题,并且您的流程和环境得到了很好的记录,InfluxData工程师可能能够重现问题,缩短反馈周期,并更快地解决问题。
记录您的数据模式
记录您的数据模式,以帮助InfluxData工程师更好地了解重现您问题的条件。
建立查询性能下降条件
研究查询性能最有效的方法是深入了解你无法看到预期性能的条件。需要考虑并提供的事项
- 这是否总是发生,还是只偶尔发生?
- 如果只是偶尔发生,是在一天中的某个固定时间,还是在一个固定时间段内发生?
- 单个查询执行是否会重现问题,还是只有在多个查询同时运行时才会出现?
- 你如何执行查询?例如
influxctl
- 客户端库
- 其他环境或工具
减少查询噪声
为了在没有额外查询噪声的情况下了解系统的基线性能,请在没有周期性或间歇性查询同时运行的环境中测试。
此外,在运行不同查询的多个测试中,在执行下一个查询之前,等待至少一分钟以让系统在收到查询结果后恢复。
建立基线单查询性能
为了在没有额外查询噪声的情况下了解系统的基线性能,至少用一些单条查询进行测试,使它们彼此独立。
这可能对InfluxData工程师的分析非常有用,即使单独的查询不足以重现你遇到的问题。
在多个负载规模下运行查询
一旦使用单条查询建立了基线性能,并且你的性能问题不能用单条查询重现,请使用系统方法来确定它成为问题的规模。这涉及到系统地增加查询并发性,直到你确定一个阈值,在该阈值下问题可以重现。
这,加上你的Kubernetes环境信息,可以提供足够的见解,以建议更改你的配置,以改进查询性能特征,随着使用规模的增加。
例如,考虑以下测试计划概述
- 关闭间歇性或周期性的InfluxDB查询,并允许集群恢复。
- 运行查询A,并允许集群恢复1分钟。
- 运行5个并发实例的查询A,并允许集群恢复1分钟。
- 运行10个并发实例的查询A,并允许集群恢复1分钟。
- 运行20个并发实例的查询A,并允许集群恢复1分钟。
- 运行40个并发实例的查询A,并允许集群恢复1分钟。
- 向InfluxData提供以下描述的调试信息。
这只是一个示例。你不需要超过查询变慢的规模,但你可能需要超过这里概述的规模。
收集调试信息
以下调试信息应在尝试针对你的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
清单的副本。
查询分析
输出(InfluxQL)
explain.csv
explain-verbose.csv
explain-analyze.csv
输出(SQL)
explain.txt
explain-verbose.txt
explain-analyze.txt
对于任何已知的长时间运行的查询,执行它们上的EXPLAIN
命令的变体可能有所帮助。
在下面的示例中,替换以下内容
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 v3 系统表可能会影响您 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';
收集多个表的分区信息
如果同一查询在 1 个以上表上速度较慢,也请运行以下查询以收集所有表的分区大小和数量
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;
这个页面有帮助吗?
感谢您的反馈!