MySQL高CPU使用率


191

最近,我的服务器CPU性能一直很高。

CPU平均负载为13.91(1分钟)11.72(5分钟)8.01(15分钟),我的站点的流量仅略有增加。

运行完最高命令后,我看到MySQL使用的CPU是160%!

最近,我一直在优化表,并切换到持久连接。这会导致MySQL使用大量CPU吗?


4
持久连接几乎总是不适合使用。
杰森

我现在将它们取下并注意区别,因为我不记得一个月前CPU高于2!
2009年

2
服务器往往具有多个核心。CPU利用率百分比是相对于一个内核计算的,换句话说,完全用完两个内核的进程将拥有200%的CPU使用率。在这里,MySQL正在使用一个内核的100%,另一个内核的60%。这并不意味着所有CPU都用光了,很可能他仍然至少有两个空闲CPU。
xaav 2011年

高CPU几乎总是意味着效率低下的查询。通常可以通过更好的索引(尤其是“复合”)和/或重新构造查询来解决这些问题。
瑞克·詹姆斯

Answers:


265

首先,我想您可能想关闭持久性连接,因为它们几乎总是弊大于利。

其次,我想您要仔细检查您的MySQL用户,以确保任何人都无法从远程服务器进行连接。这也是要检查的主要安全事项。

第三,我想说您想打开MySQL慢查询日志来关注花费很长时间的所有查询,并使用它来确保您没有任何查询会长时间锁定键表。

您可以检查的其他一些事情是在CPU负载很高时运行以下查询:

SHOW PROCESSLIST;

这将向您显示当前正在运行或正在运行的队列中的所有查询,查询的内容以及其正在执行的操作(如果查询时间太长,此命令将截断查询,您可以使用SHOW FULL PROCESSLIST查看完整的查询文本) 。

您还需要注意缓冲区大小,表缓存查询缓存innodb_buffer_pool_size(如果使用的是innodb表)之类的东西,因为所有这些内存分配都会影响查询性能,这可能会导致MySQL吃光CPU。

您可能还想对以下内容进行重新阅读,因为它们包含一些有用的信息。

使用探查器也是一个很好的主意。您可以在需要时启用一些功能,这些功能将向您显示应用程序正在运行的查询,是否存在重复的查询,查询需要多长时间等。类似的示例就是我一直在努力的一个示例。PHP Profiler,但是有很多。如果您使用的是Drupal,Joomla或Wordpress之类的软件,您可能会想在社区中四处询问,因为可能有适合他们的模块,这些模块使您无需手动集成任何内容即可获取此信息。


12
非常感谢,我删除了持久连接,然后设置了慢查询日志。我读了日志,大部分查询来自两个表,并且这些表未正确索引!大约只有10分钟,但是结果如下:非常感谢CPU负载平均0.48(1分钟)0.95(5分钟)2.42(15分钟)
2009年

同样的问题,可以通过索引表来解决,这会减慢过程的速度,谢谢您Steven和Juddling
gabrielem

@Juddling请您详细说明如何索引表吗?也许一些联系?我知道已经有一段时间了,但是我对这件事真的很陌生。抱歉,这个
令人讨厌的

记录缓慢的查询有助于我找到CPU利用率高的特殊问题。就我而言,这是一个Wordpress插件(ultimate-tag-cloud-widget),它对每次点击都进行了可怕的查询,只是为了显示受欢迎的标签。这是一个很棒的插件,但需要通过某种形式的缓存进行增强(我最终对其进行了自定义以解决问题)。
jkincali

另一个有助于解决其他问题的方法是修改上述参数innodb_buffer_pool_size。在尝试找出导致CPU使用率高的原因时,我读到某处innodb_buffer_pool_size应该至少为文件ibdata1的大小,该文件位于/ var / lib / mysql中。当InnoDB能够驻留在内存中时,它似乎可以更有效地工作。在某些情况下,这可能很难做到,因为ibdata1可能很大!还建议在某处确保innodb_log_buffer_size为innodb_buffer_pool_size的25%。
jkincali

167

因为这是如果您在Google上查找MySQL高CPU使用率或负载的热门文章,我将添加一个附加答案:

2012年7月1日,当前的UTC时间增加了a秒,以补偿由于潮汐引起的地球自转缓慢。运行ntp(或ntpd)时,此秒已添加到计算机/服务器的时钟中。在某些操作系统上,MySQLd似乎并不想多花一秒钟的时间,并且会产生很高的CPU负载。快速修复是(作为根):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start

22
由于原始帖子大约在3年前,我怀疑这是原始海报问题的原因。但这是造成我问题的原因,并且刚刚救了我-谢谢!更多信息:blog.mozilla.org/it/2012/06/30/…–
罗素G

5
在Ubuntu 12.04上对我来说同样的问题和解决方案。解决步骤略有不同:service ntp stop && date -s“ date” && service ntp start MySQL CPU使用率立即从50-100%下降到
0-1

2
只能确保执行此操作吗?我的意思是,即使不是原因,运行它是否安全?
Muhammad Gelbana

2
2015年7月1日-我刚刚在当前运行Amazon Linux的AWS EC2服务器上遇到了这一leap秒的错误。sudo service ntpd stop在此配置上使用。
马特·范·安德尔

1
此解决方案+1。我的MySQL无缘无故地以50-60%的速度运行了几个月,在应用了此解决方案之后,它的运行速度下降到了现在的0.0-0.3%,这应该是应该的。非常感谢。
zeeshan 2015年

32

如果此服务器对外界可见,则值得检查一下是否有大量来自外界的连接请求(例如,试图闯入该服务器的人)


1
由于过去这是某些系统的原因,因此不知道为什么会引起匿名的否决。
罗兰·肖

2
我认为不赞成投票是因为让MySQL对外界可见并不是一个好主意。
MikeKulls 2013年

9
@MikeKulls不,这不是一个好主意,因为它将作为许多人尝试进入的目标,这将增加CPU负担-因此,我的回答是可能的原因。
罗兰·肖

16
我讨厌有人拒绝投票就去!
Muhammad Gelbana

1
+1是因为这绝对是MySQL拥有较高CPU使用率的正当理由,并且确实为此答案的任何人确实确实需要此信息!
克里斯·布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.