在负载较重的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. Unix/Linux系统时间函数API

    首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...

  2. mysql取字段名注意事项!!!!千万不能和关键字同名

    今天就碰到一个恶心的问题,更新时update sql语句报错,查了半天感觉没问题啊,后来一行一行定位,终于找到原因了, 原来是有个字段是show,和mysql关键字冲突了,坑爹! 改了个名字就好了,或 ...

  3. 【网页开发学习】Coursera课程《面向 Web 开发者的 HTML、CSS 与 Javascript》Week1课堂笔记

    Coursera课程<面向 Web 开发者的 HTML.CSS 与 Javascript> Johns Hopkins University Yaakov Chaikin Week1 In ...

  4. 为什么使用do{}while(0)来进行宏定义

    最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因:   1,空的宏定义避 ...

  5. 搭建本地git服务器

    最近因为项目需求,需要实现一个原型系统,加上后期项目需要多人协作,考虑采用了git做版本控制. 这里主要简要描述下git服务器和客户端的搭建和配置. 1.git服务器 (1)安装git sudo ap ...

  6. asp.net 获取音视频时长 的方法

    http://www.evernote.com/l/AHPMEDnEd65A7ot_DbEP4C47QsPDYLhYdYg/ 日志:   1.第一种方法:   调用:shell32.dll ,win7 ...

  7. 认识我们的太阳系(Solar System)

    一.初识太阳系 如果太阳是一颗篮球,那么我们的地球是什么?? 如果太阳系里最大的行星:木星是一颗足球,那么我们的地球是什么?? 如果我们的地球是一颗排球,那么其他行星是什么?? 由此,我们可以看到,我 ...

  8. 在虚拟机(vmware)上安装CentOS

    第一步是安装虚拟机,这个比较简单就不讲了. 第二步准备CentOS的镜像文件准备安装 第三步安装CentOS: 新建虚拟机 选择自定义配置 选择硬件兼容标准 选择是否让vmware安装操作系统 选择将 ...

  9. vue+vuex+axios+echarts画一个动态更新的中国地图

    一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china- ...

  10. elasticsearch5.5

    1.不能以root用户运行 groupadd es          #增加es组 useradd es -g es -p pwd          #增加es用户并附加到es组 chown -R e ...