在负载较重的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. 洛谷 P3835: 【模板】可持久化平衡树

    题目传送门:洛谷P3835. 题意简述: 题面说的很清楚了. 题解: 考虑建立一棵每个节点都表示一个版本的树. 以初始版本 \(0\) 为根.对于第 \(i\) 个操作,从 \(v_i\) 向 \(i ...

  2. Linux 多线程编程—使用条件变量实现循环打印

    编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 使用条件变量来实现: #inc ...

  3. OSGiBundle出现 Could not find bundle: org.eclipse.equinox.console的解决方案

    按照网上教程创建OSGI HelloWorld实例配置run configuration时出现Could not find bundle: org.eclipse.equinox.console 和C ...

  4. 洛谷P3366最小生成树

    传送门啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...

  5. 5 个非常有用的 Laravel Blade 指令,你用过哪些?

    接下来我将带大家认识下五个 Laravel Blade 指令,这些指令将让你在解决特定问题时如虎添翼.如果你是刚接触 Laravel 的用户,这些小技巧能带你认识到 Laravel Blade 模板引 ...

  6. kafka基本版与kafka acl版性能对比(单机版)

    一.场景 线上已经有kafka集群,服务运行稳定.但是因为产品升级,需要对kakfa做安全测试,也就是权限验证. 但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀! 因此,本文就此来做一下对 ...

  7. MySQL学习笔记:repeat、loop循环

    一.repeat循环 # ---- repeat ---- DELIMITER $$ CREATE PROCEDURE test_repeat() BEGIN ; REPEAT ; UNTIL a E ...

  8. hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)

    给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...

  9. HBase(六)HBase整合Hive,数据的备份与MR操作HBase

    一.数据的备份与恢复 1. 备份 停止 HBase 服务后,使用 distcp 命令运行 MapReduce 任务进行备份,将数据备份到另一个地方,可以是同一个集群,也可以是专用的备份集群. 即,把数 ...

  10. Hive SQL综合案例

    一 Hive SQL练习之影评案例 案例说明 现有如此三份数据:1.users.dat 数据格式为: 2::M::56::16::70072, 共有6040条数据对应字段为:UserID BigInt ...