文档文档

故障排除内存溢出循环

内存溢出 (OOM) 循环发生在运行中的进程消耗越来越多的内存,直到操作系统被迫终止并重启该进程时。当进程被终止时,分配给该进程的内存被释放,但在重启后,它继续使用越来越多的 RAM,直到循环重复。

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

OOM Loop

潜在原因

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

未优化的查询

查询的内容和查询方式会极大地影响 InfluxDB 的内存使用率和性能。OOM 循环将因重复发出消耗内存的查询而发生。例如,设置为每 30 秒刷新的仪表板单元格。

选择没有指定时间范围的测量

当从没有指定时间范围的测量中选择时,InfluxDB 尝试从 UNIX 纪元时间(1970 年 1 月 1 日 00:00:00 UTC)的开始处提取数据点,并将返回的数据存储在内存中,直到准备好输出。操作系统最终将由于高内存使用率而终止该进程。

选择没有时间范围的测量的示例
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 可用的内存量。如果在虚拟化或云环境中运行,则更容易实现这一点,在这些环境中,资源可以动态扩展。在具有固定资源集的环境中,这可能是一个非常难以克服的挑战。


此页是否对您有帮助?

感谢您的反馈!


Flux 的未来

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

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、最近数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 以 Core 的基础为构建,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看