我们正在使用 ab (apachebench) 在一个页面上对我们的一个站点进行基准测试,该页面创建 MySQL 连接、查询,然后关闭连接(通过 PHP)。
我们对 my.cnf 进行了硬编码,最大连接数限制为 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(当然也可能是我们配置错误)。
非常感谢任何帮助、建议和提示 - 提前致谢。
最佳答案
好的,我已经找到了这个问题的罪魁祸首。
运行压力负载时,它不是渐进的 - 所有连接都立即打开,淹没了服务器。
MySQL 的默认 back_log
为 50 - 这是 MySQL 在处理它们之前可以拥有的未完成连接数。当服务器泛滥时,我们就达到了这个限制,并且超过 50 个阈值的进一步连接被拒绝。
为了解决这个问题,我们使用以下行编辑了 my.cnf,将监听积压增加到适合我们设置的合理 128:
back_log = 128
请注意,您可以在此处输入的最大值取决于您的操作系统以及操作系统中设置的限制。 MySQL 的最大监听积压量为 65535,但您的操作系统的数字可能小于该数字。
新的 back_log 为 128 后,我们的问题得到了解决,并且我们在负载下不再收到 Connection returned
错误消息。
关于mysql - 尽管新连接在负载下失败,但似乎无法达到 MySQL max_connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17455621/