8

我有一个 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 配置,或在重负载下保持数据库稳定性的其他步骤吗?

4

3 回答 3

1

我同意alditis & Bjoern

我对 mysql 很陌生,但运行 mysqltuner 可以根据最近对数据库的查询https://github.com/rackerhacker/MySQLTuner-perl揭示一些配置优化

如果可能的话,将数据库文件存储在与操作系统物理分离的分区上,操作系统可能会消耗 IO,这会减慢数据库的速度。就像 Bjoern 的 logrotate 问题一样。

于 2012-12-28T00:34:17.707 回答
1

就像已经说过的那样,跳出框框思考,并围绕为什么这些查询缓慢或以某种方式挂起而生根发芽。即使对于(据说)智能系统工程师来说,一个老问题但也是一个很好的问题来源是负载平衡导致跨网络服务器或数据库会话的问题。随着所有这些缓存和负载平衡的进行,您确定一切都始终按预期进行端到端连接吗?

于 2012-12-10T06:45:51.973 回答
0

首先看一下出现问题时的基本系统行为。如果您发现任何问题,请同时使用 vmstat 和 iostat。查看系统是否开始交换(vmstat 中的 pi、po 列)以及是否正在发生大量 IO。这是调试问题的第一步。

有用信息的另一个来源是 SHOW INNODB STATUS。有关如何解释输出的信息,请参阅http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through/ 。

可能是在某个时间点,您的写入会降低读取性能,因为它们会刷新查询缓存。

于 2012-12-31T12:57:53.057 回答