MySQL高CPU使用率和持久链接

时间:2011-08-18 15:44:49

标签: php mysql

我在mysqld进程上的CPU峰值非常高(超过100%,甚至一度看到300%)。我的平均负载大约是:.25,.34,.28。

我读了这篇关于这个问题的精彩文章:MySQL high CPU usage

要做的主要事情之一是禁用持久连接。所以我检查了我的php.ini和mysql.allow_persistent = on以及mysql.max_persistent = -1 - 这意味着没有限制。

在改变任何事情之前,这为我提出了一些问题:

  1. 如果我的mysqld进程每隔几秒钟超过100%,那么我的负载平均值不应高于它们吗?
  2. 禁用持久链接会做什么 - 我的脚本会继续按原样运行吗?
  3. 如果我关闭它并重新加载php这对我当前的用户意味着什么,因为会有很多活跃的用户。
  4. 编辑:

    CPU信息:Core2Quad q9400 2.6 Ghz

2 个答案:

答案 0 :(得分:8)

持久连接本身不会使用任何CPU - 如果没有使用连接,它只是处于空闲状态,只占用一点内存并占用套接字。

负载平均值就是 - 平均值。如果您的进程每秒10次在0%和100%之间交替变换,则平均负载为0.5。它们有助于找出长期持续存在的高CPU,但是它们本质上隐藏/消除了尖峰的迹象。

通常不需要与mysql的持久连接。 MySQL具有相对快速的连接协议,使用持久连接节省的时间相当少。缺点是一旦连接持续存在,它就会处于不一致状态。例如如果使用连接的应用程序意外死亡,MySQL将无法看到并开始清理。这意味着应用程序创建的任何服务器端变量,任何锁定,任何事务等等都将保留在应用程序崩溃时所处的状态。

当连接被另一个应用程序重新使用时,您将从水槽中的脏盘子和未冲洗的马桶开始。它可以很容易地导致死锁,因为悬挂的事务/锁定 - 新的应用程序将无法了解它们,旧的应用程序不再放弃那些。

答案 1 :(得分:0)

尖峰很好。这是MySQL正在做的工作。您的平均负载似乎是合适的。

禁用持久链接只是意味着脚本无法使用与数据库的现有连接。我不建议禁用它。至少,如果要禁用它们,请稍后在应用程序上执行,而不是在MySQL上执行。这可能会略微增加负载,具体取决于条件。

最后,数据库持久性与您网站上的用户(通常)无关。用户发出请求,并且一旦加载了所有页面资源,就是它,直到下一个请求。 (在少数特定情况下除外。)在任何情况下,当请求发生时,脚本仍将连接到数据库。