返回
StarRocks BE节点崩溃原因查找:std::bad_alloc
开发工具
2024-01-31 17:54:09
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的日志文件,我们发现崩溃的原因是由于内存分配失败导致的。我们通过修改相关代码并重新编译部署,解决了该问题。
希望本文能够帮助您在遇到类似问题时,快速找到原因并解决问题。