我有一组运行 MariaDB 11.4.5 的 Primary->Primary DB 服务器。昨天,这些服务器上的操作系统从 Ubuntu 22.04 升级到了 24.04,因为似乎存在某种形式的内存泄漏,偶尔会导致 OOM Killer 终止数据库,这似乎是合乎逻辑的尝试。在操作系统升级过程中,数据库版本保持不变。
不幸的是,从那时起,该应用程序就一直在消耗服务器上所有可用的内存,直到我们重新启动它或它被 OOM 终止程序终止。
服务器有 40GB 的可用 RAM 和 11GB 的交换空间。使用此 SQL(在另一个 SE DB 线程上找到)
SELECT ROUND(
( @@GLOBAL.key_buffer_size
+ @@GLOBAL.query_cache_size
+ @@GLOBAL.tmp_table_size
+ @@GLOBAL.innodb_buffer_pool_size
+ @@GLOBAL.innodb_log_buffer_size
+ @@GLOBAL.max_connections * (
@@GLOBAL.sort_buffer_size
+ @@GLOBAL.read_buffer_size
+ @@GLOBAL.read_rnd_buffer_size
+ @@GLOBAL.join_buffer_size
+ @@GLOBAL.thread_stack
+ @@GLOBAL.binlog_cache_size)
) / 1024 / 1024, 1) `total MB`;
应使用的最大内存量为 15GB。我正在使用 btop 来监视服务器,MemB 目前为 35GB(并且还在增加)
我回顾了此处的知识库文章 - https://mariadb.com/kb/en/mariadb-memory-allocation/,并从中更新了以下设置:
query_cache_size=0 query_cache_type=OFF key_buffer_size=10M
并在服务器上设置以下内容将 swappiness 设置为 5 禁用 Numa
我还更改了 mariadb 服务的 systemd 设置:
LimitNOFILE=100000
LimitMEMLOCK=524288
# Set maximum allowed memory
MemoryMax=26GB
MemorySwapMax=8GB
OOMScoreAdjust=-600
BlockIOWeight=1000
TasksMax=99%
Nice=-5
Environment=LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
显示变量的输出可在此处获得 - https://docs.google.com/spreadsheets/d/1ev9KRWP8l54FpRrhFeX4uxFhJnOlFkV4_vTCZWipcXA/edit?usp=sharing
还有什么原因造成这种情况?
我在错误日志中注意到,即使 InnoDB 内存压力事件监听器已启动,它也不会被调用,直到服务器内存即将耗尽。
我还将服务器 RAM 增加到了 50GB,但这更像是一种权宜之计,而不是解决办法,让我有时间进行进一步调查。
谢谢 Derick
编辑-链接现在也有来自显示全局状态的输出;并显示引擎 innodb 状态;