在负载较重的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个连接需使用大量的资源。考虑下使用长连接或连接池吧,至少是那种大部分连接是由应用创建的情况。

转 MySQL连接超时的更多相关文章

  1. MySQL连接问题【如何解决MySQL连接超时关闭】

    --MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...

  2. 如何解决MySQL连接超时关闭

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

  3. mysql连接超时问题

    前几天使用个脚本不停的查看redis队列中的事件.如果有则把事件取出来,然后进行一些数据库操作. 后来发现,每天的第一次有事件时都会到导致,找不到数据. 后来定位到问题,是mysql在连接长时间无活动 ...

  4. mysql 连接超时的问题

    项目中用mycat做的分表分库,异步通知系统会连接mycat去查数据库数据,有时会抛异常提示mysql server has gone away.最初以为是mycat的问题,在修改了mycat的配置, ...

  5. mysql连接超时的问题

    使用Hibernate + MySQL数据库开发,链接超时问题: com.mysql.jdbc.CommunicationsException: The last packet successfull ...

  6. mysql连接超时的问题处理

    1. 内网 ts 连接mysql 有时候会连接失败, 原因是 连接超时, 当时所有服务器一起启动,抢占资源,导致连接超过10s. 现在增加一次连接机会, 增加一些日志. 2. 并且对mysql 全局参 ...

  7. mysql连接超时

    这几天在跟踪一个项目的时候,老是发现mysql连接报timeout的异常. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException ...

  8. 解决MySQL连接超时Communications link failure due to underlying exception

    最近在用一个MySQL的Java连接池的过程中,连接一晚上不释放,第二天就会造成超时的错误,查了一下原因,原来是因为MySQL默认的空闲等待时间是8个小时,一旦空闲超过8个小时,就会抛出异常.异常文本 ...

  9. mysql 连接超时解决方案: 怎样修改默认超时时间

    mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时). 在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据 ...

随机推荐

  1. python入门 20141102-1405

    那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢, 第二个缺点就是代码不能加密. Python是解释型的 不是编译型的 Python解释器-CPython 命令行: 只需要在 ...

  2. [LeetCode] #112 #113 #437 Path Sum Series

    首先要说明二叉树的问题就是用递归来做,基本没有其他方法,因为这数据结构基本只能用递归遍历,不要把事情想复杂了. #112 Path Sum 原题链接:https://leetcode.com/prob ...

  3. 20165320 第四次实验 Android开发

    实验内容: Android程序设计-1 实验要求: - 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: - 参 ...

  4. Strusts2笔记7--国际化

    国际化: 国际化是指,使程序在不做任何修改的情况下,就可以使用在不同的语言环境中.国际化在一般性项目中是不常用的.在编程中简称 i18n. 国际化是通过读取资源文件的形式实现的.资源文件的定义与注册, ...

  5. ansible批量修改linux服务器密码的playbook

    从网上找到批量修改Linux服务器root密码的playbook. 使用方法: 1.输入要修改的inventory组 2.按需要,在playbook中输入要修改的IP.新密码,如下: - hosts: ...

  6. oracle11g的冷热备份

    1.冷备份 如果数据库可以正常关闭,而且允许关闭足够长的时间,那么就可以采用冷备份(脱机备份),可以是归档冷备份,也可以是非归档冷备份.其方法是首先关闭数据库,然后备份所有的物理文件,包括数据文件.控 ...

  7. pip安装遇到问题

    安装pip之后,在cmd下输入 pip --version始终提示: Unknown option:versionDid not provide a command自己安装步骤没错,怎么想也不明白,无 ...

  8. java基础75 xpth技术(网页知识)

    1.xpth技术 1.1.xpath的作用 主要用于快速获取所需的节点对象. list<Node> selectNodes("xpath");  查询多个节点对象    ...

  9. Jquery获取radio单选按钮的value与后面的文字

    一组单选按钮如图: <input name="classId" value="8afa94f45ba3e2c1015ba3fac6c00000" type ...

  10. 洛谷P3367并查集

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...