mysqli php随机连接错误

Ara*_*rav 8 php mysql mysqli mysqladmin

我从php后端作业和php网页日志中随机收到以下错误.有一个运行php后端作业和php网络服务器的应用服务器.两者都连接到同一个数据库服务器.使用php mysqli面向对象的库来连接数据库.在my.cnf中将最大连接数设置为750.没有看到达到很多连接.

PHP警告:mysqli :: mysqli():( HY000/2003):无法连接到第57行/usr/local/dev/classes/Admin.php中'77 .777.120.81'(99)上的MySQL服务器

无法连接到MySQL:无法连接到'77 .777.120.81'(99)上的MySQL服务器

Pet*_*mis 6

正如Percona数据库性能博客文章中所述,您的问题是您的应用程序无法打开与MySQL服务器的另一个连接.您的本地TCP端口已用完.作为一种解决方案,我建议调整TCP参数设置

  • tcp_tw_reuse(布尔值;默认值:禁用;自Linux 2.4.19/2.6)允许在协议角度安全的情况下重新使用TIME_WAIT套接字用于新连接.没有技术专家的建议/要求,不应该改变它.

    通过将/ proc/sys/net/ipv4/tcp_tw_reuse设置为1,可以强制内核重用挂在TIME_WAIT状态的连接.在实践中会发生的事情是,您将继续看到TIME_WAIT中挂起的已关闭连接,直到它们为止到期或请求新连接.在后一种情况下,连接将"重新".

  • tcp_tw_recycle(布尔值;默认值:禁用;自Linux 2.4起)启用TIME_WAIT套接字的快速回收.建议不要启用此选项,因为这会在使用NAT(网络地址转换)时导致问题.

    启用/ proc/sys/net/ipv4/tcp_tw_recycle时,关闭的连接将不再显示在TIME_WAIT下 - 它们将完全从netstat中消失.但是一旦你打开一个新的连接(在60秒内),它将回收其中一个.但是每个人都在撰写关于这种替代方案的文章,似乎建议不要使用它.底线是:重用连接比回收连接更好.

  • tcp_max_tw_buckets(整数;默认值:见下文;自Linux 2.4起)系统允许的TIME_WAIT状态的最大套接字数.此限制仅用于防止简单的拒绝服务攻击.根据系统中的内存调整NR_FILE*2的默认值.如果超过此数量,则关闭套接字并打印警告.

    此参数规定了多少连接可以同时保持在TIME_WAIT状态:内核将简单地终止挂在该数字之上的状态的连接.例如,在服务器具有仅由6个端口组成的TCP端口范围的情况下,如果/proc/sys/net/ipv4/tcp_max_tw_buckets设置为5,则打开与MySQL的6个并发连接,然后立即关闭所有6个,您将发现其中只有5个挂在TIME_WAIT中状态 - 与其一样tcp_tw_recycle,其中一个将从netstat输出中消失.这种情况允许立即打开新连接而无需等待一分钟*.

    • 在连接到数据库服务器时,许多应用程序选择仅为单个请求打开新连接,在处理请求后立即关闭它.即使连接被客户端(应用程序)关闭,它正在使用的本地端口也不会被操作系统立即释放以供另一个连接重用:它将处于TIME_WAIT状态(通常)为60秒 - 此值不能为很容易改变,因为它在内核中是硬编码的.

    但是,在TIME_WAIT中的其他5个连接之一到期并释放它正在使用的本地端口之前,第二个连接将无法打开.那么,这里的秘密是在可用网络端口数量和允许保持TIME_WAIT状态的连接数之间找到折衷方案.此设置的默认值为65536,这意味着默认情况下,系统允许所有可能的连接在关闭时超过TIME_WAIT状态.

PS:您的问题有更多可能的解决方案,请阅读完整文章以了解问题的详细说明.