MariaDB任务完成后未释放内存问题的排查与解决
问题核心
简而言之——问题很可能是Jemalloc未启用。启用Jemalloc后,问题似乎已解决。
问题描述
每当我运行向MariaDB数据库写入数据的任务时,系统会占用内存来执行操作。但即使任务完成(且我能成功查询数据库),内存仍被占用。这逐渐演变为问题:大约执行80个任务后,系统内存会被MariaDB完全占用,我不得不重启服务。是什么原因导致任务完成后内存无法释放?
问题更新
- 最近从RHEL 7迁移到RHEL 8以使用列存储,原本以为所有配置都完整复制,却发现当前系统未启用Jemalloc,这可能是问题诱因。
- 已确认
my.cnf是RHEL 7文件的副本,配置完全一致,但RHEL 7环境下无此问题。 - 通过htop监控确认问题出在MariaDB:数据加载时MEM%上升,任务完成后在RHEL 7中MEM%会下降,RHEL 8中却保持高位;其他应用内存占用正常,直到MariaDB内存耗尽前系统运行良好。
- “80个任务”并非同时运行,而是累计执行约80个(耗时数天)后内存占用过高。任务确实已完成:通过Open Grid Scheduler (OGS)可看到任务状态转为完成,且能查询到更新后的数据库结果;在RHEL 7中此时MariaDB的MEM%会下降,怀疑任务未保持连接但不知如何验证。
- 系统内存充足,OGS限制同时执行的数据加载任务数量,配置与RHEL 7一致;以往MariaDB内存占用不超过MEM%的10%。
- 使用MyISAM引擎,未配置
innodb_buffer_pool_size。 - 目前可通过杀死并重启MariaDB释放内存(内存占用达约80%时执行),但各种
FLUSH语句无效,执行后仅返回“Query OK, 0 rows affected”,内存占用无变化。
解决方法
问题已解决:在RHEL 7中曾使用Jemalloc,迁移到RHEL 8后未启用。找到系统中已安装的Jemalloc(以别名形式存在),重新启用并更新配置文件/etc/systemd/system/mariadb.service.d/override.cnf,添加配置Environment=LD_PRELOAD=libjemalloc.so.2。现在MariaDB在任务完成后会正常释放内存,目前系统运行正常,后续将进行压力测试。
内容的提问来源于stack exchange,提问作者David Robie
相关产品推荐
相关产品推荐

