MySQL CPU使用率高

最近我的服务器CPU一直非常高。

CPU负载平均为13.91(1分钟)11.72(5分钟)8.01(15分钟),我的网站只有轻微的流量增加。

在运行top命令后,我看到MySQL使用了160%的CPU!

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

409792 次浏览

如果这个服务器对外界可见,就值得检查它是否有很多来自外界的连接请求(即有人试图闯入它)。

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

其次,我想说的是,你要仔细检查你的MySQL用户,只是为了确保任何人都不可能从远程服务器连接。这也是需要检查的主要安全事项。

第三,我想说你想打开MySQL慢速查询 Log来监视任何花费很长时间的查询,并使用它来确保你没有任何查询锁定关键表太长时间。

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

SHOW PROCESSLIST;

这将显示当前正在运行或正在运行的队列中的任何查询,查询是什么以及它正在做什么(如果查询太长,此命令将截断查询,您可以使用show FULL PROCESSLIST查看完整的查询文本)。

你还需要注意你的缓冲区大小,表缓存查询缓存通过innodb_buffer_pool_size(如果你使用的是innodb表),因为所有这些内存分配都会对查询性能产生影响,从而导致MySQL耗尽CPU。

你可能还想阅读以下内容,因为它们包含了一些有用的信息。

使用分析器也是一个很好的主意。你可以在需要时打开它,它会显示你的应用程序正在运行哪些查询,是否有重复查询,它们需要多长时间,等等。类似的一个例子是我一直在做的PHP分析器,但还有很多。如果你正在使用Drupal、Joomla或Wordpress这样的软件,你会想要在社区内询问,因为可能有可用的模块可以让你获得这些信息,而不需要手动集成任何东西。

因为这是最上面的帖子,如果你谷歌MySQL的高CPU使用率或负载,我将添加一个额外的答案:

2012年7月1日,在当前的utc时间中增加了一闰秒,以弥补潮汐导致的地球自转放缓。当运行ntp(或ntpd)时,这一秒被添加到计算机/服务器的时钟中。MySQLd似乎不喜欢在某些操作系统上额外的这一秒,这会产生很高的CPU负载。快速解决方法是(作为根用户):

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