暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

没内存了!!来看 OOM 快速排查攻略&解决方案

1824
Out of Memory,简称 OOM,代表内存耗尽的一种异常状态。当在数据库中执行数据量庞大且频繁的数据写入、查询和计算等操作,或者存在内存泄漏问题时,都有可能会触发 OOM。OOM 会导致系统性能急剧下降,或导致节点被操作系统的 OOM killer 机制自动终止。这种非预期的节点崩溃不仅会影响正在进行的任务,还可能对整个系统的稳定性和可靠性造成威胁。因此,分析归纳 OOM 产生的原因、掌握故障排查方法、并尽可能规避 OOM 的出现,对于确保系统的稳定运行至关重要
接下来,我们先来看看 DolphinDB 中有哪些常见的 OOM 报错提示:
  • Java heap space

  • OOM Killer

  • ChunkCacheEngine is out of memory, possibly due to a transaction that tries to write data larger than the available memory

  • C++:std::bad_alloc

  • Failed to merge results of partitioned calls: Failed to append data to column 'ETFSellNumber' with error: Out of memory' script: 'select * from pt where date(DateTime) = 2021.12.29;

  • Out of memory, BlockFileOutputStream failed to alloc memory and will retry.

  • [xx plugin],Out of memory

Why OOM?

OOM 现象背后的根本问题在于内存的不足,导致 DolphinDB OOM 的主要原因可分为以下三类:
  • DolphinDB 内部组件:数据量、查询复杂度、并发用户数等因素影响着 DolphinDB 的工作负荷。因此,当用户使用 DolphinDB 处理大规模数据或者执行复杂查询时,内存需求会相应增加,当超出可分配内存后会造成 OOM。
  • 外部组件:外部组件如应用程序(插件)的内存管理策略不当,或 GUI、VSCode 和 API 使用不当,会产生内存未及时释放、内存泄漏、内存分配不合理等问题,进而导致 OOM 的发生。
  • 外部限制:外部限制主要包括 DolphinDB 的许可证限制、DolphinDB 配置文件限制、以及操作系统面临的内存压力。在这类限制条件下,DolphinDB 在执行大规模任务时,可能也会面临内存不足的问题。

故障排查解决方案

当 OOM 在多个连接上多次发生,并且持续数秒或更长时间时,我们可以参考以下方式诊断排查故障,一步步解决问题。

诊断内存使用模式


如果发生宕机,首先需要排查是否因为内存耗尽,使得 DolphinDB 进程被操作系统杀掉。查看操作系统日志,可以排查是否触发了 OOM Killer。输入命令:

    dmesg -T|grep memory
    若出现了 “Out of memory: Kill process”,说明 DolphinDB 使用的内存超过了操作系统所剩余的空闲内存,导致操作系统杀死了 DolphinDB 进程。可通过参数 maxMemSize 设定节点的最大内存使用量。
    同时我们可以使用监控工具来诊断 DolphinDB 内存使用模式,查看内存使用的波动情况,分析内存占用的高峰时刻,这有助于确定是什么导致了 OOM。

    更新或优化配置


    其次,考虑 OOM 是否由于外部限制所导致。

      ulimit -a
      输入上述命令,可收集 Linux 操作系统对 DolphinDB 的限制内存信息,再手动修改操作系统对 DolphinDB 进程资源上限的限制
        license().maxMemoryPerNode


        getConfig(`maxMemSize)
        输入以上指令,可分别检查 DolphinDB 许可证文件以及 DolphinDB 配置文件对内存的限制
        注意:DolphinDB 社区版使用内存最大上限为 8 GB,如果需要申请使用更多内存,请联系 DolphinDB 小助手(dolphindb1)。

        内部组件排查


        来自 DolphinDB 内部组件的内存压力也可能导致内存不足错误。例如数据查询计算功能、流计算引擎、写入任务、后台计算任务等组件均会消耗内存,想要解决内存不足问题,必须确定哪些组件消耗的内存最大。
        此时可以通过内存管理函数 getSessionMemoryStat() 查看内存使用情况,了解这些组件在 DolphinDB 中如何分配内存。

        除此之外,还可以通过函数 getRecentJobs() 和 getConsoleJobs() 查看是否有超过预期运行时长的后台或交互任务,检验是否做到了合理分区、正确使用 SQL、合理配置流数据缓存区、及时管理 session 变量以及合理写入任务等。

        外部组件排查


        内存压力可能由于 DolphinDB 内部引擎导致,也可能由于 DolphinDB 进程中运行的某些插件导致,如 Kafka 、MySQL、ODBC 以及 HDFS 插件或者自定义插件等等,插件若设计不佳,容易消耗大量内存,从而导致内存不足错误。

        可使用以下方法诊断由插件引起的内存压力:

        • 查看日志。若日志中有此内容:[xx plugin],Out of memory,可以判断是由插件引发的 OOM。如果为官方发布的插件,可以通过点击官网下载页面的社群入口,将问题反馈给工程师。如果是自定义开发插件,需要定位下哪个函数导致的内存使用过高,修改插件源代码,重新编译再加载到 DolphinDB 中。

        • 若 DolphinDB GUI 客户端出现报错:Java heap space,通常情况下是因为 GUI 客户端占用内存过高。可将 SQL 语句

          select * from xx

          修改为

            t = select * from xx
            select top 1000 * from xx

            从而降低 GUI 客户端内存占用,避免上述问题。

            如何规避 OOM

            企业生产环境下,DolphinDB 往往作为流数据中心以及历史数据仓库,为业务人员提供数据查询和计算。为了尽量减少 OOM 甚至宕机等问题的发生,可以在日常使用中注意以下几点:

            优化服务器以及数据库配置

            • 打开操作系统对进程的资源限制

            • 合理配置 maxMemSize

            • 对自定义插件内存严格管理

            合理分区和正确使用 SQL

            • 合理均匀分区

            • 数据查询尽可能使用分区过滤条件

            • 只查询需要的列

            合理配置流数据缓存区

            • 合理配置流数据的缓存区

            及时管理 session 的变量

            • 及时释放数据量较大的变量

            分批次写入数据

            • 避免大事务写入

            在使用 DolphinDB 遇到 OOM 时,可以参考本文,定位分析 OOM 的产生原因,并采取方案来解决内存问题。同时,日常使用数据库时注意规划、优化与维护系统,可以在一定程度上规避 OOM 的出现,进一步提高数据库的稳定性。故障排查完整方案请参考阅读原文,使用过程中如有文章未涉及到的情况,请联系 DolphinDB 小助手(dolphindb1),加入技术群交流探讨~

            Explore More



            扫描二维码,添加 DolphinDB 小助手

            点击阅读原文,获取 OOM 完整应对指南

            文章转载自DolphinDB智臾科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论