2016-04-06 赵伟 数据库开发者

客户端C API

在C API中调用mysql_options()来设置mysql_init() 所创建的连接对象的属性,使用这三个选项可以设置连接超时和读写超时,单位都是秒。读写超时达到后C API的查询发送和结果获取函数会返回超时错误。

MYSQL_OPT_CONNECT_TIMEOUT

MYSQL_OPT_READ_TIMEOUT

MYSQL_OPT_WRITE_TIMEOUT

也可以使用配置文件来设置连接超时和交互超时:

connect-timeout=seconds

interactive-timeout=seconds

当客户端API在向mysql server发起连接connect-timeout秒后没有收到mysql server的相应那么认为连接失败。

interactive-timeout是用于这个客户端连接的交互超时。交互超时用于在交互界面程序(比如mysql这个连接客户端程序)中设置server的会话超时时间,来赋值给wait_timeout会话变量,它通常比较大,因为使用这个交互界面的通常是人类在手动操作,而不是程序执行和发送指令。mysql server默认使用会话变量@@wait_timeout 作为会话的超时,除非在mysql_real_connect中使用CLIENT_INTERACTIVE标志来标识这个连接是用于交互操作,此时如果客户端有interactive-timeout就使用它来作为本会话的会话超时,否则使用服务器端的interactive-timeout作为会话超时设置给wait_timeout。

MySQL Server内部

从下图中可以看出,服务器端关于超时的变量有很多,这里去掉了我们的TDSQL特有的非标准的MySQL/MariaDB的几个超时值。其中的connect_timeout, net_read_timeout, net_write_timeout,slave_net_timeout, interactive_timeout和wait_timeout与网络IO有关。

其中,connect_timeout 被用于在用户登录期间,也就是建立数据库连接期间,作为mysql server端的网络读写超时。这与文档上面的说法并不相同,但是代码中确实是这样子的。

net_read_timeout 和net_write_timeout是数据库会话创建好之后mysql server端使用的读写超时。如果读取或者写入操作在等待了达到超时后服务器认为客户端连接断开,执行错误处理。

而slave_net_timeout是slave的io线程使用客户端C API连接master时候,调用mysql_options()来设置MYSQL_OPT_CONNECT_TIMEOUT,MYSQL_OPT_READ_TIMEOUT,MYSQL_OPT_WRITE_TIMEOUT这三个超时选项使用的值。IO线程连接master使用的都是标准的客户端C API代码和通信协议。

最后,wait_timeout是mysqld server的默认的会话超时,如果一个数据库连接(会话)在这么长时间之后没有任何读写动作,那么这个连接被关闭。interactive_timeout是默认的交互式连接的会话超时,会设置给wait_timeout,如果客户端有自定义的值,那么那个值会被优先使用来设置给wait_timeout。

所有这些超时可以分为连接超时,读写超时和会话超时三类,下面就讲一下这些超时机制是如何实现的。

超时的实现方法

在Linux的connect(), recv, send, read(), write()等系统调用中,并不可以简单地阻塞等待一段指定时间后再返回错误,而是要么把文件句柄设置为非阻塞的(使用fcntl()和O_NONBLOCK标志,或者对于recv/send()可以每次调用使用MSG_DONTWAIT)并且立刻返回,要么一直阻塞等待。所以,要实现超时还是要一点小技巧的。另外,MySQL中网络IO的代码无论是客户端C API的网络IO功能还是服务器内部使用的网络通信功能,都是同一份代码实现,因此下文不需要区分客户端和服务器端。

连接超时

相关函数:vio_socket_connect(),vio_io_wait()

首先,如果有连接超时时间的话,就设置socket fd为非阻塞的,然后调用标准的socket函数connect()来发起连接,这个函数会立即返回-1并且设置errno为 EINPROGRESS或者EALREADY。然后,调用vio_io_wait()来使用poll()来阻塞等待这个连接可以写入,使用连接超时值作为poll()的超时参数。这样,在等待超时后就认为连接失败,否则连接就成功了。这里并没有使用网络协议自己的连接超时,因为那样的话无法在不影响其他进程的情况下随时灵活更改这个超时时间。

读写超时

相关函数:vio_read(), vio_write(), vio_socket_io_wait()

