`

MySQL连接超时

 
阅读更多

  在负载较重的MySQL服务器上,有时你偶尔会看到一些连接超时的错误,诸如: Can’t connect to MySQL server on ‘mydb’(110)。如果当时你有多个连接请求,你会发现其它连接却没问题。这类问题开始时很不显眼,且长时间来看几乎可以忽略不计(注:次数不 多),类似于百万分之一的发生率,但是在服务器负载不断加重时,可能出现的频率将有所上升。

如果你对连接进行计时你会发现,连接一般都接近3-9秒。这个时长有时也很诡异,多年前我就曾遇到过一次,当时数据库请求连接被重置,SYN包一直被丢 弃。3秒就有一个SYN包被抛弃,9秒有两被抛弃。如果你也碰到了类似情况,则有可能是你的网络存在问题或你的数据库服务器请求侦听队列溢出,你可以通过 运行netstat -s命令进行检查,可能会返回类似于:侦听队列的Socket发生了38409次溢出,38409个SYN包被丢弃,这就意味着侦听Socket的内核缓 存溢出了,SYN包将不得不被丢弃 -- MySQL并不是在需要时就尽快接受连接。

如果发生了这种情况,有2个调优的地方你可以考虑。
1. Linux内核:net.ipv4.tcp_max_syn_backlog,这参数是用来设置所有Socket内核缓存大小的。我的系统缺省值为2048,其它版本可能不尽相同,如果你的连接并发较大则你可能需要将此值提高到8192左右。具体匹配情况我会在下面介绍。

2.
MySQL参数:back_log,缺省值为50。你可能需将此值设置为1000或更高。同时,你可能提高net.core.somaxconn内核参数值,这个参数是用来设置侦听队列的最大深度。我本人内核中此参数设置的是128,这在很多情况下会偏低。

现在我们来深入研究下这个问题。首先看看MySQL是如何接受连接的。有个主线程将接受所有请求侦听Socket的连接。当有个新连接来到时,主线程将为 新连接创建一个新的Socket,同时创建一个新的子线程或从缓存中取一个子线程来处理这个连接。站在MySQL网络通讯基多线程这点来看,多核是有利 的,但对于主线程来说,多核并没什么用。通常主线程接受连接会很快,但是,如果主线程因为互斥等待或为启动新线程而等待,则侦听队列可能会溢出。我们来看 看,如果一个数据库一般每秒能接受1000个连接,这个值很高,但你可能会碰到更高的。因为连接请求的随机到达特性,有时你可能会看到3000个连接并发。这种情况下,缺省的back_log(50)仅能支撑17毫秒,主线程在某些地方处理稍有停滞超过17毫秒,则有些SYN包将被丢弃。

我建议将tcp_max_syn_backlog和back_log的值调整到足够支撑2秒的连接请求(注:连接请求2秒未超时)。比方说,正常情况下每 秒有100个连接,假设峰值为3倍正常情况,则为300连接/秒,这意味着前面提到的参数至少需设到600。(注:300连接/秒 * 2秒 = 600连接/秒)

将参数设到支持2秒以上请求的意义不大,因为客户端在3秒内未收到应答后将发出新的连接请求。

另外,如果你每秒创建了1000个MySQL连接,你可能有点过了,毕竟创建和销毁1000个连接需使用大量的资源。考虑下使用长连接或连接池吧,至少是那种大部分连接是由应用创建的情况。

分享到:
评论

相关推荐

    nodejs 关于mysql模块 连接超时自动断开解决方法

    nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分

    关于MySQL的wait-timeout连接超时问题报错解决方案.docx

    MySQL 连接超时问题解决方案 wait_timeout 参数的重要性 在 MySQL 中,wait_timeout 参数是控制连接超时的关键参数。当该参数设置的太大时,可能会导致 MySQL 中大量的 SLEEP 进程无法及时释放,拖累系统性能。...

    关于MySQL的wait-timeout连接超时问题报错解决方案.pdf

    MySQL 连接超时问题解决方案 在 MySQL 中,wait_timeout 参数控制着连接的超时时间,如果设置的过大,可能会导致大量的 SLEEP 进程无法及时释放,拖累系统性能;反之,如果设置的过小,可能会遭遇到“MySQL has ...

    c#socket连接池和连接超时时间设置

    提供一个c# socket连接池设计的例子,解决socket并发连接限制的问题,并且提供一种设置连接超时时间的方法,默认连接超时时间是不能设置的,提供了socket网络发送数据的接口.可用于pos小票打印机通讯。

    mysql 8小时空闲后连接超时的问题

    MySQL数据库在设计时为了优化资源使用和安全性,设置了一些连接超时机制。当数据库客户端与服务器之间的连接在一定时间内无任何交互(即空闲),MySQL会自动关闭这个连接以释放系统资源。通常,默认的`wait_timeout`...

    mysql连接驱动jar包

    - 连接超时:可能需要调整MySQL服务器的wait_timeout参数,或者在Java代码中设置合理的连接超时时间。 - 认证失败:检查用户名、密码及数据库名称是否正确,以及MySQL服务器的权限设置。 - 网络问题:确保Java应用...

    qt中mysql超时自动断开连解决方案.txt

    可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分

    Durid连接Mycat+MySQL过程中报1243错误的解决办法

    开始受到“Communications link failure”和“连接超时”等信息的误导,一直将问题定位在“MySQL 连接超时时间”Timeout 参数上,该参数默认为 8 小时,并且一直认为问题就出在 “MySQL”上,甚至于要大动干戈的将 ...

    MySQL数据库连接超时(Wait_timeout)问题总结.pdf

    MySQL数据库的连接超时问题,通常表现为Wait_timeout错误,指的是当客户端与服务器之间的连接在指定时间内没有进行任何数据交互,数据库会自动断开这个连接,以释放资源并防止不必要的资源占用。这一特性在MySQL中是...

    c# mysql数据库连接池实现

    可以根据应用需求调整连接池的参数,如最大连接数、空闲超时时间等。这些参数可以通过`UseMySql`方法中的`mySqlOptions`进行设置。 7. 性能优化 连接池可以减少创建和关闭连接的开销,提高系统性能。但过多的空闲...

    MySQL wait_timeout连接超时

    MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...

    解压版mysql安装教程

    1. 如何解决 MySQL 连接超时的问题? 可以通过设置 max_connections 的值来增加连接数,或者尝试使用连接池来解决连接超时的问题。 2. 如何解决 MySQL 数据库文件损坏的问题? 可以通过使用 mysqlcheck 工具来...

    mysql连接池java源码

    MySQL连接池在Java应用开发中扮演着至关重要的角色,它是一种管理数据库连接的机制,能够有效地提高数据库操作的性能和效率。在这个项目中,我们看到的是一个纯手工编写的Java源码实现,不依赖任何外部数据库驱动,...

    PHP超时处理全面总结.docx

    4. **MySQL连接超时** - 在与MySQL交互时,可以使用`PDO`或`mysqli`的连接选项来设置超时,如`PDO::ATTR_TIMEOUT`和`mysqli_connect_timeout`。 5. **Memcached超时** - 在使用Memcached扩展时,可以设置`...

    spark作业 metastore 连接超时

    另外,若MySQL数据库负载过高,这也可能引起连接超时。但由于缺乏MySQL监控数据,无法准确判断是否为数据库负载引起的问题。在这种情况下,建议加强数据库的监控,以便更准确地评估数据库的工作状况。 为了从源头...

    Mysql keepalive-1.4.5.tar.gz

    Keepalive的主要功能是防止因网络问题或长时间无数据交换导致的MySQL连接超时关闭。这对于那些需要保持持久连接的应用,比如Web服务器与数据库之间的连接,是非常有用的。 Keepalived本身通常被关联到LVS(Linux ...

    解决MySQL 5数据库连接超时问题

    mysql5将其连接的等待时间(wait_timeout)缺省为8小时。怎么不让它超时呢

    使用Linux的Shell脚本定时处理MySQL超时

    2. 通过`mysql`命令行工具连接到MySQL服务器,用`show processlist`命令获取当前所有进程的信息,并使用`grep`过滤出状态为“Locked”的进程,将其输出到临时文件`file_tmp`。 3. 使用`awk`命令从临时文件中提取每...

    MySql数据库连接池C#代码(有注释含测试代码)

    - 超时策略:设置超时机制,避免因长时间未使用的连接占用资源。 - 监控和日志:监控连接池的使用情况,记录异常,便于调试和优化。 总的来说,这个代码示例提供了一个基础的MySQL数据库连接池实现,可以作为学习和...

Global site tag (gtag.js) - Google Analytics