206

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

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

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

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

4

3 回答 3

278

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

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

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

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

SHOW PROCESSLIST;

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

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

您可能还希望阅读以下内容,因为它们包含一些很好的信息。

使用分析器也是一个非常好的主意。您可以在需要时打开一些东西,它会显示您的应用程序正在运行哪些查询,是否有重复的查询,它们花费了多长时间等等。我一直在研究的一个例子是这样的PHP Profiler但那里有很多。如果您使用的是 Drupal、Joomla 或 Wordpress 等软件,您需要在社区内四处询问,因为可能有可用的模块让您无需手动集成任何东西即可获取此信息。

于 2009-08-15T16:35:46.110 回答
170

如果您在谷歌上搜索 MySQL 高 CPU 使用率或负载,这是最重要的帖子,我将添加一个额外的答案:

2012 年 7 月 1 日,在当前的 UTC 时间中增加了闰秒,以补偿由于潮汐导致的地球自转减慢。在运行 ntp(或 ntpd)时,这一秒被添加到您的计算机/服务器的时钟中。MySQLd 在某些操作系统上似乎不喜欢这个额外的秒数,并且会产生高 CPU 负载。快速修复是(作为根):

$ /etc/init.d/ntpd stop
$ date -s "`date`"
$ /etc/init.d/ntpd start
于 2012-07-02T12:13:06.943 回答
36

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

于 2009-08-15T16:22:16.370 回答