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

标签 php mysql mariadb file-descriptor

在问这个问题之前我已经做了很多阅读,所以让我先说我没有用完连接、内存或 cpu,据我所知,我没有用完文件描述符。

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

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

这在负载下随机发生 - 但我插入得越多,php 就越频繁地向我抛出这个问题。当发生这种情况时,我始终可以通过控制台在本地连接,并通过 127.0.0.1 从 PHP 连接,而不是使用更快的 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 连接工作正常并且速度很快 - 我只是不明白为什么。

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

最佳答案

很可能是由于 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 

关于通过 mysql.sock 在重负载下的 PHP/MYSQL 连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828141/

相关文章:

php - 带重音字符的 Json 编码

sql - MySQL Group By 并根据年龄进行分组

php - ORDER BY mysql_real_escape_string($_GET ['id' ]) 错误后

php - 使用 php 获取窗口标题在浏览器调用中不起作用

php - 如何显示子类别的面包屑

mysql - 如何在选择时将 NULL 包含到 ENUM 中?

php - PDO误报死锁

php - Laravel 在 null 上调用成员函数 setCookie() - 当从中间件返回 Controller 操作时

mysql - JOIN UPDATE mysql,无法正常工作

java - MariaDB 闲置一段时间后无法工作