可能重复:
MySQL 正在终止服务器 IO。
我管理着一个相当大/繁忙的 vBulletin 论坛(在 gigenet 云上运行),数据库约为 10 GB(约 9 百万个帖子,约 60 个查询/秒),最近,根据 iotop 的数据,MySQL 一直在严重磨损磁盘,导致网站速度变慢。
我能想到的最后一个想法是使用复制,但我不确定这会有多大帮助,而且我担心数据库同步。
我没有主意了,如果能提供任何关于如何改善这种情况的建议我将非常感激。
眼镜 :
Debian Lenny 64bit
~12Ghz (6 cores) CPU, 7520gb RAM, 160gb disk.
Kernel : 2.6.32-4-amd64
mysqld Ver 5.1.54-0.dotdeb.0 for debian-linux-gnu on x86_64 ((Debian))
其他软件:
vBulletin 3.8.4
memcached 1.2.2
PHP 5.3.5-0.dotdeb.0 (fpm-fcgi) (built: Jan 7 2011 00:07:27)
lighttpd/1.4.28 (ssl) - a light and fast webserver
PHP 和 vBulletin 配置为使用 memcached。
MySQL设置:
[mysqld]
key_buffer = 128M
max_allowed_packet = 16M
thread_cache_size = 8
myisam-recover = BACKUP
max_connections = 1024
query_cache_limit = 2M
query_cache_size = 128M
expire_logs_days = 10
max_binlog_size = 100M
key_buffer_size = 128M
join_buffer_size = 8M
tmp_table_size = 16M
max_heap_table_size = 16M
table_cache = 96
其他 :
> vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
9 0 73140 36336 8968 1859160 0 0 42 15 3 2 6 1 89 5
> /etc/init.d/mysql status
Threads: 49 Questions: 252139 Slow queries: 164 Opens: 53573 Flush tables: 1 Open tables: 337 Queries per second avg: 61.302.
编辑附加信息。
答案1
首先,尽管只是间接相关,但您可能应该考虑从 MyISAM 切换到 InnoDB。它在您可能拥有的并发类型下性能会更好,并且在发生崩溃时丢失数据的可能性要小得多。
您为 memcached 实例提供了多少内存?如果驱逐和未命中率较高,增加此值可能会有所帮助,但这需要进行一些实验。
考虑到您的数据集大小和可用 RAM,128MB 的 key_buffer 绝对太小了。我认为如果您有多余的 RAM,它应该更像是 1-2GB(或者,如果您切换到 InnoDB,请将“key_buffer”替换为“InnoDB 缓冲池大小”)。您的“blocks in”是 block out 的 3 倍,这可能意味着 MySQL 必须在很大一部分读取操作中访问磁盘。您可以使用 mysqltuner 或 phpmyadmin 中的统计数据来查看排序缓冲区等是否需要调整,但它们很可能不是最大的问题。
检查您的详细统计数据,如查询缓存的命中率。它很可能实际上对您没有任何好处,应该关闭,特别是因为您还使用 memcache。
好消息是,您是读受限而不是写受限,这意味着您可以通过缓存相对轻松地提高性能。最坏的情况是,如果您没有足够的可用 RAM 来增加 key_buffer 或 memcached,并且无法扩展当前服务器,您可以将 lighttpd 和 memcached 移动到附近的单独服务器,并将整个 ~8GB 专用于 MySQL。对于 10GB 数据集,这将足够了。无需为了性能而求助于复制从属,尽管正如其他人提到的那样是有利于备份和故障转移。
答案2
无论您是否可以减少开销,我都建议将 MySQl 复制到辅助服务器。使用一些负载平衡器,您可以大大减少停机时间并减轻服务器的负载。只是一个想法。如果您需要有关设置复制的指导,请给我发消息。
答案3
如果你的论坛流量与我在管理 vBulletin 时看到的流量类似,那么你真的不应该50-75% 的请求会调用 PHP 或 MySQL(即超过一半的请求来自未经身份验证的“潜水者”)。
如果您还没有这样做,请考虑为未经身份验证的用户实施反向代理 - 除非您对 vBulletin 进行了一些重大修改,否则未经身份验证的用户将看不到任何动态内容。
更新:相关阅读:如何将 Nginx 设置为缓存反向代理?
答案4
这是一个典型的 SQL 问题(无论它是 oracle、sql-server 还是 mysql 都无关紧要)。
数据库是 IO 绑定的。通常需要拥有大量快速磁盘。VPS 通常不允许您知道这里有什么。如果您说“169gb 磁盘”,那么问题是 - 您在这里有多少 IO 预算?如果那是简单磁盘上的简单小型虚拟磁盘,或者 raid 5...共享...便宜...欢迎使用慢速 IO。如果它在快速磁盘上,raid 10....这是一个问题。此外,在这样的大小下,您的服务器非常“不寻常”,因为它很小。10gb 数据库我会将其全部保存在内存中(12-16gb 服务器内存仅用于数据库服务器)。6 核和 7gb 有点奇怪(这么多核的内存很少)。
为了进行优化,您可以:
- 分析 SQL 语句,尤其是那些耗时且执行大量 IO 的语句。不确定如何从 MySQL 获取该信息(我主要使用 SQL Server)。也许缺少一些索引?900 万(!)帖子并不是每个论坛都有的,因此您可能会遇到对大多数人来说都不是问题的数据库优化问题。
- 进行磁盘 IO 检查并找出磁盘 IO 预算有多糟糕。
- 更改您的 Mysql 统计信息。您在此处引用的缓冲区对于 10gb 数据库来说非常小。例如:tmp_table_size = 16M - 如果某些内容需要临时表,那么对于 10gb 数据库来说,它可能太小了。与几乎所有其他项目一样 - 数据库不是 1gb 大,因此可能需要进行一些调整。