【问题标题】:MySQL High CPU usage and persistent linksMySQL 高 CPU 使用率和持久链接
【发布时间】:2011-08-18 15:44:48
【问题描述】:

我在 mysqld 进程上遇到了非常高的 CPU 峰值(大于 100%,甚至一度达到 300%)。我的平均负载约为:0.25、0.34、0.28。

我读到了这篇关于这个问题的精彩帖子:MySQL high CPU usage

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

在更改任何内容之前,这向我提出了几个问题,以确保:

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

编辑:

CPU 信息:Core2Quad q9400 2.6 Ghz

【问题讨论】:

    标签: php mysql


    【解决方案1】:

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

    平均负载就是这样 - 平均值。如果您有一个每秒在 0% 和 100% 之间交替 10 次的进程,您将获得 0.5 的平均负载。它们非常适合找出长期持续的高 CPU,但本质上隐藏/消除了峰值的迹象。

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

    当连接被另一个应用重新使用时,你会从水槽里的脏盘子和没有冲水的马桶开始。由于悬空的事务/锁很容易导致死锁 - 新应用程序不会知道它们,旧应用程序不再可以放弃这些。

    【讨论】:

    • 感谢厕所类比 :) 所以我的 php.ini 中的持久链接选项很好,但不要使用 mysql_pconnect - 明白了。
    • 应该在什么时候(数字)开始担心负载平均值?超过 1.0、5.0、20.0?
    • 持久连接没有问题,只要你有正确的“zomg我刚刚加载了我的裤子”错误处理,以防你的任何脚本 - 如果脚本死了,然后发出关闭呼叫连接,以便 mysql 可以清理。
    • 我见过负载在 20+ 范围内的系统仍然可以完美响应。平均负载只是一个简单的诊断,并不能真正告诉您系统其余部分的繁忙程度。您的平均负载可能为 0.01,并且系统正在爬行,因为某些东西完全占用了磁盘。高 CPU 负载本身没有任何意义。
    • 可接受的负载取决于您拥有的 CPU 数量。负载一致为 1 的单个 CPU 会出现降级,但 4 个 CPU 可能直到负载达到 4。在共享 CPU 的虚拟环境中,这也受到需要将所有 CPU 步进同时,等待其他虚拟机上的负载。关键是,在特定机器的上下文之外谈论负载有点复杂。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2010-11-19
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多