PHP / MYSQL 重负载下连接失败 mysql.sock

PHP / MYSQL connection failures under heavy load through mysql.sock

在问这个问题之前我已经阅读了很多书,所以让我先声明我没有 运行 连接、内存或 cpu,并且从我的角度来看可以告诉我,我也没有 运行 文件描述符。

这是 PHP 在 MySQL 负载很重时向我抛出的内容:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (11 "Resource temporarily unavailable")

这在负载下随机发生 - 但我推动得越多,php 向我抛出这个问题的频率就越高。发生这种情况时,我始终可以通过控制台从 PHP 到 127.0.0.1 进行本地连接,而不是使用更快的 unix 套接字的 "localhost"。

这里有一些系统变量可以排除常见问题:

cat /proc/sys/fs/file-max = 4895952
lsof | wc -l = 215778 (during "outages")

可用连接的最高使用率:26% (261/1000)

InnoDB缓冲池/数据大小:10.0G/3.7G(空间充足)

我其实是运行MariaDB(服务器版本:10.0.17-MariaDB MariaDB Server)

这些结果是在正常负载下和 运行 mysqlslap 在下班时间生成的,因此,慢查询不是问题 - 只是高连接。

有什么建议吗?如有必要,我可以报告额外的 settings/data - mysqltuner.pl 表示一切正常

再一次,这里揭示的是在这些中断期间通过 IP 连接工作正常并且速度很快 - 我只是不明白为什么。

编辑:这是我的 my.ini(根据我最近的故障排除更改,某些值可能看起来有点高,请记住 MySQL 日志、系统日志中没有错误, 或 dmesg)

socket=/var/lib/mysql/mysql.sock
skip-external-locking
skip-name-resolve
table_open_cache=8092
thread_cache_size=16
back_log=3000
max_connect_errors=10000
interactive_timeout=3600
wait_timeout=600                                                                                            
max_connections=1000
max_allowed_packet=16M
tmp_table_size=64M
max_heap_table_size=64M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=1M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_buffer_pool_size=10G

[mysql.server]
user=mysql

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open-files-limit=65535

这是可以而且应该通过分析来解决的问题。学习如何做到这一点是一项很棒的技能。

分析以找出在重负载下发生的情况...查询数量、执行时间应该是您的第一步。确定负载,然后进行正确的数据库配置设置。您可能会发现您需要优化 sql 查询!

然后确保 PHP 数据库驱动程序设置也一致,以充分利用数据库连接。

这是 MariaDB 线程池文档的 link。我知道它说的是 5.5 版,但它仍然相关,并且该页面确实引用了版本 10。列出的设置可能不在您可以使用的 .cnf 文件中。

https://mariadb.com/kb/en/mariadb/threadpool-in-55/

从我的脑海中,我认为 max_connections 可能是问题的根源。我会增加限制,以至少消除这种可能性。

希望对您有所帮助。

很可能是由于 net.core.somaxconn /proc/sys/net/core/somaxconn

的值是多少
net.core.somaxconn 

# The maximum number of "backlogged sockets".  Default is 128.

队列中尚未连接的连接数。该队列之上的任何东西都将被拒绝。我怀疑你的情况。尝试根据您的负载增加它。

作为根用户 运行

echo 1024 > /proc/sys/net/core/somaxconn