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

时间:2015-03-03 09:23:49

标签: php mysql mariadb file-descriptor

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

当MySQL处于高负荷状态时,PHP会向我抛出这些内容:

  

无法通过套接字'/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(足够的房间)

  • soft nofile 999999
  • hard nofile 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

3 个答案:

答案 0 :(得分:9)

最有可能归因于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 

答案 1 :(得分:0)

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

分析以了解重负荷下发生的事情......查询次数,执行时间应该是您的第一步。确定负载,然后进行正确的db配置设置。您可能会发现需要优化sql查询!

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

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

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

答案 2 :(得分:0)

从我的头脑中,我可以将max_connections视为问题的可能来源。我会增加限制,至少可以消除这种可能性。

希望它有所帮助。