我在 mysqld 进程上遇到非常高的 CPU 峰值(大于 100%,甚至一度达到 300%)。我的平均负载约为:.25、.34、.28。
我读了这篇关于这个问题的精彩帖子:MySQL high CPU usage
要做的主要事情之一是禁用持久连接。所以我检查了我的 php.ini 和 mysql.allow_persistent = on
和 mysql.max_persistent = -1
-- 这意味着没有限制。
为了确定,在更改任何内容之前,这对我提出了几个问题:
- 如果我的 mysqld 进程每隔几秒就超过 100%,我的平均负载难道不应该比它们高吗?
- 禁用永久链接有何作用 - 我的脚本会继续按原样运行吗?
- 如果我关闭它并重新加载 php,这对我当前的用户意味着什么,因为会有很多活跃用户。
编辑:
CPU 信息:Core2Quad q9400 2.6 Ghz
最佳答案
持久连接本身不会使用任何 CPU - 如果没有任何东西在使用连接,它只是闲置并且只消耗一点内存并占用一个套接字。
平均负载就是平均值。如果您有一个每秒在 0% 和 100% 之间交替 10 次的进程,您将获得 0.5 的平均负载。它们有助于找出长期持续的高 CPU,但就其本质而言,它们会隐藏/消除峰值迹象。
通常不需要与 mysql 的持久连接。 MySQL 有一个相对快速的连接协议(protocol),使用持久连接所节省的时间是相当少的。缺点是一旦连接持续存在,它可能会处于不一致状态。例如如果使用该连接的应用程序意外终止,MySQL 将不会看到并开始清理。这意味着应用程序创建的任何服务器端变量、任何锁、任何事务等...都将保留在应用程序崩溃时它们所处的状态。
当连接被另一个应用程序重新使用时,您将从水槽中的脏盘子和未冲水的马桶开始。由于悬空事务/锁,它很容易导致死锁 - 新应用程序不会知道它们,并且旧应用程序不再存在以放弃它们。
关于php - MySQL 高 CPU 使用率和持久链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110230/