在 Linux 上 MariaDB(或 MySQL)看起来“占用内存很高”,通常并不是“内存泄漏”,而是 它故意把内存用起来当缓存,这是正常现象。下面按常见原因给你梳理一下。
innodb_buffer_pool_size 太大这是 最主要原因。
InnoDB 会把:
放进 buffer pool,减少磁盘 IO。
典型表现:
top
# mysqld 占用 2G / 4G / 8G 甚至更多
查看当前配置:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
一般建议:
修改示例(/etc/my.cnf 或 /etc/mysql/my.cnf):
[mysqld]
innodb_buffer_pool_size = 2G
max_connections 过高每个连接都会分配:
查看:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
如果:
max_connections = 1000
实际连接 = 800
内存会暴涨。
建议:
以下参数 每个连接都会分配一次:
sort_buffer_size
join_buffer_size
read_buffer_size
read_rnd_buffer_size
⚠️ 很多人误以为“全局内存”,其实是 每连接内存。
举例:
sort_buffer_size = 4M
max_connections = 500
潜在内存:
4M × 500 = 2G
建议:
query_cache(MariaDB 10.1 及以前)如果开启:
SHOW VARIABLES LIKE 'query_cache_size';
问题:
✅ MariaDB 10.2+ 已废弃
当:
无法用索引时,会建临时表。
相关参数:
tmp_table_size
max_heap_table_size
如果 SQL 写得很差,会大量吃内存。
排查:
SHOW STATUS LIKE 'Created_tmp%';
Linux 会:
查看真实使用:
free -h
关注:
available
而不是 used
✅ MariaDB 占的内存,系统可以在需要时回收一部分
MariaDB 很少有真正泄漏,除非:
判断方法:
# 1. 看 mysqld 占用
top -p $(pgrep mysqld)
# 2. buffer pool
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
# 3. 连接数
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
# 4. 内存分配
mysql -e "SHOW GLOBAL STATUS LIKE 'Memory%';"
MariaDB 占内存高,90% 是 InnoDB buffer pool 在用内存当缓存,不是问题。
如果你愿意,可以:
my.cnffree -h + top 截图我可以帮你 精确算一遍该分配多少内存。