V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jasondan
V2EX  ›  PHP

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

  •  
  •   jasondan · 2018-07-18 23:42:48 +08:00 · 5262 次点击
    这是一个创建于 2345 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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