(不确定这是 ServerFault 还是 StackOverflow 的问题,所以请原谅交叉发布)
我有一个 MySQL 5.1.61 数据库,运行在两个负载平衡的 Apache Web 服务器后面,托管着一个相当繁忙(每天 10 万个独立访问量)的 Wordpress 网站。我使用 Cloudflare、W3TC 和 Varnish 进行缓存。大多数时候,数据库服务器都能很好地处理流量。“显示完整进程列表”在任何给定时间显示 20-40 个查询,其中大多数处于休眠状态。
不过,MySQL 会定期停止响应(特别是当流量激增或大量评论被清除时)。我发现有 1000-1500 个查询正在运行,许多查询都在“发送数据”等。似乎没有哪个查询会给数据库带来压力(它们都是标准的 Wordpress 查询),但似乎同时的请求量导致所有查询都挂断了。我(通常)仍然能够登录,运行“显示完整进程列表”或其他查询,但其中已有的 1000 多个查询只是静止不动。唯一的解决方案似乎是重新启动 mysql(如果我无法连接,有时会通过 kill -9 进行猛烈重新启动)。
所有表都是 innodb,服务器有 8 个核心、24GB RAM、足够的磁盘空间,以下是我的 my.cnf:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
skip-external-locking
skip-name-resolve
user=mysql
query_cache_type=1
query_cache_limit=16M
wait_timeout = 300
query_cache_size=128M
key_buffer_size=400M
thread_cache_size=50
table_cache=8192
skip-name-resolve
max_heap_table_size = 256M
tmp_table_size = 256M
innodb_file_per_table
innodb_buffer_pool_size = 5G
innodb_log_file_size=1G
#innodb_commit_concurrency = 32
#innodb_thread_concurrency = 32
innodb_flush_log_at_trx_commit = 0
thread_concurrency = 8
join_buffer_size = 256k
innodb_log_file_size = 256M
#innodb_concurrency_tickets = 220
thread_stack = 256K
max_allowed_packet=512M
max_connections=2500
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
#2012-11-03
#attempting a ram disk for tmp tables
tmpdir = /db/tmpfs01
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
有什么建议可以改善 MySQL 配置,或采取其他措施在高负载下维持数据库稳定性?
答案1
我发现有三 (3) 个明显的迹象表明性能不足
MySQL 版本
您正在使用 MySQL 5.1.61。从 MySQL 5.1.38 开始,大多数人都不会安装 MySQL 5.1 附带的 InnoDB 插件。InnoDB 插件有新的增强功能,使 InnoDB 能够执行多核参与。
建议:安装 InnoDB 插件或升级到 MySQL 5.5
InnoDB 设置
这就是你所得到的(来自问题)
innodb_file_per_table
innodb_buffer_pool_size = 5G
innodb_log_file_size=1G
#innodb_commit_concurrency = 32
#innodb_thread_concurrency = 32
innodb_flush_log_at_trx_commit = 0
thread_concurrency = 8
innodb_log_file_size = 256M
如果您安装了 InnoDB 插件或升级到 MySQL 5.5,则必须调整 InnoDB 以激活多核增强功能。
以下是我的建议:
innodb_thread_concurrency = 0 (default in MySQL 5.5)
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
请阅读我的 DBA StackExchange 帖子来自Mar 16, 2012
对此进行了详细的讨论。
缓存
你的innodb_buffer_pool_size可能太小了。试着把它调大一点。事实上,Apr 22, 2011
我在 WordPress StackExchange 上写了一篇关于调整缓冲池大小的文章。