温馨提示×

linux mariadb为何占用内存高

小樊
47
2026-10-24 20:33:22
栏目: 云计算

在 Linux 上 MariaDB(或 MySQL)看起来“占用内存很高”,通常并不是“内存泄漏”,而是 它故意把内存用起来当缓存,这是正常现象。下面按常见原因给你梳理一下。


一、最常见原因:InnoDB 缓冲池(占大头)

1️⃣ innodb_buffer_pool_size 太大

这是 最主要原因。

InnoDB 会把:

  • 表数据
  • 索引
  • 缓存页

放进 buffer pool,减少磁盘 IO。

典型表现:

top
# mysqld 占用 2G / 4G / 8G 甚至更多

查看当前配置:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

一般建议:

  • 专用数据库服务器:物理内存的 60%~70%
  • 和 Web 同机: 30%~40%

修改示例(/etc/my.cnf 或 /etc/mysql/my.cnf):

[mysqld]
innodb_buffer_pool_size = 2G

二、连接数太多 → 每个连接都吃内存

2️⃣ max_connections 过高

每个连接都会分配:

  • 线程内存
  • sort buffer
  • join buffer
  • read buffer

查看:

SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';

如果:

max_connections = 1000
实际连接 = 800

内存会暴涨。

建议:

  • 应用使用连接池
  • 不要无限制开连接

三、各种“per-thread”缓冲区叠加

以下参数 每个连接都会分配一次:

sort_buffer_size
join_buffer_size
read_buffer_size
read_rnd_buffer_size

⚠️ 很多人误以为“全局内存”,其实是 每连接内存。

举例:

sort_buffer_size = 4M
max_connections = 500

潜在内存:

4M × 500 = 2G

建议:

  • 不要盲目调大
  • 默认值通常够用

四、查询缓存(老版本)

4️⃣ query_cache(MariaDB 10.1 及以前)

如果开启:

SHOW VARIABLES LIKE 'query_cache_size';

问题:

  • 高并发下反而拖慢
  • 占用内存但不一定有用

✅ MariaDB 10.2+ 已废弃


五、临时表在内存中

5️⃣ 内存临时表

当:

  • GROUP BY
  • ORDER BY
  • 子查询

无法用索引时,会建临时表。

相关参数:

tmp_table_size
max_heap_table_size

如果 SQL 写得很差,会大量吃内存。

排查:

SHOW STATUS LIKE 'Created_tmp%';

六、Linux 内存“看起来高”的假象

6️⃣ 缓存 ≠ 实际使用

Linux 会:

  • 把空闲内存当文件缓存
  • MariaDB 退出后内存不会立刻释放

查看真实使用:

free -h

关注:

available

而不是 used

✅ MariaDB 占的内存,系统可以在需要时回收一部分


七、是不是内存泄漏?

MariaDB 很少有真正泄漏,除非:

  • 使用了有 bug 的版本
  • 使用了第三方存储引擎
  • 极端 SQL / 插件问题

判断方法:

  • 内存是否 只增不减,重启后恢复
  • 是否伴随 OOM Kill

八、快速自查清单 ✅

# 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.cnf
  • 或 free -h + top 截图

我可以帮你 精确算一遍该分配多少内存。

0 踩