2015-03-03 93 views
13

在问这个问题之前,我已经完成了很多的阅读工作,所以让我先说我没有用完连接,内存或者cpu,我可以告诉,我也没有用完文件描述符。通过mysql.sock在重负载下的PHP/MYSQL连接失败

这里的PHP抛出什么我当MySQL是在重负载下:

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

这种情况在负载下随机发生 - 但是我按的越多,php越频繁地向我抛出这个。发生这种情况时,我总是可以通过控制台本地连接,并通过127.0.0.1从PHP连接到本地,而不是使用速度更快的unix套接字的“localhost”。

下面的几个系统变量淘汰的常见问题:

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

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

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

  • 软NOFILE 999999
  • 硬NOFILE 999999

我实际运行MariaDB的(服务器版本:10.0.17-MariaDB的MariaDB的服务器)

这些结果都在正常负载下产生的,并在非工作时间运行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 
+0

什么是你的磁盘I/O是怎样的?如果你的瓶颈没有被内存,CPU或连接命中,它最有可能与加载时的磁盘I/O无法跟上.sock相关。你有没有尝试过使用套接字? – user3036342 2015-03-03 10:14:17

+0

在我绝对最糟糕的时候,仍然有0%的iowait(并且html页面服务很好,速度很快,控制台速度很快等,所以不是磁盘IO问题) - 我可以尝试不使用本地套接字 - 但这只会导致网络问题引入一堆更多的加载已经繁忙的服务器的TCP堆栈。我宁愿留在本地套接字的更快和推荐的方法。 – 2015-03-03 10:19:06

+0

它是一个可能的错误。试着改变你的版本 – 2015-03-05 13:27:26

回答

7

最有可能是由于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 
+0

它被设置为4096,我昨天改变了它,当我发现它发布为php-fpm/nginx问题的解决方案与本地插座。现在流量很低,我有机会再试一次,我发现错误消失了!我会为此奖励你的赏金,因为我相信你是对的!这很可能是罪魁祸首,谢谢! – 2015-03-07 14:09:32

+1

这是改变设置的最终名单关于net.core: net.core.somaxconn = 4096 net.core.netdev_max_backlog = 4096 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 – 2015-03-07 14:14:05

+0

好知道你的问题是固定的。谢谢 – 2015-03-07 15:14:35

0

这是可以并且应该通过分析解决的事情。学习如何做到这一点是一项非常棒的技巧。

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

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

以下是MariaDB线程池文档的链接。我知道它说的是5.5版本,但它仍然相关,页面没有参考版本10.列出的设置可能不在您的.cnf文件中,您可以使用。

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

+0

我很欣赏你的坦率,但我已经这样做了很长一段时间,遵循最佳实践,阅读了许多关于这个主题的书籍,并且从未遇到过这个问题。我在这里发布,因为无论查询(通过仅使用mysqlslap来证明)将中等(<25%cpu负载)放在机器上,我都会从PHP-FPM获取这些错误,而数据库通过TCP快速响应或命令行。数据库的优化对这种现象没有影响。我不经常在这里发布问题,只是非常困难的东西。 – 2015-03-05 17:29:52

+0

我的意思不是粗鲁,但我不是在寻找“阅读手册”作为解决方案。我没有用完CPU,RAM或文件描述符,数据库没有变慢,它反应非常好。在dmesg或mysql的日志中没有错误。这可能是操作系统或PHP的问题,我不确定哪一个,我在这里得到一些帮助,因为经过广泛的研究后,我很难过 - 我已阅读手册。 – 2015-03-05 17:38:30

+0

这种方法是我用来解决这些问题。我只是想为你查看RTFM以外的设置。你自便。 – 2015-03-05 18:23:11

0

从我的头顶,我能想到的max_connections作为问题的可能来源。我会增加限制,至少消除这种可能性。

希望它有帮助。

+0

感谢您的回答。我上面提到,我正在跟踪 - 可用连接的最高使用率:26%(261/1000) – 2015-03-06 13:42:53

相关问题