最近我们项目迁移到 AWS,使用了提供的 RDS 服务,配置已经 16 核 cpu。最大连接数为 5000,但是当连接数接近 1000 的时候,php 就开始偶尔抛出这个错误,而且我发现 php 连接数据库的时候总会出现连接时长比较久的问题。linux 的句柄数都调最大,但是还是不 OK,各位大神有什么高见或者方向?
1
HanSonJ 2018-07-19 00:03:25 +08:00
看看是不是有 SQL 执行时间久占用资源
|
2
tonylau 2018-07-19 00:37:51 +08:00 via Android
连接数据库语句的 localhost 换成 127.0.0.1 应该就能搞定
|
3
torbrowserbridge 2018-07-19 00:47:53 +08:00 via Android
@tonylau 搞定个毛都说了是 rds
|
4
yangqi 2018-07-19 00:52:45 +08:00
最大连接数是服务器的还是 Mysql 的?另外 1000 的连接数在哪里看的。
|
6
tonylau 2018-07-19 01:13:55 +08:00 via Android
|
7
caola 2018-07-19 02:01:22 +08:00
排除连接上的问题,那就是你建立的连接数超过了数据库设定值或处理上限,
或者你没有设置连接池,每次查询的连接闲置后不能及时释放,又导致无法新建立连接, 不过如果查询很大的,还是建议做一些缓存,比如 redis 来缓存部分查询频繁的内容 |
8
torbrowserbridge 2018-07-19 08:14:24 +08:00
@tonylau 对不起,我戴上眼镜也没有看到和你这个链接有毛关系。都说了是 RDS,你家 RDS 和应用服务器是同一台机器?不然怎么会扯上 localhost 和 127.0.0.1 呢?再说了,这里是 AWS 你提供的是 Aliyun 的文档,几个意思到底。
|
9
initialdp 2018-07-19 08:36:38 +08:00
RDS 那边如果已经允许了 5000 连接数,那问题多半还是在 php/apache 这边。您可以检查一下 apache 中的配置,比如这篇文章提到的参数配置:
https://serverfault.com/questions/732612/php-apache-handle-1000-simultaneous-request 如果是 Nginx,应该也有类似的参数配置。 |
10
shuck 2018-07-19 09:39:50 +08:00
php 使用结束 mysql 后 没有及时关闭数据库连接或者有很多慢 sql,导致连接无法释放,rds 的连接数是 5000,超过 5000 的连接后,后面的 sql 操作就会处于等待。检查慢 sql,优化代码
|
11
floraX 2018-07-19 10:28:53 +08:00
抛开问题,但是当连接数接近 1000 的时候
这个时候,你还用 mysql 抗,秀逗? |
12
Immortal 2018-07-19 10:49:56 +08:00
其实我想说 mysql 连接数 1000 不是很正常么?也太小看 mysql 了
|
18
jasondan OP @initialdp 感谢解答,我查看了下这里说的是 web 服务层面的并发控制问题,但是我的是 php client 向 RDS 服务单方面发起的请求。不过我会找找有没有相关类似的配置,可能跟你说的这个方向有类似
|
19
xiaoxlm 2018-07-19 19:32:36 +08:00
mysql 有相关的错误或者 warning 日志吗
|
20
yangqi 2018-07-19 21:24:09 +08:00
@jasondan 闲置问题最有可能了,php 里面如果不直接关闭连接,php 结束后会释放资源,但 mysql 服务器上的连接不会马上断开,有个 wait_timeout 来控制多久断开闲置连接。所以根据描述这是最有可能的情况。
|
21
jasondan OP @xiaoxlm mysql 报错偶尔会出现 connection timed out,不过我检查过链接数远远未达到上限,由于是 RDS 实例,也就没有了 ulimit 这个说法,有见过类似情况么
|
22
jasondan OP 这里回复下各位,经过与 AWS 的技术沟通,我发现 AWS rds 存在短连接数限制,当瞬间短链接塞满他们的 tcp 队列时,RDS 将会报出 connected time out,而这个时候 RDS 并不会有任何异常,没有任何负载问题
|