我有一个MySQL 5.1.61数据库在两个负载均衡的Apache Web服务器后面运行,这些服务器托管着一个相当繁忙的(每天100K唯一身份)Wordpress站点。我正在使用Cloudflare,W3TC和Varnish进行缓存。大多数情况下,数据库服务器处理流量非常好。 “show full processlist”在任何给定时间显示20-40个查询,其中大多数处于睡眠状态。
虽然(特别是当流量激增或清除大量注释时),MySQL会定期停止响应。我会发现运行1000-1500个查询,许多“发送数据”等等。没有特定的查询似乎使数据库紧张(它们都是标准的Wordpress查询),但它似乎同时发出的请求量会导致所有查询挂断。我(通常)仍然可以登录,运行“显示完整的流程列表”或其他查询,但已经存在的1000多个查询。唯一的解决方案似乎是重新启动mysql(如果我无法连接,有时会通过kill -9猛烈地进行攻击)。
所有表都是innodb,服务器有8个内核,24GB内存,足够的磁盘空间,以下是我的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配置,或者在重负载下保持数据库稳定性的其他步骤?
答案 0 :(得分:1)
就像已经说过的那样,在盒子外面思考,并且为了解决为什么这些查询很慢或者某种程度上是悬而未决的问题。即使对于(据称是)智能系统工程师来说,老问题也是一个很好的问题来源是负载平衡导致Web服务器或数据库会话之间的问题。随着所有缓存和负载平衡的进行,您确定所有内容始终按预期端到端连接吗?
答案 1 :(得分:1)
我同意alditis&比约恩
我对mysql很不错,但运行mysqltuner可以根据最近的DB https://github.com/rackerhacker/MySQLTuner-perl查询显示一些配置优化
如果可能的话,将数据库文件存储在与操作系统物理分离的分区上,操作系统可能会消耗IO,这会降低数据库速度。就像Bjoern的logrotate问题一样。
答案 2 :(得分:0)
首先看看问题发生时的基本系统行为。如果您发现任何问题,请同时使用vmstat和iostat。查看系统是否开始交换(vmstat中的pi,po列)以及是否发生了大量IO。这是调试问题的第一步。
另一个有用信息来源是SHOW INNODB STATUS。有关如何解释输出的信息,请参阅http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through/。
可能是在某个时间点,您的写入会破坏读取性能,因为它们会刷新查询缓存。