返回

StarRocks BE节点崩溃原因查找:std::bad_alloc

开发工具

1. 问题分析

StarRocks是一个分布式列式存储引擎,它由FE和BE两部分组成。FE负责元数据管理和查询处理,BE负责数据存储和计算。在StarRocks集群中,BE节点可能会由于各种原因而崩溃。

在本文中,我们将介绍一个StarRocks BE节点突然崩溃的案例。该节点在几分钟内突然掉线,导致集群无法正常运行。我们通过分析BE的日志文件,发现崩溃的原因是由于内存分配失败导致的。

2. 日志分析

以下是BE崩溃时的日志输出:

tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
...
tcmalloc: large alloc 1811947520 byt @ 0x7fc36a3437f0
tcmalloc: large alloc failed, size=1811947520
tcmalloc: Abort
...
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Abort trap: 6

从日志中可以看出,BE在分配1811947520字节的内存时失败了。这导致了std::bad_alloc异常的抛出,最终导致BE进程崩溃。

3. 原因分析

内存分配失败可能是由于以下原因造成的:

  • 内存泄漏:内存泄漏是指程序在不再使用内存后,没有将其释放回操作系统。这会导致程序占用的内存不断增加,直到达到系统限制而崩溃。
  • 内存碎片:内存碎片是指内存中存在许多小的空闲块,这些空闲块无法被分配给大型对象使用。这会导致程序在分配大型对象时失败。
  • 系统资源不足:当系统中的可用内存不足时,程序可能会在分配内存时失败。

4. 解决方法

为了解决内存分配失败的问题,我们采取了以下措施:

  • 修改相关代码,避免内存泄漏。
  • 优化内存分配策略,减少内存碎片。
  • 增加系统内存。

通过以上措施,我们解决了内存分配失败的问题,并使BE节点恢复正常运行。

5. 总结

本文介绍了一个StarRocks BE节点突然崩溃的案例。通过分析BE的日志文件,我们发现崩溃的原因是由于内存分配失败导致的。我们通过修改相关代码并重新编译部署,解决了该问题。

希望本文能够帮助您在遇到类似问题时,快速找到原因并解决问题。