我有一个 MySQL 5.1.61 数据库运行在两个负载平衡的 Apache 网络服务器后面,托管一个相当繁忙的(每天 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 配置,或在重负载下保持数据库稳定性的其他步骤吗?