MySQL 正在终止服务器 IO

MySQL 正在终止服务器 IO

可能重复:
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 大,因此可能需要进行一些调整。

相关内容