linux服务器mysql占用内存?

服务器

在Linux服务器上,MySQL(或MariaDB)的内存占用受多个因素影响,包括配置参数、数据量、并发连接数和查询复杂度等。以下是关于MySQL内存占用的详细分析和查看方法:


一、MySQL主要内存占用来源

MySQL的内存使用主要包括以下几个部分:

  1. 全局缓冲区(Global Buffers)

    • innodb_buffer_pool_size:最重要的参数,用于缓存InnoDB表的数据和索引。
      • 默认值:128M(通常建议设置为物理内存的50%~70%)
    • key_buffer_size:用于MyISAM表的索引缓存(如果不用MyISAM可设小)。
    • query_cache_size:查询缓存(MySQL 8.0已移除)。
    • tmp_table_sizemax_heap_table_size:内存临时表大小限制。
    • innodb_log_buffer_size:InnoDB日志缓冲区。
  2. 每个连接的缓冲区(Per-thread Buffers)

    • sort_buffer_size
    • read_buffer_size
    • read_rnd_buffer_size
    • join_buffer_size
    • thread_stack
    • 每个连接都会分配这些缓冲区,连接数越多,总内存消耗越大。

二、查看MySQL内存使用情况

方法1:通过MySQL命令行查看关键参数

-- 查看关键内存参数
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'key_buffer_size';
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'sort_buffer_size';

-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';

方法2:估算最大内存使用量(公式)

Total Memory ≈ Global Buffers + (Per-thread Buffers × max_connections)

示例估算:

-- 假设:
-- innodb_buffer_pool_size = 2G
-- key_buffer_size = 32M
-- 其他全局 = 100M
-- per-thread 平均 = 2M
-- max_connections = 200

Total ≈ 2G + 32M + 100M + (2M × 200) = 2G + 532M ≈ 2.5G

⚠️ 注意:innodb_buffer_pool_size 是最大头,应重点监控。

方法3:使用脚本估算

可以使用开源脚本(如 mysqltuner.pl)评估内存使用:

wget http://mysqltuner.pl
perl mysqltuner.pl

输出中会显示内存使用建议。

方法4:查看系统层面的内存占用

# 查看MySQL进程内存使用
ps aux | grep mysql

# 输出示例:
# mysql    1234  0.5  8.2  2000000 1350000 ?  Ssl  Jan01  45:12 /usr/sbin/mysqld

# RSS 列(倒数第二列)是物理内存占用(单位KB),上例约 1350MB

或使用 top / htop

top -p $(pgrep mysqld)

方法5:使用 performance_schema(MySQL 5.6+)

-- 查看内存使用详情(需启用 performance_schema)
SELECT SUBSTRING_INDEX(event_name,'/',2) AS memory_category,
       SUM(CURRENT_NUMBER_OF_BYTES_USED) AS used_bytes
FROM performance_schema.memory_summary_global_by_event_name
GROUP BY memory_category
ORDER BY used_bytes DESC;

三、优化建议

  1. 合理设置 innodb_buffer_pool_size

    • 一般设为物理内存的 50%~70%
    • 示例:16G 内存 → 可设为 10G~12G
  2. 控制连接数

    • 减少 max_connections(如设为 200 而非 1000)
    • 使用连接池(如 PHP-FPM + PDO,或使用 ProxySQL)
  3. 调小 per-thread 缓冲区

    • sort_buffer_size = 256K(默认 256K~2M)
    • 避免设置过大,否则高并发时内存爆炸
  4. 避免内存临时表过大

    • tmp_table_sizemax_heap_table_size 建议设为 64M~256M
  5. 监控 Swap 使用

    • 如果MySQL使用Swap,性能会急剧下降,应确保内存充足。

四、配置文件示例(/etc/my.cnf)

[mysqld]
innodb_buffer_pool_size = 8G
key_buffer_size = 32M
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
join_buffer_size = 256K
max_connections = 200
thread_cache_size = 10
query_cache_type = 0    # MySQL 5.7 可关闭,8.0 已移除

总结

  • MySQL内存占用 = 全局缓存 + 每连接缓存 × 连接数
  • 主要大头是 innodb_buffer_pool_size
  • 使用 psmysqltuner、SQL查询等方式监控内存
  • 合理配置参数,避免内存溢出或Swap

如果你提供你的服务器内存大小和MySQL配置,我可以帮你具体分析和优化建议。

未经允许不得转载:CDNK博客 » linux服务器mysql占用内存?