MySQL高CPU使用率和持久链接

6

我发现mysqld进程的CPU占用率非常高(大于100%,甚至有一次看到达到了300%)。我的负载平均值大约为:.25、.34、.28。

我读了这篇关于此问题的好文章:MySQL高CPU使用率

其中一个主要的解决方法是禁用持久连接。所以我查看了我的php.ini文件,mysql.allow_persistent = onmysql.max_persistent = -1 -- 这意味着没有限制。

在改变任何内容之前,这引发了我的几个问题:

  1. 如果我的mysqld进程每隔几秒钟就会飙升到100%以上,那么我的负载平均值不应该更高吗?
  2. 禁用持久链接会做什么-我的脚本是否会继续正常工作?
  3. 如果我关闭它并重新加载php,这对于我的当前用户意味着什么,因为有许多活跃的用户。

编辑:

CPU信息:Core2Quad q9400 2.6 Ghz

2个回答

8
持久连接本身不会使用任何CPU,如果没有使用连接,则它只是闲置并且仅占用一点内存和套接字。
负载平均值只是平均值。如果您有一个进程以10次/秒在0%和100%之间交替,则会得到0.5的平均负载。它们非常适合计算长期持续高CPU,但由于其性质,隐藏/消除了峰值的迹象。
通常不需要使用mysql的持久连接。MySQL具有相对快速的连接协议,并且使用持久连接节省的任何时间都相当有限。缺点是一旦连接变为持久连接,它可能会处于不一致的状态。例如,如果使用连接的应用程序意外死亡,则MySQL将看不到并开始清理。这意味着应用程序创建的任何服务器端变量、任何锁定、任何事务等都将保留在应用程序崩溃时的状态。
当另一个应用程序重新使用连接时,您将从洗涤槽中开始处理脏盘和未冲洗的马桶。由于悬挂的事务/锁定,它很容易导致死锁-新应用程序不知道它们,而旧应用程序不再存在以放弃这些内容。

谢谢你对厕所类比的解释 :) 所以,我的php.ini中的持久连接选项还可以,但是不要使用mysql_pconnect - 我明白了。 - bMon
在什么时候(数字)应该开始担心负载平均值?超过1.0、5.0、20.0? - bMon
2
持续连接本身并没有问题,只要你在脚本中有适当的错误处理机制即可应对任何问题,例如:"哎呀,我刚刚拉裤子了!"。如果脚本停止运行,就发出关闭连接的命令,这样MySQL就可以进行清理工作了。 - Marc B
我曾经见过负载达到20+的系统,但它们仍然非常响应。负载平均值只是一个简单的诊断指标,并不能真正告诉你系统的其余部分有多忙。你可以有一个0.01的负载平均值,但系统却因为某些东西完全占用了磁盘而变得缓慢。高CPU负载本身并没有任何意义。 - Marc B
可接受的负载取决于您拥有的CPU数量。单个CPU的一致负载为1将会看到退化,但4个CPU可能不会,直到它们达到4的负载。在共享CPU的虚拟环境中,这也受到同时步进所有CPU的需要的影响,等待其他VM上的负载。重点是,在特定机器的上下文之外谈论负载变得有点复杂。 - Josiah

0

出现峰值是正常的。这是MySQL在工作。您的负载平均值似乎适当。

禁用持久链接只意味着脚本无法使用现有的数据库连接。我不建议禁用此功能。如果您想禁用它们,至少要在应用程序上进行操作,而不是在MySQL上进行操作。根据条件,这甚至可能会增加负载。

最后,数据库持久性通常与您网站上的用户无关。用户发出请求,一旦加载了所有页面资源,就完成了,直到下一个请求为止(除了一些特殊情况)。无论如何,在请求发生时,脚本仍将连接到数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接