- 浏览: 208502 次
- 性别:
- 来自: 重庆
-
文章分类
最新评论
在负载较重的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的SQL_CALC_FOUND_ROWS
2012-12-17 16:44 1435FOUND_ROWS() 函数 ,可以在调用包含LIMIT的 ... -
使用mysql的last_insert_id() 产生自增的id
2012-12-17 15:48 1128刚才查了下last_insert_id()相关资料,找到几篇不 ... -
innodb的记录锁、gap锁、next-key锁
2012-12-17 13:45 1431相关文章见: http://dev.mysql ... -
MySQL Innodb表死锁情况分析与归纳(转载)
2012-12-14 16:22 1997案例描述 在定时脚本运行过程中,发现当 ... -
mysql优化索引 —— Using filesort
2012-12-11 12:13 862用Explain分析SQL语句的时候,经常发现有的语句在 ... -
IN条件结果顺序问题
2012-11-23 14:42 714项目中需要记录用户的浏览历史,我的意见是前端直接存cook ... -
mysql那点事(行锁+not null + varchar)
2012-10-12 15:08 1716一。not null vs DEAFUL value ... -
关于mysql auto_increment所带来的锁表操作
2012-09-01 14:00 1641以前内容主要是对官方文档中的意译,并加入了一些自己的理解 ... -
mysql 与unicode
2012-08-29 15:36 1739UTF8字符集(转换Unicode表示)是存储Unico ... -
深入Mysql字符集设置
2012-08-29 14:46 59105 Jan 08 深入Mysql字符集设置 ... -
关于set names
2012-08-29 14:37 839<?php$conn=mysql_connect( ... -
MYSQL索引优化和in or替换为union all
2012-08-22 17:16 4085一个文章库,里面有两个表:category和article。c ... -
mysql读写分离(PHP类)
2012-08-18 18:08 3763自己实现了php的读写 ... -
mysql分表的3种方法
2012-08-02 14:39 867当一张的数据达到几百万时,你查询一次所花的时间会变多,如 ... -
MySql BLOB类型
2012-08-02 13:42 761MySql的Bolb四种类型 MySQL中,BLOB是一个二进 ... -
MySQL 查询优化技巧
2012-07-18 20:26 790瓶颈 众所周知,几乎所有大型项目的最终效率瓶颈,都来自 ... -
mysql多表联合查询
2012-07-18 19:16 1683我在工作中天天研究zen cart的程序,那个叫人痛苦,最近比 ...
相关推荐
nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分
MySQL 连接超时问题解决方案 wait_timeout 参数的重要性 在 MySQL 中,wait_timeout 参数是控制连接超时的关键参数。当该参数设置的太大时,可能会导致 MySQL 中大量的 SLEEP 进程无法及时释放,拖累系统性能。...
MySQL 连接超时问题解决方案 在 MySQL 中,wait_timeout 参数控制着连接的超时时间,如果设置的过大,可能会导致大量的 SLEEP 进程无法及时释放,拖累系统性能;反之,如果设置的过小,可能会遭遇到“MySQL has ...
提供一个c# socket连接池设计的例子,解决socket并发连接限制的问题,并且提供一种设置连接超时时间的方法,默认连接超时时间是不能设置的,提供了socket网络发送数据的接口.可用于pos小票打印机通讯。
MySQL数据库在设计时为了优化资源使用和安全性,设置了一些连接超时机制。当数据库客户端与服务器之间的连接在一定时间内无任何交互(即空闲),MySQL会自动关闭这个连接以释放系统资源。通常,默认的`wait_timeout`...
- 连接超时:可能需要调整MySQL服务器的wait_timeout参数,或者在Java代码中设置合理的连接超时时间。 - 认证失败:检查用户名、密码及数据库名称是否正确,以及MySQL服务器的权限设置。 - 网络问题:确保Java应用...
可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分
开始受到“Communications link failure”和“连接超时”等信息的误导,一直将问题定位在“MySQL 连接超时时间”Timeout 参数上,该参数默认为 8 小时,并且一直认为问题就出在 “MySQL”上,甚至于要大动干戈的将 ...
MySQL数据库的连接超时问题,通常表现为Wait_timeout错误,指的是当客户端与服务器之间的连接在指定时间内没有进行任何数据交互,数据库会自动断开这个连接,以释放资源并防止不必要的资源占用。这一特性在MySQL中是...
可以根据应用需求调整连接池的参数,如最大连接数、空闲超时时间等。这些参数可以通过`UseMySql`方法中的`mySqlOptions`进行设置。 7. 性能优化 连接池可以减少创建和关闭连接的开销,提高系统性能。但过多的空闲...
MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...
1. 如何解决 MySQL 连接超时的问题? 可以通过设置 max_connections 的值来增加连接数,或者尝试使用连接池来解决连接超时的问题。 2. 如何解决 MySQL 数据库文件损坏的问题? 可以通过使用 mysqlcheck 工具来...
MySQL连接池在Java应用开发中扮演着至关重要的角色,它是一种管理数据库连接的机制,能够有效地提高数据库操作的性能和效率。在这个项目中,我们看到的是一个纯手工编写的Java源码实现,不依赖任何外部数据库驱动,...
4. **MySQL连接超时** - 在与MySQL交互时,可以使用`PDO`或`mysqli`的连接选项来设置超时,如`PDO::ATTR_TIMEOUT`和`mysqli_connect_timeout`。 5. **Memcached超时** - 在使用Memcached扩展时,可以设置`...
另外,若MySQL数据库负载过高,这也可能引起连接超时。但由于缺乏MySQL监控数据,无法准确判断是否为数据库负载引起的问题。在这种情况下,建议加强数据库的监控,以便更准确地评估数据库的工作状况。 为了从源头...
Keepalive的主要功能是防止因网络问题或长时间无数据交换导致的MySQL连接超时关闭。这对于那些需要保持持久连接的应用,比如Web服务器与数据库之间的连接,是非常有用的。 Keepalived本身通常被关联到LVS(Linux ...
mysql5将其连接的等待时间(wait_timeout)缺省为8小时。怎么不让它超时呢
2. 通过`mysql`命令行工具连接到MySQL服务器,用`show processlist`命令获取当前所有进程的信息,并使用`grep`过滤出状态为“Locked”的进程,将其输出到临时文件`file_tmp`。 3. 使用`awk`命令从临时文件中提取每...
- 超时策略:设置超时机制,避免因长时间未使用的连接占用资源。 - 监控和日志:监控连接池的使用情况,记录异常,便于调试和优化。 总的来说,这个代码示例提供了一个基础的MySQL数据库连接池实现,可以作为学习和...