在问这个之前我已经做了很多阅读,所以让我先说我没有用完连接,内存或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(足够的房间)
我实际上正在运行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
答案 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文件中,你可以使用。
答案 2 :(得分:0)
从我的头脑中,我可以将max_connections视为问题的可能来源。我会增加限制,至少可以消除这种可能性。
希望它有所帮助。