mysql 定期停止响应

mysql 定期停止响应

我在运行 32xCPU VMWare VPS 的 Ubuntu 14.04.3 服务器上运行一个网站(Magento)。

当负载过重时,它通常会每秒收到 20-25 个请求。在 magento 中,UPDATE对 mysql 表的特定查询通常需要约 1 毫秒(±0.2 毫秒),每分钟运行约 200-300 次(每秒 3-5 个查询)。然而,在每隔 1-2 小时出现这些重负载期间,这个特定查询突然需要 5-35 秒才能完成,这也会拖慢整个网站(即使没有这个查询的请求也是如此)。

我监控了 RAM 和 CPU 的使用率,无论是在冻结之前还是冻结期间,负载通常徘徊在 22-28 左右。冻结似乎几乎是永久性的。它可以持续至少 40 分钟,重新启动 mysql 和 php-fpm 也无法消除冻结。RAM 使用率从未超过可用 RAM 的 10%,并且从未使用过交换空间。

我解决这个问题的唯一方法是重新启动 VPS,这让我相信导致冻结的根本系统配置错误。

不过,有趣的是:有几次问题无需重启即可自行解决。这些情况的共同点是,此查询“仅”需要 2-7 秒即可完成。在这些情况下,问题会在 10-15 分钟内消失。

那么,对于导致这种情况的原因以及如何找出真正的潜在问题,有什么建议吗?

更新 1:系统负载(32 个 CPU 核心 1 分钟负载)通常峰值为 27-28,但在极端负载下可能高达 40。当发生此冻结时,在冻结之前和冻结期间负载通常为 22-27。大多数(如果不是所有)可用 CPU 核心(32)在冻结期间都有一些空闲时间。

更新 2: 我对 my.cnf 做了以下更改:

innodb_buffer_pool_size = 10G (Innodb data is 5.5G)
key_buffer          = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size   = 8
max_connections     = 1024

答案1

您是否监控过磁盘 I/O?I/O 等待时间或排队事务是否有所增加?由于主机设置的 I/O 限制,请求可能在存储级别排队。此外,您是否检查过是否已达到最大允许 mysql 客户端数?如果这些查询突然需要很长时间才能完成,也可能是因为其他连接关闭速度不够快,导致无法为正常站点流量留下足够的可用连接。

答案2

如果您正在使用 VPS,您可能无法看到同一物理硬件上其他主机上发生的情况。

可能是由于 IO 负载过重(可能是您造成的),导致完全独立的 VPS 出现备份,然后需要时间来解决。这可能是为什么在系统上重新启动 php 和 mysql 不足以让事情回到正轨的原因。有趣的是,重新启动 VPS 听起来确实可以解决问题?这是否可能只是时间问题?

如果您关闭 php 和 mysql,您会认为系统中不会有太多资源消耗(我在这里做了很多假设,但您应该了解更多)。不过请检查一下。

查看仍在进行的活动。Atop 是一款不错的工具,因为它包括查看每个进程的 IO 活动(如果有足够的权限)。iostat 可用于查看每个设备的总磁盘活动。

如果您的 VPS 中没有太多磁盘活动,但性能却很差,那么问题很可能出在另一个 VPS 上,甚至可能是主机上。您需要与您的托管服务提供商讨论这个问题,但请注意,如果问题是由您引发的,那么您会认为他们会对此感到担忧。

答案3

如果 VPS 负载过重,则可能是系统限制,您能否提供有关这种情况时的 VPS 负载信息以及系统日志?

相关内容