虽然新连接在负载下失败,但看起来无法点击MySQL max_connections

时间:2013-07-03 18:30:59

标签: mysql macos apache stress-testing ulimit

我们正在使用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(或者当然是我们的错误配置)。

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

1 个答案:

答案 0 :(得分:2)

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

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

MySQL的默认back_log为50 - 这是MySQL在处理它们之前可以拥有的未完成连接数。当洪水泛滥服务器时,我们达到了这个限制,并且拒绝了超过50门槛的更多连接。

要解决此问题,我们使用以下行编辑my.cnf,将listen backlog增加到合理的128,这对我们的设置有效:

back_log = 128

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

新的back_log为128,我们的问题已修复,我们不会在加载时收到Connection refused错误消息。