【问题标题】:MySQL too many concurrent connections at onceMySQL一次并发连接太多
【发布时间】:2012-12-13 19:36:07
【问题描述】:

我一次用 200 个并发用户测试 JMeter 大约 30 秒,发现 MySQL 连接失败。

数据库结构良好,具有索引、查询和缓存。

这是我们需要关注 MySQL 企业的时候吗?

或者我们有什么办法可以改善这一点?

这是我得到的错误:

Error: 2002 - Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

mysql_connect() PHP 函数被触发时也会产生错误

【问题讨论】:

  • 您遇到什么错误?这个问题很模糊,不够具体。您冒着在没有其他信息的情况下关闭它的风险。
  • 这是您网站上的实际问题还是只是测试?与 DB 的 200 个并发连接相当多,而且您将面临的第一个限制可能来自服务器。 Apache 默认配置为处理 150 个连接,所有其他连接都将处于等待状态。

标签: php mysql apache


【解决方案1】:

您需要设置 MySQL 全局变量 max_connections 以增加每台 MySQL 服务器的最大连接数。但是,您需要注意,增加多个连接意味着更多的 CPU 和内存消耗。

【讨论】:

    【解决方案2】:

    尝试在 MySQL 中设置 max_connections 变量 - 200 个连接应该不是太大的问题,除非您的查询非常复杂。

    SET GLOBAL max_connections=500;
    

    如果这没有帮助,请使用您的 JMeter 结果来确定哪些查询比其他查询花费的时间长得多(使用加速期和/或最大用户数来获得大量样本实际上没有连接失败

    因此,这些查询需要重构和/或相关数据需要重构。如果您尝试避免过多的连接和嵌套的选择语句,即使在索引良好的系统上,也可以大大提高查询性能。使用 MySQL 的EXPLAIN 功能来了解数据库实际上为您做了多少工作。

    【讨论】:

      【解决方案3】:

      在 php.ini 中,检查

      mysql.allow_persistent = xx
      mysql.max_persistent = xx
      mysql.max_links = xx
      mysql.connect_timeout = xx
      

      如果您的服务提供商允许,也可以使用 ini_set() 在您的代码中设置它们。

      http://php.net/manual/en/ini.list.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-27
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多