首先,调用标准的recv()/send()系统调用来读取或者写入,如果有读写超时时间的话,就使用MSG_DONTWAIT作为最后一个flags参数,这样如果没有数据可以读取或者无法写入(比如网络拥塞)这个函数会立刻返回SOCKET_EAGAIN 或者SOCKET_EWOULDBLOCK,于是,调用vio_socket_io_wait()来阻塞等待这个socket fd可以读或者写,这个函数主要是调用了poll(),并且用读写超时值作为poll()的等待超时时间。

会话超时

这里的会话(Session)其实就是数据库连接,在mysql内部对应于THD类。会话超时是Mysql server端才有的机制,在客户端没有。实现方法是:Mysql server内部线程定期检查所有THD会话对象的状态,将会话超时的THD对象销毁。

MySQL的各种网络IO超时的用法和实现的更多相关文章

  1. 网络IO超时的几种实现

    一.select/poll/epoll int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,str ...

  2. Lost connection to MySQL server during query,MySQL设置session,global变量及网络IO与索引

    Navicat导出百万级数据时,报错:2013 - Lost connection to MySQL server during query 网上一番搜索,修改mysql如下几处配置文件即可: sel ...

  3. 套接字IO超时设置和使用select实现超时管理

    在涉及套接字IO超时的设置上有一下3种方法: 1.调用alarm,它在指定的时期满时产生SIGALRM信号.这个方法涉及信号的处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm ...

  4. [编织消息框架][网络IO模型]BIO

    既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...

  5. 5种网络IO模型

    5种网络IO模型(有图,很清楚)   同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...

  6. libevent 网络IO分析

    libevent 网络IO分析 Table of Contents 1. 简介 2. 简单使用与入门 2.1. 定时器-timeout 超时回调 2.2. 信号事件 2.3. 读取 socket 3. ...

  7. MySQL Error Log 中IO写入瓶颈的警告分析

    周末在一台MySQL实例上频繁做大批量的写入测试,无意中发现MySQL的errorlog中频繁出现如下的Note:page_cleaner: 1000ms intended loop took *** ...

  8. 我对网络IO的理解

    Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read).写(write),socket在Linux系统被抽象为流( ...

  9. 网络 IO 工作机制

    ref: 深入分析 java web 技术内幕 2.3 两台计算机之间进行数据的传输需要经过很多步骤.首先有相互沟通的意向,然后还要有沟通的通道:通过电话还是面对面交流(物理链路).最后,两个人说话的 ...

随机推荐

  1. Django day28 频率组件,解析器

    一:频率组件: 1.频率是什么? 节流,访问控制 2. (1)内置的访问频率控制类SimpleRateThrottle (2)写一个类,继承SimpleRateThrottle class MyThr ...

  2. 自定义View(9)使用Renderscript 渲染特效。

    1.渲染脚本官网 https://developer.android.com/guide/topics/renderscript/compute 2.高斯模糊 ScriptIntrinsicBlur ...

  3. WinForm窗体项目 之 MySchool管理系统终极版

    学习WinForm窗体程序也有一段时间了,今天就来尝试着来一个项目热热身~ 在我们通常使用的MySchool管理中,不外乎这几种功能:增.删.改.查.改密码 在过去的C#中确实是挺简单的,但是在学习了 ...

  4. Linux学习(一)--基本概念

    一.Linux概述 Linux是一款全球性的免费的开源的操作系统平台,其特点是实现了多任务多用户处理,主要是依赖内核kernel shell,且占用资源少 (最小配置只要4Mb内存就能运行). 百度百 ...

  5. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  6. js 获取 鼠标位置 和获取元素位置

    ]; body.addEventListener("mousemove", outpostion); function outpostion() { console.log(&qu ...

  7. C# 字符串到字节数组,字节数组转整型

    ; , ); byte[] bytes = BitConverter.GetBytes(num);//将int32转换为字节数组 num = BitConverter.ToInt32(bytes, ) ...

  8. day02 python

    列表: : 在[ ]内,可以存放多个任意类型的值: 并以逗号隔开. 一般用于存放学生的爱好:课堂的周期等等... 例如: 定义一个学生列表,可存放多个学生 list(['钱垚', '李小龙', '张全 ...

  9. Sersync+Rsync实现数据文件实时同步

    rsync+inotify-tools与rsync+sersync架构的区别1,rsync+inotify-tools只能记录下被监听的目录发生的变化(增删改)并没有把具体变化的文件或目录记录下来在同 ...

  10. JavaScript day3(数据类型)

    数据类型(data type) JavaScript提供七种不同的数据类型(data types),它们是string(字符串), symbol(符号), number(数字), undefined( ...