MariaDB 内存使用量超出配置大小

MariaDB 内存使用量超出配置大小

我注意到系统内存使用率 %age(由 sar 报告)稳步增长,并已跟踪到 MariaDB。这似乎与数据库负载无关:此增长与查询数量的增加不匹配。

内存使用图

我有以下尺寸配置:

key_buffer_size         =  400000000                                                                                  
innodb_buffer_pool_size = 1210612736 

总共有 1.5GB,但现在 RSS 内存已达到 2.3GB。

为什么它变得如此贪婪?我能让它更好地坚持其限制吗?或者也许它坚持 InnoDB 的限制,但将内存用于其他用途,如果是这样,有没有办法了解这一点,以便我可以调整配置以将总内存使用量保持在一定水平?或者也许它像 Linux 内核一样,在空闲时将所有可用内存用于缓存,但在需要时愉快地放弃它?

我在 Debian 10 (Buster) 上使用 MariaDB 10.3.22。工作负载是 Web 服务器(因此我需要为其他进程保留一些内存:nginx+php)。如果需要,我很乐意发布更多配置。

答案1

您列出的内存设置是共享的。每个线程还分配了各种缓冲区。以下是 MySQL 内存计算器的链接:

https://www.mysqlcalculator.com/

答案2

由于 Gordon 的回答和其中的链接,该论坛值得称赞,以下命令将告诉您 MySQL/MariaDB 数据库需要多少:

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`;

(我是 OP,我的总配置使用量为 2.9GB - 是时候降低一些数字了!)

答案3

如果你想限制 MariaDB 的整体内存使用量,假设你使用apt/安装它apt-get,你应该能够使用以下方法实现此目的systemd.资源控制(5)

使用 root 权限调用:

systemctl edit mariadb.service

在显示的编辑器中输入以下配置,如果需要可以进行调整:

[Service]
MemoryMax=1024M
MemorySwapMax=128M

保存并退出。立即生效,并由 cgroup 内存控制器支持。

答案4

让我们仔细分析一下:

( @@GLOBAL.key_buffer_size              40M unless using MyISAM tables 
 + @@GLOBAL.query_cache_size            0 -- it is mostly useless, esp on production
 + @@GLOBAL.innodb_buffer_pool_size     1G if you have only 3G of ram

               No more than 1% of RAM for these:
 + @@GLOBAL.tmp_table_size              -- belongs in the group below
 + @@GLOBAL.innodb_log_buffer_size 
     @@GLOBAL.sort_buffer_size
   + @@GLOBAL.read_buffer_size 
   + @@GLOBAL.read_rnd_buffer_size 
   + @@GLOBAL.join_buffer_size 
   + @@GLOBAL.thread_stack 
   + @@GLOBAL.binlog_cache_size)

 + @@GLOBAL.max_connections * (         100 is probably plenty

不存在“完美”的公式。mysqlcalculator 网站存在许多缺陷。其他任何声称拥有公式的网站也存在缺陷。

如果你正在使用 MyISAM(或 MyISAM 和 InnoDB 的混合),那么请参阅http://mysql.rjweb.org/doc.php/memory

相关内容