2

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

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

当我们运行压力测试时,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 上(当然也可能是我们配置错误)。

非常感谢任何帮助、建议和提示 - 在此先感谢。

4

1 回答 1

3

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

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

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

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

back_log = 128

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

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

于 2013-07-03T22:00:40.843 回答