温馨提示×

linux mariadb为何占用过高

小樊
41
2026-10-21 19:14:21
栏目: 云计算

在 Linux 上 MariaDB 占用过高(CPU、内存或磁盘 IO)通常不是单一原因,而是配置、负载和架构问题叠加。下面按「常见原因 → 排查方法 → 解决建议」说明。


一、内存占用过高(最常见)

1. innodb_buffer_pool_size 设置过大

这是 最容易导致内存爆掉 的参数。

  • 默认值可能很大(如 128M~几个 G)
  • 如果服务器内存小,却设了很大 buffer pool

查看:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

建议:

  • 物理内存的 50%~70%(专用于数据库)
  • 如果是混合服务器(Web+DB),控制在 30%~40%

2. 连接数过多(max_connections)

每个连接都会占用内存。

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

如果 Threads_connected 接近 max_connections,说明:

  • 连接未释放(应用没关连接)
  • 或连接池配置不合理

解决:

  • 应用使用连接池
  • 设置合理 wait_timeout
SET GLOBAL wait_timeout=300;

3. 慢查询导致临时表 / 排序

复杂 SQL 会:

  • 使用大量内存
  • 甚至写磁盘临时表
SHOW STATUS LIKE 'Created_tmp_tables';
SHOW STATUS LIKE 'Sort_merge_passes';

二、CPU 占用过高

1. 慢查询 / 缺少索引

这是 CPU 高的主要原因。

开启慢查询日志:

SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=1;

查看慢 SQL:

mysqldumpslow -s t /var/log/mariadb/slow.log

解决:

  • 加索引
  • 避免 SELECT *
  • 避免 LIKE '%xx%'

2. 全表扫描

EXPLAIN SELECT * FROM table WHERE xxx;

如果 type=ALL,就是全表扫描。


3. 并发过高

  • 大量短连接
  • 无缓存(Redis)
  • 前端直接打数据库

三、磁盘 IO 占用过高

1. 频繁写入(binlog / redo log)

SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
  • 1:最安全,但 IO 高
  • 2:性能更好(有丢数据风险)

2. 临时表落到磁盘

SHOW STATUS LIKE 'Created_tmp_disk_tables';

如果远大于 Created_tmp_tables,说明 SQL 写得太重。


四、系统层面排查命令

top
htop
iotop
free -h
df -h

看是:

  • CPU 高?
  • 内存 swap?
  • 磁盘 IO 满?

五、快速优化建议(实用)

  1. 限制 buffer pool
  2. 控制连接数
  3. 开慢查询日志
  4. 加索引
  5. 引入 Redis 缓存
  6. 定期 ANALYZE / OPTIMIZE

六、如果你愿意,我可以更精准帮你

你可以贴出:

  • top 输出
  • SHOW PROCESSLIST;
  • my.cnf 配置
  • 服务器内存 & CPU 规格

我可以直接帮你判断 是配置问题还是 SQL 问题。

0 踩