我在运行在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左右,在冻结之前和期间。 冻结似乎几乎是永久的。 它可以持续至less40分钟,重新启动mysql和php-fpm不会使它消失。 内存使用率永远不会超过可用内存的10%,交换不会被使用。
我必须解决的唯一办法就是重新启动VPS,这让我相信有一个潜在的系统错误configuration负责冻结。
不过有趣的是:这个问题有几次在没有重启的情况下解决了。 这些案件的共同点是,这个查询“仅”需要2-7秒才能完成。 在这些时候,问题在10-15分钟内消失。
那么,有什么build议可以解决这个问题呢?
更新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
你有没有监控磁盘I / O? I / O等待时间或排队事务增加了吗? 由于主机发生I / O限制,请求可能会在存储级别排队。 另外,你有没有检查你是否打你最大允许的MySQL客户端? 如果这些查询突然花费很长时间才能完成,那么也有可能没有为正常的站点stream量留下足够的可用连接,因为其他连接的closures速度不够快。
如果您使用VPS,则可能无法看到同一物理硬件上的其他主机正在发生什么情况。
可能是由你来负担很重的IO,可能会导致某些事情在一个完全独立的VPS备份中,这需要时间来解决。 这可能是为什么在你的系统上重新启动php和mysql不足以让事情回到正轨。 有趣的是,重启VPS听起来像是解决了问题? 任何机会,其实只是一段时间的function?
如果你closures了php和mysql,你会认为系统中没有太多的资源消耗(我在这里做了很多假设,但是你应该知道更多)。 检查,虽然。
看看还有哪些活动正在进行。 Atop是一个很好的工具,因为它包括查看每个进程的IO活动,给予足够的权限这样做。 iostat对于查看每个设备的总磁盘活动很有用。
如果您的VPS中没有太多的磁盘活动,但性能很差,那么很可能是在另一个VPS,甚至是主机。 您需要与您的托pipe服务提供商讨论这个问题,但请注意,如果您触发问题,那么您会希望他们担心这个问题。
可能是系统的限制,如果VPS负荷很重,你能否提供有关VPS负载的信息,以及系统日志?