文档文档

排查内存不足循环

内存不足 (OOM) 循环是指正在运行的进程消耗的内存不断增加,直到操作系统被迫终止并重新启动该进程。当进程被终止时,分配给该进程的内存会被释放,但重新启动后,它将继续使用越来越多的 RAM,直到该循环重复出现。

监控仪表板中,OOM 循环将出现在 内存使用率 % 指标中,看起来与下图类似

OOM Loop

潜在原因

OOM 循环的原因可能差异很大,具体取决于您对 TICK 堆栈的具体用例,但以下是最常见的:

未优化查询

查询的内容和查询方式会严重影响 InfluxDB 的内存使用和性能。OOM 循环是由于重复执行耗尽内存的查询而发生的。例如,仪表板单元格设置为每 30 秒刷新一次。

在未指定时间范围的情况下选择度量

在未指定时间范围的情况下从度量中选择时,InfluxDB 会尝试从 UNIX 纪元时间(1970 年 1 月 1 日 UTC 时间 00:00:00)的开头拉取数据点,将返回的数据存储在内存中,直到准备好输出。操作系统最终将因内存使用过高而终止该进程。

在未指定时间范围内选择度量的示例
SELECT * FROM "telegraf"."autogen"."cpu"

解决方案

识别并更新未优化查询

InfluxDB 中 OOM 循环最常见的原因是未优化查询,但识别哪些查询可以更好地优化可能具有挑战性。InfluxQL 包含工具来帮助识别查询的“成本”,并深入了解哪些查询有优化空间。

查看 InfluxDB 日志

如果查询被终止,InfluxDB 会将其记录下来。查看您的 InfluxDB 日志,以获取有关哪些查询被终止的线索。

估算查询成本

InfluxQL 的 EXPLAIN 语句 会解析并计划一个查询,然后输出成本估算摘要。这使您能够在实际运行查询之前估算查询的资源密集程度。

EXPLAIN 语句示例
> EXPLAIN SELECT * FROM "telegraf"."autogen"."cpu"

QUERY PLAN
----------
EXPRESSION: <nil>
AUXILIARY FIELDS: cpu::tag, host::tag, usage_guest::float, usage_guest_nice::float, usage_idle::float, usage_iowait::float, usage_irq::float, usage_nice::float, usage_softirq::float, usage_steal::float, usage_system::float, usage_user::float
NUMBER OF SHARDS: 12
NUMBER OF SERIES: 108
CACHED VALUES: 38250
NUMBER OF FILES: 1080
NUMBER OF BLOCKS: 10440
SIZE OF BLOCKS: 23252999

EXPLAIN 只会输出查询引擎创建的迭代器。它不捕获查询引擎内的任何其他信息,例如实际将处理多少个数据点。

分析实际查询成本

InfluxQL 的 EXPLAIN ANALYZE 语句 会实际执行查询并在运行时计算成本。

EXPLAIN ANALYZE 语句示例
> EXPLAIN ANALYZE SELECT * FROM "telegraf"."autogen"."cpu" WHERE time > now() - 1d

EXPLAIN ANALYZE
---------------
.
└── select
    ├── execution_time: 104.608549ms
    ├── planning_time: 5.08487ms
    ├── total_time: 109.693419ms
    └── build_cursor
        ├── labels
        │   └── statement: SELECT cpu::tag, host::tag, usage_guest::float, usage_guest_nice::float, usage_idle::float, usage_iowait::float, usage_irq::float, usage_nice::float, usage_softirq::float, usage_steal::float, usage_system::float, usage_user::float FROM telegraf.autogen.cpu
        └── iterator_scanner
            ├── labels
            │   └── auxiliary_fields: cpu::tag, host::tag, usage_guest::float, usage_guest_nice::float, usage_idle::float, usage_iowait::float, usage_irq::float, usage_nice::float, usage_softirq::float, usage_steal::float, usage_system::float, usage_user::float
            └── create_iterator
                ├── labels
                │   ├── measurement: cpu
                │   └── shard_id: 317
                ├── cursors_ref: 0
                ├── cursors_aux: 90
                ├── cursors_cond: 0
                ├── float_blocks_decoded: 450
                ├── float_blocks_size_bytes: 960943
                ├── integer_blocks_decoded: 0
                ├── integer_blocks_size_bytes: 0
                ├── unsigned_blocks_decoded: 0
                ├── unsigned_blocks_size_bytes: 0
                ├── string_blocks_decoded: 0
                ├── string_blocks_size_bytes: 0
                ├── boolean_blocks_decoded: 0
                ├── boolean_blocks_size_bytes: 0
                └── planning_time: 4.523978ms

扩展可用内存

如果可能,请增加可用于 InfluxDB 的内存量。如果运行在虚拟化或云环境中,则更容易实现这一点,因为资源可以即时扩展。在具有固定资源集的环境中,这可能是一个非常难以克服的挑战。


此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2