【发布时间】:2015-05-03 21:18:47
【问题描述】:
在问这个问题之前我已经阅读了很多内容,所以让我先说我没有用完连接、内存或 cpu,据我所知,我没有用完文件描述符。
当 MySQL 负载过重时,PHP 会向我抛出以下问题:
无法通过socket '/var/lib/mysql/mysql.sock'连接本地MySQL服务器(11“资源暂时不可用”)
这在负载下随机发生 - 但我推得越多,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
【问题讨论】:
-
你的磁盘 I/O 是什么样的?如果您的瓶颈没有出现在内存、cpu 或连接上,则很可能与负载下的磁盘 I/O 跟不上 .sock 有关。你试过不使用套接字吗?
-
在我最糟糕的情况下,iowait 仍然为 0%(而且 html 页面的服务又好又快,控制台速度很快,等等,所以不是磁盘 IO 问题) - 我可以尝试不使用本地套接字 -但这只会通过在已经很忙的服务器的 TCP 堆栈上引入更多负载来滋生网络问题。我宁愿继续使用更快和推荐的本地套接字方法。
-
这是一个可能的错误。尝试更改您的版本
-
你如何运行你的 PHP 代码?例如 PHP-FPM 有一个文件描述符的最大限制设置,我不确定这是否只影响主进程或者它是否在所有工作进程之间共享,但您可能需要检查一下。
-
@AndréDaniel - 我制作了一个简单的测试脚本来尝试连接并输出任何错误,然后我从命令行运行它以从等式中删除 Web 服务。我还在凌晨 3 点使用 mysqlslap 生成负载以消除传入连接或复杂查询问题。底线是在中等负载下 PHP 和 Mysql 之间的套接字连接出现问题 - 但性能和 TCP 连接不受影响。
标签: php mysql mariadb file-descriptor