【问题标题】:Can't Seem to hit MySQL max_connections Although New Connections Fail Under Load尽管新连接在负载下失败,但似乎无法达到 MySQL max_connections
【发布时间】:2013-07-01 14:14:35
【问题描述】:

我们正在使用 ab (apachebench) 在创建 MySQL 连接、查询然后关闭连接(通过 PHP)的页面上对我们的一个网站进行基准测试。

我们已将 my.cnf 硬编码为 500 的 max_connections 限制。

当我们运行压力测试时,MySQL 似乎从未达到我们指定的连接限制,尽管我们确实有从我们的脚本返回的“无法连接到数据库”类型的错误。就好像 MySQL 一次打开的连接数不能超过大约 237 个。

这是我们当前的 my.cnf:

[mysqld]
max_connections = 500
port            = 3306
socket          = /var/mysql/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 128M
thread_concurrency = 8
max_heap_table_size = 512M
tmp_table_size = 512M
table_cache = 2048

用户限制:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 16384
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1250
virtual memory          (kbytes, -v) unlimited

问题似乎出在 PHP 或 MySQL 上(或者当然是我们的错误配置)。

非常感谢任何帮助、建议和提示 - 提前致谢。

【问题讨论】:

  • 你如何衡量活动连接?
  • 我们不测量实时连接,我们在压力测试后使用状态变量 Max_used_connections 一次测量最大使用连接。此外,MySQLTuner(perl 脚本)显示:可用连接的最高使用率:47% (237/500)。
  • 如果您收到 "unable to connect to the database" 作为错误,这不是因为它命中 max_connections - 您会看到 too many连接 在这种情况下。失败似乎还有另一个问题。
  • 这不是我们看到的确切错误,因为我们使用自定义 SQL 连接脚本,目前它有点损坏......事实上,我不知道连接失败的确切原因只是 PHP 脚本无法连接到数据库服务器。我将重写 PHP 以提供 PHP MySQL 库发出的确切错误消息,然后在此处更新。把它留给我,感谢您的 cmets。
  • 好的,所以我重新编写了我们的错误报告脚本,PHP/MySQL 发出的确切错误消息是:MySQL Error: Connection refused 所以这是一个连接被拒绝的问题。回到我原来的问题;为什么?感谢您提前提供任何帮助。

标签: mysql macos apache stress-testing ulimit


【解决方案1】:

好的,所以我找到了这个问题的罪魁祸首。

在运行压力负载时,它不是渐进式的 - 所有连接都同时打开,淹没了服务器。

MySQL 的默认back_log 为 50 - 这是 MySQL 在处理它们之前可以拥有的未完成连接数。当淹没服务器时,我们达到了这个限制,超过 50 个阈值的进一步连接被拒绝。

为了解决这个问题,我们使用以下行编辑了 my.cnf,将监听积压增加到合理的 128,这适用于我们的设置:

back_log = 128

请注意,您可以在此处输入的最大值取决于您的操作系统和您的操作系统中设置的限制。 MySQL 的最大侦听积压为 65535,但是您的操作系统可能有一个小于这个数字。

有了新的 back_log 128,我们的问题得到了解决,我们在加载时不再收到 Connection refused 错误消息。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多