V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jasondan
V2EX  ›  PHP

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

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