MySQL 调优——高内存使用率

MySQL 调优——高内存使用率

我正在尝试使用 mysqltuner 调整 mysql db。Mysqltuner 建议我增加 join_buffer_size 和 query_cache_size。但与此同时,它警告我的最大内存使用量很高,已达到已安装 RAM(即 2GB)的 200% 以上。我所处的困境当然是,如果我按照 mysqltuner 所说的去做,内存使用量会进一步飙升。那么我该怎么办?问题不在于 mysql,而在于此服务器上运行的应用程序,这些应用程序显然需要 mysql 进行大量缓存?你们这些 mysql 管理员专家将从这里开始做什么?请参阅下面的 mysqltuner 报告以及我当前的 [mysqld] 设置:

MySqlTuner 报告:

MySQLTuner 1.2.0 - 主要 Hayden Bug 报告、功能请求和下载http://mysqltuner.com/ 使用“--help”运行以获取更多选项和输出过滤

-------- 一般统计信息 --------------------------------------------------
[--] 跳过 MySQLTuner 脚本的版本检查
[OK] 当前运行支持的 MySQL 版本 5.5.30-log
[OK] 在 64 位架构上运行

-------- 存储引擎统计信息 -------------------------------------------
[--] 状态:+Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] MyISAM 表中的数据:310M(表:264)
[--] InnoDB 表中的数据:8M(表:365)
[--] PERFORMANCE_SCHEMA 表中的数据:0B(表:17) [!!] 碎片表总数:376

-------- 安全建议 -------------------------------------------
[确定] 所有数据库用户都已分配密码

-------- 性能指标 -------------------------------------------------
[--] 运行时间:20 小时 20 分 10 秒(2M q [35.305 qps]、25K conn、TX:88B、RX:2B)
[--] 读取/写入:22%/78%
[--] 总缓冲区:全局 480.0M + 每个线程 33.5M(最大线程数 110 个)
[!!] 最大可能的内存使用量:4.1G(已安装 RAM 的 203%)
[OK] 慢速查询:0%(0/2M)
[OK] 可用连接的最高使用率:7%(8/110)
[OK] 键缓冲区大小/总 MyISAM 索引:150.0M/129.5M
[OK] 键缓冲区命中率:100.0%(15M 缓存/7K 读取)
[OK] 查询缓存效率:74.3% (762K 缓存/1M 选择)
[!!] 每天查询缓存修剪:4341
[OK] 需要临时表的排序:0%(3 个临时排序/11K 排序)
[!!] 未使用索引执行的连接:3901
[OK] 在磁盘上创建的临时表:0%(磁盘上 2K/总共 547K)
[OK] 线程缓存命中率:99%(创建 8 个/25K 个连接)
[OK] 表缓存命中率:46%(打开 688 个/打开 1K 个)
[OK] 使用的打开文件限制:17%(593/3K)
[OK] 立即获取的表锁:99%(立即 1M/1M 锁)
[OK] InnoDB 数据大小/缓冲池:8.9M/256.0M

-------- 建议 -----------------------------------------------------
一般建议:
运行 OPTIMIZE TABLE 来整理表碎片,以获得更好的性能
MySQL 在过去 24 小时内启动 - 建议可能不准确
减少整体 MySQL 内存占用以确保系统稳定性
调整连接查询以始终利用索引
要调整的变量:
* MySQL 的最大内存使用量非常高
增加 MySQL 缓冲变量之前添加 RAM *
query_cache_size (> 32M)
join_buffer_size (> 32.0M,或者始终使用带有连接的索引)

my.cnf 中的当前 mysqld 设置:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
user=mysql
symbolic-links=0
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 150M
max_allowed_pa​​cket = 160M
max_connections = 110
wait_timeout = 60
query-cache-type = 1
query-cache-size = 32M
query_cache_limit = 2M
thread_cache_size = 16
tmp_table_size = 32M
max_heap_table_size = 32M
join_buffer_size = 32M
table_open_cache = 128
table_cache = 1600
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 2M
innodb_log_buffer_size = 8M

答案1

这里有一个相当奇怪的数据库——它的写入操作比读取操作多得多。

调整 DBMS 以使其与 Innodb 良好运行非常重要或者您对其进行了调整,使其能够与 MyISAM 很好地运行 - 但您似乎混合了这两种表类型。您无法拥有一个同时适用于这两种类型的 DBMS。您需要开始将数据迁移到单个引擎上。鉴于数据库的写入繁重特性,我建议使用 Innodb。

总缓冲区:全局 480.0M + 每个线程 33.5M(最大线程数 110 个)

目前,遇到交换的风险主要由每个连接的内存使用量决定。但请注意,这只是一个风险刚刚。您还需要确定是否需要 110 个并发连接 - 最好将其减少一点。通常 sort_buffer_size 是每个连接耗尽内存的主要原因 - 但您的内存只有默认值的四分之一。

如果您正在合并 innodb,那么您可能需要增加 innodb 缓冲池大小。

您可以尝试不同的值这里

相关内容