我注意到系统内存使用率 %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 内存计算器的链接:
答案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