jasondan
V2EX  ›  PHP

PHP pdo 关于 mysql 报错 connection time out 的困惑,求指点

  •  
  •   jasondan · Jul 18, 2018 · 6612 views
    This topic created in 3030 days ago, the information mentioned may be changed or developed.

    最近我们项目迁移到 AWS,使用了提供的 RDS 服务,配置已经 16 核 cpu。最大连接数为 5000,但是当连接数接近 1000 的时候,php 就开始偶尔抛出这个错误,而且我发现 php 连接数据库的时候总会出现连接时长比较久的问题。linux 的句柄数都调最大,但是还是不 OK,各位大神有什么高见或者方向?

    22 replies  •  2018-09-08 10:31:45 +08:00
    HanSonJ
    HanSonJ
    Jul 19, 2018
    1
    看看是不是有 SQL 执行时间久占用资源
    tonylau
    tonylau
    Jul 19, 2018 via Android
    2
    连接数据库语句的 localhost 换成 127.0.0.1 应该就能搞定
    torbrowserbridge
    torbrowserbridge
    Jul 19, 2018 via Android
    3
    @tonylau 搞定个毛都说了是 rds
    yangqi
    yangqi
    Jul 19, 2018
    4
    最大连接数是服务器的还是 Mysql 的?另外 1000 的连接数在哪里看的。
    qiayue
    qiayue
    Jul 19, 2018
    5
    /t/465888 看看是不是 dns 问题
    caola
    caola
    Jul 19, 2018
    7
    排除连接上的问题,那就是你建立的连接数超过了数据库设定值或处理上限,
    或者你没有设置连接池,每次查询的连接闲置后不能及时释放,又导致无法新建立连接,
    不过如果查询很大的,还是建议做一些缓存,比如 redis 来缓存部分查询频繁的内容
    torbrowserbridge
    torbrowserbridge
    Jul 19, 2018
    8
    @tonylau 对不起,我戴上眼镜也没有看到和你这个链接有毛关系。都说了是 RDS,你家 RDS 和应用服务器是同一台机器?不然怎么会扯上 localhost 和 127.0.0.1 呢?再说了,这里是 AWS 你提供的是 Aliyun 的文档,几个意思到底。
    initialdp
    initialdp
    Jul 19, 2018
    9
    RDS 那边如果已经允许了 5000 连接数,那问题多半还是在 php/apache 这边。您可以检查一下 apache 中的配置,比如这篇文章提到的参数配置:
    https://serverfault.com/questions/732612/php-apache-handle-1000-simultaneous-request
    如果是 Nginx,应该也有类似的参数配置。
    shuck
    shuck
    Jul 19, 2018
    10
    php 使用结束 mysql 后 没有及时关闭数据库连接或者有很多慢 sql,导致连接无法释放,rds 的连接数是 5000,超过 5000 的连接后,后面的 sql 操作就会处于等待。检查慢 sql,优化代码
    floraX
    floraX
    Jul 19, 2018
    11
    抛开问题,但是当连接数接近 1000 的时候
    这个时候,你还用 mysql 抗,秀逗?
    Immortal
    Immortal
    Jul 19, 2018
    12
    其实我想说 mysql 连接数 1000 不是很正常么?也太小看 mysql 了
    jasondan
    jasondan
    OP
    Jul 19, 2018
    13
    @yangqi 你好是 mysql 的
    jasondan
    jasondan
    OP
    Jul 19, 2018
    14
    @qiayue dns 问题有坑的,我已经把 host 绑了,所以被我排除
    jasondan
    jasondan
    OP
    Jul 19, 2018
    15
    @floraX 额,这个是跟业务有一定原因,不过在目前配置看来 1000 个连接不会出什么性能问题
    jasondan
    jasondan
    OP
    Jul 19, 2018
    16
    @shuck 感谢回答,但是我的问题是处于数据库产生连接的时候爆出,但是连接数远远未达到界定值
    jasondan
    jasondan
    OP
    Jul 19, 2018
    17
    @caola 闲置的这个问题,我考虑过,经过长时间观察不会这种问题出现,所以应该是另外一方面
    jasondan
    jasondan
    OP
    Jul 19, 2018
    18
    @initialdp 感谢解答,我查看了下这里说的是 web 服务层面的并发控制问题,但是我的是 php client 向 RDS 服务单方面发起的请求。不过我会找找有没有相关类似的配置,可能跟你说的这个方向有类似
    xiaoxlm
    xiaoxlm
    Jul 19, 2018
    19
    mysql 有相关的错误或者 warning 日志吗
    yangqi
    yangqi
    Jul 19, 2018
    20
    @jasondan 闲置问题最有可能了,php 里面如果不直接关闭连接,php 结束后会释放资源,但 mysql 服务器上的连接不会马上断开,有个 wait_timeout 来控制多久断开闲置连接。所以根据描述这是最有可能的情况。
    jasondan
    jasondan
    OP
    Jul 19, 2018
    21
    @xiaoxlm mysql 报错偶尔会出现 connection timed out,不过我检查过链接数远远未达到上限,由于是 RDS 实例,也就没有了 ulimit 这个说法,有见过类似情况么
    jasondan
    jasondan
    OP
    Sep 8, 2018
    22
    这里回复下各位,经过与 AWS 的技术沟通,我发现 AWS rds 存在短连接数限制,当瞬间短链接塞满他们的 tcp 队列时,RDS 将会报出 connected time out,而这个时候 RDS 并不会有任何异常,没有任何负载问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5332 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    ♥ Do have faith in what you're doing.