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

2022-08-31 01:17:49

在问这个问题之前,我已经做了很多阅读,所以让我先说我没有耗尽连接,内存或CPU,从我所知道的,我也没有耗尽文件描述符。

以下是PHP在MySQL负载过重时向我抛出的内容:

无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器(11 “资源暂时不可用”)

这在负载下随机发生 - 但是我推送的越多,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(充足的空间)

  • 软无文件999999
  • 硬无文件999999

我实际上正在运行MariaDB(服务器版本:10.0.17-MariaDB MariaDB Server)

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

有什么建议吗?如有必要,我可以报告其他设置/数据 - mysqltuner.pl 说一切都很好

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

编辑:这是我的.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

答案 1

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

net.core.somaxconn 

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

队列中尚未连接的连接。该队列上方的任何内容都将被拒绝。我怀疑这在你的情况下。尝试根据您的负载增加它。

以 root 用户身份运行

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

答案 2

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

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

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

以下是 MariaDB threadpool 文档的链接。我知道它说的是5.5版本,但它仍然相关,页面确实引用了版本10。列出的设置可能不在 .cnf 文件中,您可以使用这些设置。

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


推荐