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

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

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

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


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


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

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

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

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

SHOW PROCESSLIST;

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

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

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

MySQL如何使用内存 MySQL系统变量

It's also a very good idea to use a profiler. Something you can turn on when you want that will show you what queries your application is running, if there's duplicate queries, how long they're taking, etc, etc. An example of something like this is one I've been working on called PHP Profiler but there are many out there. If you're using a piece of software like Drupal, Joomla or Wordpress you'll want to ask around within the community as there's probably modules available for them that allow you to get this information without needing to manually integrate anything.


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

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

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